一.什么是Docker
Docker容器是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器 上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。
二 .Docker的用途
1)快速交付你的应用程序
Docker可以为你的开发过程提供完美的帮助。Docker允许开发者在本地包含了应用程序和服务的容器进行开发,之后可以集成到连续的一体化和部署工作流中。
举个例子,开发者们在本地编写代码并且使用Docker和同事分享其开发栈。当开发者们准备好了之后,他们可以将代码和开发栈推送到测试环境中,在该环境进行一切所需要的测试。从测试环境中,你可以将Docker镜像推送到服务器上进行部署。
2)开发和拓展更加简单
Docker的以容器为基础的平台允许高度可移植的工作。Docker容器可以在开发者机器上运行,也可以在实体或者虚拟机上运行,也可以在云平台上运行。
Docker的可移植、轻量特性同样让动态地管理负载更加简单。你可以用Docker快速地增加应用规模或者关闭应用程序和服务。Docker的快速意味着变动几乎实时是的。
3)达到高密度和更多负载
Docker轻巧快速,它提供了一个可行的、符合成本效益的替代基于虚拟机管理程序的虚拟机。这在高密度的环境下尤其有用。例如,构建你自己的云平台或者PaaS,在中小的部署环境下同样可以获取到更多的资源性能。
三.Docker的部署与安装在7.3的主机做,依赖性较小
1.安装docker和相关依赖性:
yum install docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm
docker-engine-selinux-17.03.1.ce-1.el7.centos.noarch.rpm
systemctl status docker ##查看docker的状态
systemctl start docker
docker version ##查看docker的版本
docker info ##docker宿主机的信息
###在安装好docker之后,linux系统会为docker容器分配一个ip,利用ip addr中查看docker0ip
docker images ###查看容器里面的镜像
###现有的镜像的导入和容器的使用
1040 docker load -i game2048.tar
1041 docker load -i ubuntu.tar
1042 docker load -i rhel7.tar ##仓库中加载镜像
1043 docker images ##查看导入的镜像
1044 docker run -d --name vm1 game2048 ##-d 打入后台,--name 起名字
1045 docker ps ##显示正在运行的进程
1046 docker ps -a ##显示所有存在的进程
1047 docker inspect vm1 ##查看主机vm1的ip
1049 brctl show ###可以看见他为容器增加了一个桥接
###取浏览器里面访问:http://172.17.0.2 可以看见游戏,一定要访问游戏的ip,ip可由docker inspect vm1 得知
1053 docker history game2048:latest #可以知道做过了那些
1054 docker images ##docker内部的镜像有哪些
1055 docker run -it --name vm2 ubuntu ##-it为交互式登陆,本身他支持交互式登陆,所以她就不用再命令后面加bash了,如果不支持,则需要加bash,进行交互式登陆
docker history ubuntu:latest ##查看他做过的历史
1059 docker history rhel7:latest ###因为我们什么都没有做,所以比显示
1060 docker ps ##此时应该有两个进程在跑,
1071 docker run -it --name vm2 ubuntu
ip addr ##我们发现系统分配的ip是逐渐递增的
touch file{1..9}
##然后我们正常退出后,ctrl+pq
docker attach vm2
ls ##发现我们建立的文件还在
##然后我们异常退出后,ctrl+d
docker start vm2
docker attach vm2
ls ##发现我们建立的文件还在
1072 docker history ubuntu:latest
1073 docker ps
1074 docker attach vm2
touch file{1..10}
1075 docker commit vm2 ubuntu:v1 #将vm2封装成一个镜像,然后进行提交
docker history ubuntu:v1
1077 docker images ##可以看见提交的镜像
1079 docker rmi ubuntu:v1 ##可以看见他是分层提交的,我们刚才建立的文件在读写层的最上面,当底下层一模一样的时候,docker不会再次建立,而会重复利用,当我们删除时,发现底层有人用,那我们就值删除只属于他自己的东西,共有的东西不动
1081 docker images ##发现我们建立的镜像不见了,原来的镜像还在
1089 docker ps ##看vm2有没有在开
1090 docker cp /etc/passwd vm2:/tmp ##cp文件到容器里面
1091 docker attach vm2
cd /tmp
ls ##显示有没有passwd这个文件
1096 docker exec vm2 rm /tmp/passwd ##不用进容器里面,直接在外面就可以看有没有passwd这个文件
1097 docker exec vm2 ls /tmp/passwd ###因为已经删除了。在外面直接看,就没有了
1098 docker attach vm2
cd /tmp
ls ##显示文件有没有
1103 docker logs vm2 ##查看vm2做过的步骤
1110 docker run -d --name vm1 -p 8080:80 game2048 ##端口影射
1111 iptables -t nat -nL ##可以看见他内部端口的影射
1115 docker port vm1 ##也可以看见端口影射
1117 docker top vm1 ###可以看见动态信息
进入浏览器:http://172,25,17.250:8080 #端口映射,通过访问物理机的8080端口就可以访问172.17.0.2的游戏界面
###注册阿里云
产品服务,镜像容器服务,镜像加速器,CentOs ,复制配置文件
1119 vim /etc/docker/daemon.json
##粘贴复制的内容
1120 systemctl daemon-reload #重新加载
1121 systemctl restart docker
1122 systemctl status docker
1123 docker search nginx ##从阿里云搜索nginx镜像
1124 docker pull nginx ##从阿里云拉取镜像下来
1127 docker ps -a
docker container prune ##移除所有停止的镜像,等加与docker rm `docker ps -aq`
1129 docker ps -a ##都没有了
1130 docker run -d --name vm1 -p 8080:80 nginx
##取浏览器http://172.25.17.250:8080 ##发现登陆到了nginx界面
1131 docker history nginx:latest
1133 mkdir /tmp/docker/
1134 vim /tmp/docker/index.html
写入wb
1135 docker cp /tmp/docker/index.html vm1:/usr/share/nginx/html ##将写的文件放到容器nginx的目录下
##取浏览器http://172.25.17.250:8080 ##发现登陆到了nginx界面,为wb
1141 mkdir /tmp/docker/website
mv /tmp/docker/index.html /tmp/docker/website
1142 docker run -d --name vm1 -p 8080:80 -v /tmp/docker/website/:/usr/share/nginx/html nginx ##-v 挂在
##取浏览器http://172.25.17.250:8080 ##发现登陆到了nginx界面wb
1143 docker ps ###发现端口链接
docker port vm1 ##端口列出
1161 docker run -it --name vm2 ubuntu ##是以桥接的方式链接的
ping baidu.com ##可以ping同
ping 172.25.17.250 #也可以ping通
iptables -t nat -nL ##可以看见ip出口,记得在此过程中,不要重启网络,重启网络之后,可能ping不同外网cd /tmp/docker
vim dvd.repo
[dvd]
name=rhel7.3
baseurl=http://172.25.17.250/rhel7.3
gpgcheck=0
docker run -it --name vm2 -v /tmp/docker/dvd.repo:/etc/yum.repos.d/dvd.repo:ro -v /tmp/docker/data1:/data1 -v /tmp/docker/data2:/data2 rhel7 bash
df #看的不够清晰
cd /data1 ##即使没有data2,也可以进去目录看
mount ##可以看的更加清析
uname -r #查看内核
cd /data1
touch file1
cd ..
cd /data2
touch file2
##另外开一个终端,
cd /tmp/docker
ls ##有data1和data2这个目录,进去data1和data2里面看,有文件,挂在表示容器和物理机同步,当在物理机删除文件时,容器里面的文件也会不再
##在容器里面做
cd /etc/yum.repos.d/
rm -fr dvd.repo ##发现删除不掉,因为我问让他只读挂载
yum install -y httpd net-tools ##但是我们可以下载东西
netstst -antlupe
cd /var/www/html/
echo wb > index.html
sbin/httpd ##开启这个服务
###我们在外面做
docker inspect vm2
ping vm2的ip ##物理机能ping通容器
curl vm2的ip ##我们看到的时httpd的首页内容
docker rm -f vm2
docker create --name datavol -v /tmp/docker/dvd.repo:/etc/yum.repos.d/dvd.repo:ro -v /tmp/docker/data1:/data1:ro -v /tmp/docker/data2:/data2 rhel7 bash ##创建逻辑卷组
docker ps -a ##可以显示我们刚才创建的
docker run -it --volumes-from datavol rhel7 bash
cd data1
rm -fr file1 ##我门发现删除不了,因为我们让他只读挂在
ip addr ##我们看见物理机给容器分了一个ip
brctl show ##我们此时看见docker0并没有桥接
docker run -d nginx
brctl show ##我们看见桥接了一个
docker run -it --name vm1 ubuntu
ping 172.17.0.2 ##可以ping通nginx的id
ip addr ###可以看见物理机给他分配的id号是递增的
brctl show ##物理机中做,发现桥接多了一个
docker network ls ##列出docker网络的工作方式,有bridge,host,null,container这四种形式,下面分别介绍,默认采用桥接的方式
docker attach vm1 ##链接vm1
ip addr ##可以看见他的ip
docker inspect vm1 | grep Pid ##过略出Pid
cd /proc/Pid号/ns
ll 我们发现他是以net模式进行链接的
docker run -it --name vm2 --net host ubuntu ##以host的方式进行连接,host相当于和物理机共有一个ip
ip addr ##发现他和物理机列出的ip一模一样
brctl show ##我们发现一共开启了三个容器,但是只有两个桥接
docker run -it --name vm3 --net container:vm1 ubuntu ##自定义的方式设置ip 我们设置的和vm1设置的一样
ip addr ##和vm1的ip应该是一样的
docker run -it --name vm4 --net none ubuntu ##采用无模式
ip addr ####此时应该没有ip
###退出来在物理机中做
ip netns add test ##我门增加了网络的工作方式
ip netns list
cd /var/run/netns
ls ##有我们刚才设置的方式
ip netns del test ##删除
ls #发现没有了
docker inspect vm4 | grep Pid
cd /proc/Pid号/ns
ln -s /proc/Pid号/ns/net /var/run/netns/Pid号 ##将ip号连接
ip netns list ##列出网络号
ip link add name veth0 type veth peer name veth1##我们增加一个网络对,物理机桥接veth0,容器桥接veth1,这样可以使两方进行联系
ip addr ##可以看加有么有增加上,但是他是down,我们让他up
ip link set up veth1
ip link set up veth0
ip addr
brctl addif docker0 veth0
brctl show ##我们可以看见veth0在桥接上
ip netns list ##出现一个ip号
ip link set veth1 netns ip号
docker attach vm4
ip addr ##我们发现增加了一个网卡veth1,但是他是down的
ip addr add 172.17.0.100/24 dev veth1 ##我们发现增加ip被拒绝了
ip netns exec ip号 ip link set veth1 name eth0 ##我们给网卡改了名字
ip netns exec ip号 ip link set up eth0 ##首先将网卡up
ip netns exec ip号 ip addr add 172.17.0.100/24 dev eth0 ##增加ip
docker attach vm4
ip addr ##我们发现多了ip
ping 172.17.0.1
ping 172.25.17.250 ##ping外网发现ping不同,因为我门没有加网关
route -n
ip netns exec ip号 ip route add default via 172.17.0.1
ping 172.25.17.250 ##可以ping通
ping www.baidu.com ##也能ping通
####删除ip不被允许
docker rm -f vm4
docker rm -f vm3
docker attach vm2
ip addr del 172.27.0.3/16 dev eth0 #被拒绝
docker inspect -f {{.HostConfig.Privileged}} vm2 ##我们发现是false,不允许我们修改ip
docker rm -f vm2 #删除vm2,重现建立可以修改ip的vm2
docker run -it --name vm2 --privileged=true ubuntu
ip addr
ip addr del 172.17.0.4/16 dev eth0 #可以删除
docker run -d --name vm3 nginx
docker run -it --name vm4 --link vm3:nginx ubuntu ##将vm3和vm4连接起来,将两个仓库连接起来
ping vm3/nginx
ping 172.17.0.3 ##都可以ping通
ping vm2 #ping不同,因为没有将他们连接在一起,但是ping ip能ping通
cat /etc/hosts ##系统自动将他们连接在一起
###cgroup用来限制资源配额
mount -t cgroup
cd /sys/fs/cgroup
cd cpu
cat cpu.rt_period_us ##表示让cpu跑满
cat cpu.cfs_quota_us ##-1表示不限制
top ##查看cpu的动态信息
dd if=/dev/zero of=/dev/null &
top ##发现cpu跑满了
killall dd ##cpu又恢复正常了
cgcreate -g cpu:x1 ##相当于在在/sys/fs/cgroup/cpu下面建立一个x1,cgdelete -g cpu:x1 相当于在/sys/fs/cgroup/cpu删除目录
cd x1
ls ##里面的内容和上层的内容没有什么区别
echo 10000 > cpu.cfs_quota_us ##我们也可以利用命令进行设置 cgset -r cpu.cfs_quota_us=10000 x1
cgget -g cpu:x1 ##我们让他跑了10%
dd if=/dev/zero of=/dev/null &
top #查看dd的ip号
echo dd的ip号 > tasks
top ##我们发现他基本cpu就在10%左右跑,说明设置成功
cgdelete -g cpu:x1 ##删除我们设置的
top ##发现他又是满格跑
killall add
###对于容器的限定
docker rm -f `docker ps -aq`
docker run -d --name vm1 nginx
cd /sys/fs/cgroup/cpu/docker
ls ##发现一个很长的pid号码
cd 很长的pid号码
cat cpu.cfs_quota_us
cat cpu.cfs_period_us
docker inspect vm1 ##得到他的ip
##在浏览器里面访问 http://172.17.0.2/ 可以访问到nginx页面
ab -c 100 -n 100000 http://172.17.0.2/index.html
top ##看到压侧跑满格
docker run -d --name vm2 --cpu-quota 10000 nginx
cd /sys/fs/cgroup/cpu/docker/
cd ##刚才有限制的ip号
cat cpu.cfs_quota_us ##观看我们所设置的
docker inspect vm2
ab -c 100 -n 100000 http://172.17.0.3/index.html ##对有设置的进行压侧
top ##可以看见他限制在10%左右
####对于企业六怎么进行设置呢
开启一个企业六的虚拟机
yum install libcgroup -y
cat /etc/cgrules.conf
/etc/init.d/cgconfig start
cd /cgroup/memory/
cat memory.limit_in.bytes
cgcreate -g memory:x1
cd x1 ##此时如果我们reboot的话,刚才建立的东西就没有了,reboot之后,记得一定要重启服务,否则进入/cgroup/memory里面啥都不显示/etc/init.d/cgconfig start ,要想重启之后还能有自己建立的文件,必须在配置文件里面加
vim /etc/cgconfig.conf
##在最后加入
group x1 {
memory {
memory.limit_in_bytes = 209715200;
}
}
/etc/init.d/cgconfig restart ##记得一定要退出/cgroup/memory这个目录重启,否则会报错
cd /cgroup/memory/
ls x1 #有x1显示
cd x1
cat memory.limit_in_bytes ##应该是自己在文件中设置的
df ##查看挂在
cd /dev/shm
free -m ##可以看到空闲的,和缓存的内存
cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=100
ls ##有bigfile这个文件
free -m #发现占据了100M
cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=200
free -m ##发现占据了200M
cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=300
free -m ##我们发现还能加,但是我们给他进行了设置,为什么还能加呢,是因为他给交换区加了,所以我门应该同时控制内存和交换区
cd /cgroup/memory/
cat memory.memsw.limit_in_bytes
vim /etc/cgconfig.conf
group x1 {
memory {
memory.limit_in_bytes = 209715200;
memory.memsw.limit_in_bytes = 209715200;
}
}
/etc/init.d/cgconfig restart
cd /dev/shm ##必须在这个目录下进行设置,因为他才占据内存的一半
cgexec -g memory:x1 dd if=/dev/zero of=bigfile bs=1M count=300 ##发现建立不了了
free -m
useradd wb
su - wubain
###得到两个网业 memapp1 memapp2
chmod +x memapp1 memapp2 ##在root用户下做,然后把他移动到普通用户下
yum provides -y */ld-linux.so.2
su - wb
./memapp1
./memapp2
free -m
cd /dev/shm ##在root用户下做
rm -fr bigfile
vim /etc/cgconfig.conf
##将数据改为20480000;
/etc/init.d/cgconfig restrat
su - wb
./memapp1
./memapp2 ##发现他还能做
vim /etc/cgrules.conf
##在末尾加
wb:memapp1 memory x1/ ###在root用户下做
wb:memapp2 memory x1/
/etc/init.d/cgred start
su - wb
./memapp1
./memapp2 #发现他被限制了
####自己搭建镜像
systemctl start docker
systemctl status docker
docker images ##查看自己仓库里面的镜像
docker ps -a #查看自己建立的仓库有哪些
docker container prune ##移除所有停掉的容器,注意是停掉的
cd /tmp/docker
ls
rm -fr data1/ data2/
vim Dockerfile
FROM rhel7 ##自己搭建镜像的基础是rhel7
ENV HOSTNAME server1 ##给服务器起名字
EXPOSE 80 ##暴露的端口为80
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y httpd && yum clean all
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
docker build -t rhel7:v1 .
docker images ##我们发现自己封装的镜像在里面
docker run -d --name vm1 rhel7:v1
docker inspect vm1 ##查看vm1的详细信息
curl 172.17.0.2 ##因为vm1下载了httpd,所以我门可以看见httpd的首页
docker rm -f vm1
###源码编译nginx
首先把nginx的源码包考到/tmp/docker下面
vim Dockerfile
FROM rhel7
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/dvd.repo
ADD nginx-1.14.0.tar.gz /mnt
RUN rpmdb --rebuilddb
RUN yum install -y gcc pcre-devel zlib-devel make
RUN yum clean all
WORKDIR /mnt/nginx-1.14.0
RUN ./configure --prefix=/usr/local/nginx --with-threads --with-file-aio --with-http_stub_status_module
RUN make
RUN make install
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
docker build -t rhel7:v2 . ##搭建一个rhel7的v2镜像
docker run -d --name vm1 rhel7:v2
docker run -d --name vm1 rhel7:v2 /usr/local/nginx/sbin/nginx -g "daemon off;" ##这条命令将会覆盖文件写的CMD命令
docker inspect vm2
curl 172.17.0.3 ##可以看见nginx的首页
###可以对他进行瘦身,比如说,缩小层,从别的地方考包,减小base,抽取的动态数据库就可以了
缩小层
vim Dockerfile
FROM rhel7
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/dvd.repo
ADD nginx-1.14.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.14.0
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && yum clean all && sed 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx --with-threads --with-file-aio --with-http_stub_status_module && make && make install && cd .. && rm -fr nginx-1.14.0
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
docker build -t rhel7:v3 .
docker history rhel7:v3
docker images rhel7 ##查看大小
docker run -d --name vm1 rhel7:v3
docker run -d --name vm1 rhel7:v3 /usr/local/nginx/sbin/nginx -g "daemon off;" ##这条命令将会覆盖文件写的CMD命令
docker inspect vm3
curl 172.17.0.3 ##可以看见nginx的页
##进一步的瘦身 ,抽取安装包
vim Dockerfile
FROM rhel7 as build
COPY dvd.repo /etc/yum.repos.d/dvd.repo
ADD nginx-1.14.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.14.0
RUN rpmdb --rebuilddb && yum install -y gcc pcre-devel zlib-devel make && yum clean all && sed 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx --with-threads --with-file-aio --with-http_stub_status_module && make && make install && cd .. && rm -fr nginx-1.14.0
FROM rhel7
EXPOSE 80
COPY --from=build /usr/local/nginx /usr/local/nginx
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
docker build -t rhel7:v4 .
docker history rhel7:v4
docker images rhel7
docker run -it --name vm2 rhel7:v4 bash
cd /usr/local/nginx/sbin/
docker rm -f vm2
docker run -d --name vm2 rhel7:v4 ##必须把他打入后台才能看见nginx的页面
docker ps
docker inspect vm2
curl 172.17.0.3 ##可以看见nginx的页面就行
docker run -it --name vm3 rhel7:v4 bash
ldd /usr/local/nginx/sbin/nginx ##显示的都是抽取的安装包
##抽取base
###得到一个distroless.tar 的包
docker load -i distroless.tar ##把他放在仓库里面
docker images ##这相当于一个base
cd /tmp/docker
mkdir test
cd test
vim Dockerfile
FROM nginx as base
# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
ARG Asia/Shanghai
RUN mkdir -p /opt/var/cache/nginx && \
cp -a --parents /usr/lib/nginx /opt && \
cp -a --parents /usr/share/nginx /opt && \
cp -a --parents /var/log/nginx /opt && \
cp -aL --parents /var/run /opt && \
cp -a --parents /etc/nginx /opt && \
cp -a --parents /etc/passwd /opt && \
cp -a --parents /etc/group /opt && \
cp -a --parents /usr/sbin/nginx /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libc.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libdl.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libpthread.so.* /opt && \
cp -a --parents /lib/x86_64-linux-gnu/libcrypt.so.* /opt && \
cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \
cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \
cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtime
FROM gcr.io/distroless/base
COPY --from=base /opt /
EXPOSE 80
ENTRYPOINT ["nginx", "-g", "daemon off;"]
docker build -t nginx:v1 .
docker images nginx
docker run -d --name vm4 nginx:v1
docker ps ##每定制一个镜像,都要测试一下他能不能跑,否则不知道自己定制的好坏
docker inspect vm4
curl 172.17.0.2 ##能看见首页
###得到一个仓库的镜像,registry
docker load -i registry.tar ##将仓库镜像加入到仓库里面
docker images
docker run -d --name registry -p 5000:5000 -v /tmp/docker/registry:/var/lib/registry registry:2.3.1
docker ps
docker tag nginx:v1 localhost:5000/nginx:v1
docker images ##发现镜像多了一个
docker push localhost:5000/nginx:v1 ##我们采用本地推送,不走ip/http协议,
cd /tmp/docker/registry/
ls ##有docker显示
cd docker
ls ##显示registry
tree . ##可以看见他的结构图
###现在我们采用走http协议,不走https协议
docker tag rhel7 172.25.17.250:5000/rhel7
docker images
docker push 172.25.17.250:5000/rhel7 ##我们发现push不上去,所以我们要采用http模式进行push
cd /etc/docker
vim daemon.json
{
"registry-mirrors": ["https://0qvjftbh.mirror.aliyuncs.com"],
"insecure-registries" : ["172.25.17.250:5000"]
}
systemctl restart docker ##重启docker之后,所有的docker仓库都会掉线,所以我们要开启他们
docker ps
docker start registry
docker push 172.25.17.250:5000/rhel7
docker inspect registry
###用https加密的方式传送
cd /tmp/docker
mkdir certs
openssl req \
-newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
-x509 -days 365 -out certs/domain.crt (((cn,shaanxi,xi'an,westos,linux,westos.org,root@localhost)))
##记得一定要做解析
ls certs/ ##有两把钥匙
vim /etc/hosts
172.25.17.250 westos.org
ping westos.org ##可以ping通
docker ps
docker rm -f registry ##删除仓库
docker run -d --name registry -v `pwd`/certs:/certs -v /tmp/docker/registry:/var/lib/registry -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key -p 443:443 registry:2.3.1
netstat -antlupe | grep :443
docker tag ubuntu:latest westos.org/ubuntu
iptables -t nat -nL
cd /etc/docker
mkdir certs.d
cd certs.d
mkdir westos.org
cd westos.org
cp /tmp/docker/certs/domain.crt ca.crt
docker push westos.org/ubuntu #推送成功
###验证登陆
cd /tmp/docker
mkdir auth
docker run --rm --entrypoint htpasswd registry:2.3.1 -Bbn admin westos > auth/htpasswd ##用户名为admin ,密码为westos
cat auth/htpasswd
docker run --rm --entrypoint htpasswd registry:2.3.1 -Bbn wb westos >> auth/htpasswd ##用户名为admin ,密码为westos
cat auth/htpasswd
docker ps -a
docker rm -f registry
docker run -d --name registry -v `pwd`/certs:/certs -v /tmp/docker/registry:/var/lib/registry -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key -v `pwd`/auth:/auth -e REGISTRY_AUTH=htpasswd -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -p 443:443 registry:2.3.1
docker ps
docker tag game2048:latest westos.org/game2048
docker login westos.org ##登陆
docker push westos.org/game2048
cd
cd .docker
ls
cat config.json ##其实密码和用户名都在这里面
#####docker的集群
docker load -i haproxy.tar
docker images haproxy
得到一个docker-compose-linux-x86_64-1.22.0
cp docker-compose-linux-x86_64-1.22.0 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
which docker-compose
cd /tmp/docker
ls
mkdir compose
cd compose
vim docker-compose.yml
web1:
image: nginx
expose:
- 80
web2:
image: nginx
expose:
- 80
haproxy:
image: haproxy
volumes:
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
links:
- web1
- web2
ports:
- "80:80"
expose:
- 80
mkdir haproxy
cd haproxy
vim haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
stats uri /status
frontend balancer
bind 0.0.0.0:80
default_backend web_backends
backend web_backends
balance roundrobin
server a web1:80 check
server b web2:80 check
cd ..
pwd ##此时的路径在/tmp/docker/compose
docker-compose up
###另外开一个终端
首先在浏览器访问 http://172.25.17.250
http://172.25.17.250/status docker ps ##可以看见集群的所有组成
cd /tmp/docker/website
vim index.html ##g改内容wb1
docker cp index.html compose_web1_1:/usr/share/nginx/html
vim index.html ##g改内容wb2
docker cp index.html compose_web2_1:/usr/share/nginx/html
首先在浏览器访问http://172.25.17.250 发现轮询了
###集群停止命令 docker-compose stop #集群的开始和停止都要在/tmp/docker/compose路径下,否则会报错