赞
踩
DOCKER技术在推出后掀起了一阵容器化技术的热潮,容器化使得服务的部署变得极其简易,这为微服务和分布式计算提供了很大的便利。
为了把容器化技术的优点发挥到极致,docker公司先后推出了三大技术:docker-machine,docker-compose,docker-swarm,可以说是几乎实现了容器化技术中所有可能需要的底层技术手段。
doceker-machine是在解决docker运行环境的问题
docker-compose是在解决容器编排的问题
docker-swarm是解决多主机多个容器的部署调度的问题
Docker Machine是一个简化安装Docker环境的工具,主要作用是创建和管理docker主机。一般公司云服务器毕竟少,个人觉得Docker Machine在实际使用中用处不大。直接在云服务器上安装即可。
我们需要docker-machine-Linux-x86_64-0.16.1安装包:
链接: docker-machine 提取码: 6itu
因为是二进制文件,所以需要增加执行权限
[root@server1 ~]# mv docker-machine-Linux-x86_64-0.16.1 /usr/local/bin/docker-machine
[root@server1 ~]# chmod +x /usr/local/bin/docker-machine
在真机上,我们需要下载get-docker脚本到http发布目录下
cd /var/www/html
wget https://get.docker.com/
mv index.html get-docker.sh
我们需要修改一下get-docker.sh文件
yum_repo="http://172.25.0.250/docker-ce.repo"
has_rootless_extras="0"
我们需要准备一台虚拟机server3
将server1,server3做免密i处理:
[root@server1 ~]# ssh-keygen
[root@server1 ~]# ssh-copy-id server3:
[root@server1 ~]# docker-machine create --driver generic --engine-install-url "http://172.25.0.250/get-docker.sh" --generic-ip-address=172.25.0.3 server3
这个时候我们到server3上查看存ps ax
可以看到在server3上以及开始执行动作了!
如下图正在执行安装docker-ce
在server1上查看docker-machine的进程
能够看到运行在server3上!
我们可以在隐藏目录docker下看到在server3下生成的文件:
cd .docker/
cd machine/machines/server3
ls
接着给server2也安装docker
先做免密,再执行脚本进行安装!
ssh-keygen
ssh-copy-id server2
docker-machine create --driver generic --engine-install-url "http://172.25.0.250/get-docker.sh" --generic-ip-address=172.25.0.2 server2
再一次列出所有docker-machine的操作进程
server2,3都在运行了!
docker-machine ls
完成之后,我们可以使用docker-machine来控制server2,3
我们可以停掉,重启,查看状态server2
docker-machine stop server2
docker-machine restart server2
docker-machine status server2
docker-machine config server2
docker-machine env server3
显示访问server3所需的环境变量,最后一行就是控制server3的方式
当控制server2,3之后docker images看到的是被控制的容器的镜像!
但是有个问题在于显示的不明显,不确定自己是在哪个容器里?
eval $(docker-machine env server3)
docker ps
docker images
eval $(docker-machine env server2)
docker images
env
我们来优化它!
将下面几个组件放置这个目录下
链接: .bash文件 提取码: gi5f
[root@server1 ~]# cd /etc/bash_completion.d
mget *.bash
修改环境变量使得,切换到其他的容器之后,可以有效果!
[root@server1 ~]# vim .bashrc
PS1='[\u@\h \W$(__docker_machine_ps1)]\$ '
退出当前shell,重新登陆即可生效
我们可以看到如下图,很明显的效果,很清楚的直到当前在哪个容器中!
[root@server1 ~]# docker-machine env server3
[root@server1 ~]# eval $(docker-machine env server2)
这个和下面要介绍的docker-swarm用处较大,compose是服务编排,即事先安排好服务的启动,依赖,创建服务的数量等等。
主要作用在于服务的安排和部署上。dcoker-compose技术,就是通过一个.yml配置文件,将所有的容器的部署方法、文件映射、容器连接等等一系列的配置写在一个配置文件里。便利了复杂的多服务的部署。
因为我们需要直接使用docker-compose指令来操作,所以需要在系统的/usr/local/bin目录下有compose的二进制文件!
因为用户在命令行输入命令后,系统会在环境变量$PATH内找命令。
cd /usr/local/bin
ls
docker-compose 在这即可!
家目录下创建项目目录,编写主配置文件,docker-compose在up的时候会自动读取
mkdir compose
cd compose
vim docker-compose.yml
内容如下:
version: "3.8" services: web1: image: nginx networks: - webnet lumes: - ./web1:/usr/share/nginx/html #挂载数据卷为nginx默认发布文件 web2: image: nginx networks: - webnet lumes: - ./web2:/usr/share/nginx/html #挂载数据卷为nginx默认发布文件 haproxy: image: haproxy networks: - webnet volumes: - ./haproxy:/usr/local/etc/haproxy #数据卷为haproxy需要修改的主配置文件 ports: - "80:80" #端口映射本机的80端口映射容器内的80端口 networks: webnet: #网络连接方式为webnet
我们需要在当前路径下有web1,web2,haproxy目录
cd compose
mkdir web1
mkdir web2
echo web1 >web1/index.html
echo web2 > web2/index.html
我们需要haproxy的配置文件在haproxy目录下
cd compose
mkdir haproxy
get haproxy.cfg
vim haproxy.cfg
内容修改如下图:
若是没有配置文件的直接复制下面这段:
global maxconn 65535 stats socket /var/run/haproxy.stat mode 600 level admin log 127.0.0.1 local0 uid 200 gid 200 daemon defaults mode http log global option httplog option dontlognull monitor-uri /monitoruri maxconn 8000 timeout client 30s retries 2 option redispatch timeout connect 5s timeout server 5s stats uri /admin/stats # The public 'www' address in the DMZ frontend public bind *:80 name clear #监听所有ip的80端口 #bind 192.168.1.10:443 ssl crt /etc/haproxy/haproxy.pem #use_backend static if { hdr_beg(host) -i img } #use_backend static if { path_beg /img /css } default_backend dynamic # The static backend backend for 'Host: img', /img and /css. backend dynamic balance roundrobin server a web1:80 check inter 1000 server b web2:80 check inter 1000
启动服务,-d打入后台
docker-compose up -d
我们查看docker-compose状态还是结束状态
开启它!
再次查看状态是up!!
docker-compose ps
docker-compose start
docker-compose ps
测试:
在网页或者在虚拟机上都可以!
只要是先负载均衡即可!
当我们停止web1的服务后,发现负载均衡只剩web2了,但没有报错这说明有健康监测功能!
docker ps
docker stop compose_web1_1
docker ps
我们访问网页也可以看到web1掉先变红了!
172.25.0.1/admin/stats
此时我们只需要将compose服务重启一下,负载均衡即可恢复,很方便!
cd compose
docker-compose start
curl 172.25.0.1
我们当然在网页也可以看到web,web2都变绿了!恢复运作了!
swarm是基于docker平台实现的集群技术,他可以通过几条简单的指令快速的创建一个docker集群,接着在集群的共享网络上部署应用,最终实现分布式的服务。
相比起zookeeper等集群管理框架来说,swarm显得十分轻量,作为一个工具,它把节点的加入、管理、发现等复杂的操作都浓缩为几句简单的命令,并且具有自动发现节点和调度的算法,还支持自定制。虽然swarm技术现在还不是非常成熟,但其威力已经可见一般。
docker swarm的优缺点
开始初始化:
[root@server1 harbor]# docker swarm init
初始化之后,会生成加一个加入集群的指令!
我们将这个指令在其他节点执行就可以加入到集群中!
在server2,3都做:
然后在server1上可以看到加入集群的节点:
docker node ls
完成之后,我们需要准备一台虚拟机server4
将集群的leader迁移到server2上,而server1负责管理容器的仓库!
快速拉起server4的docker容器
将server3的配置文件传给server4上直接下载docker
将server2或者server1上的解决桥接的文件传给server3,4
cd /etc/sysctl.d
scp docker.conf server3:/etc/sysctl.d
scp docker.conf server4:/etc/sysctl.d
记得重启一下,不然不生效
sysctl --system
docker info
查看,警告没有了!
将server4的docker开启服务,并设置开机自启!
systemctl start docker
systemctl enable docker
将server2提升为集群的leader
docker node promote server2
docker node ls
# 可以看到server2变为了rechale
docker node demote server1
来到server2可以看到已经成为了leader,可以看到其他的集群节点!
docker node ls
将server1离开swarm集群
docker swarm leave
在server2上删除server1的集群节点
docker node rm server1
docker node ls
此时,我们将server4也加入集群节点中:
和刚才的leader变化了记得指定的leader为172.25.0.2!!!
在server2上查看到集群节点中server4已经加入进来了!
docker node ls
我们将server1上前面做的compose全部停掉,并将harbor仓库打开!
打开,停止compose服务的时候,一定要在指定的目录下,不然会出错!
cd
cd compose
docker-compose down
cd ../harbor
docker-compose up -d
紧接着web端访问harbor仓库,输入账户密码登陆,和之前的使用一致!
将server2的容器仓库指定文件发给server3,4
cd /etc/docker
scp daemon.json server3:/etc/docker/
scp daemon.json server4:/etc/docker/
重启docker服务
systemctl reload docker
再将证书发给server3,4
cd /etc/docker
scp -r certs.d/ server3:/etc/docker/
scp -r certs.d/ server4:/etc/docker/
将仓库的本地解析做好:
上传镜像myapp到容器仓库
server1:
docker load -i myapp.tar
docker tag ikubernetes/myapp:v1 reg.westos.org/library/myapp:v1
docker tag ikubernetes/myapp:v2 reg.westos.org/library/myapp:v2
docker push reg.westos.org/library/myapp:v1
docker push reg.westos.org/library/myapp:v2
在web端可以看到上传的镜像:
在server2 上:
创建集群服务,名为webservice 端口映射80:80 开启三个节点 镜像为myapp:v1
docker service create --name webservice --publish 80:80 --replicas 3 myapp:v1
在server4上可以看到镜像已经运行起来了:
docker ps
在server2上查看集群和集群节点服务
docker service ps webservice
测试访问:curl 172.25.0.2/hostname.html 可以看到访问的主机节点负载均衡
可以看到,因为刚才 开启三个节点,所以负载均衡每三次是一个循环!
将集群节点扩容:集群数量变为6个
docker service scale webservice=6
可以看到每个虚拟机运行两个节点
docker service ps webservice
测试:访问server2,3,4哪个IP都可以看到!
六台worker主机均负载均衡,采用算法为默认的rr轮询
容器仓库主机server1:
将visualizer镜像压入harbor仓库
docker load -i visualizer.tar
docker tag dockersamples/visualizer:latest reg.westos.org/library/visualizer:latest
docker push reg.westos.org/library/visualizer:latest
docker service create \
--name=viz \
--publish=8080:8080/tcp \
--constraint=node.role==managere \
--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
visualizer
网页访问监控visualizer,映射端口到主机的8080
firefox:172.25.0.2:8080
集群数量变为20个
docker service scale webservice=20
这个时候看监控,可以看到数量开始增多,变为20个
将myapp:v1 更新为myapp:v2
[root@server2 ~]# docker service update --image myapp:v2 --update-parallelism 2 --update-delay 5s webservice
我们可以看到监控显示:已经开始从v1>>v2
自己做实验可以观察一下动态变化的过程!
接着我们删掉刚才创建的容器和监控!
docker service rm webservice
docker service rm viz
查看监控已经清零
基于 Docker Swarm 之上来完成应用的部署,面向大规模场景下的多服务部署和管理。
Docker stack不支持“build”指令,它是需要镜像是预先已经构建好的, 所以docker-compose更适合于开发场景;
Docker Compose是一个Python项目,使用Docker API规范来操作容器。
Docker Stack功能包含在Docker引擎中,是swarm mode的一部分。
Docker stack不支持基于第2版写的docker-compose.yml ,也就是version版本至少为3。然而Docker Compose对版本为2和3的 文件仍然可以处理;
docker stack把docker compose的所有工作都做完了,因此docker stack将占主导地位。
manager主机server2操作:
vim docker-compose.yml
version: "3.8" services: web: image: myapp:v1 ports: - "80:80" #端口映射,主机80映射容器80 networks: - webnet #网络接口为webnet deploy: replicas: 6 #拉起容器的数量 update_config: parallelism: 2 # 每次更新的数量 delay: 5s #更新时间间隔 restart_policy: condition: on-failure visualizer: image: visualizer:latest ports: - "8080:8080" #监控端口为主机映射8080到容器的8080 stop_grace_period: 1m30s volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: placement: constraints: - "node.role==manager" networks: webnet:
docker stack deploy -c docker-compose.yml mycluster
查看stack进程:六个节点已经成功拉起!
docker stack ps mycluster
当改变脚本中节点数量
60个!重新执行脚本
可以看到监控直接拉起了60个进程!
replicas: 60
docker stack deploy -c docker-compose.yml mycluster
当我们再次修改脚本将镜像改为v2时候,就会实现滚动更新
执行脚本
docker stack deploy -c docker-compose.yml mycluster
查看监控,发现开始逐渐变化为v2
swarm集群在创建成功时会自动添加虚拟网卡
docker network ls
在前面的操作中,我们采用命令行的方式建立了swarm集群,但是这样的命令行并不是每一个运维或开发人员都熟记的,而且操作起来会比较麻烦。所以需要添加为swarm集群管理添加图形化管理界面。
链接: portainer 目录 提取码: zzct
在server1上加载镜像并上传到仓库!
docker load -i portainer-agent.tar
docker load -i portainer.tar
在web端harbor仓库创建新的项目
一定要选 公开!
docker tag portainer/portainer:latest reg.westos.org/portainer/portainer:latest
docker tag portainer/agent:latest reg.westos.org/portainer/agent:latest
docker push reg.westos.org/portainer/portainer:latest
docker push reg.westos.org/portainer/agent:latest
可以看到上传成功!
在server2上执行脚本
docker stack deploy -c portainer-agent-stack.yml portainer
docker service ls
网页访问图形管理界面,映射端口为9000
172.25.0.2:9000
设置两次密码,需要比较复杂的密码不然会报错!
进来后,可以看到我们创建的容器
在这图形化界面可以直接修改集群数量变为6个,然后点对勾
然后展开看到只剩6个其他的都挂了
接着我们把自己的仓库名添加进去
然后添加service,选择刚才创建的仓库名
记得输入端口映射
点击创建!
然后可以看见镜像创建成功,但是状态是pending,等待一会就会变为running
因为刚才设置端口映射为8000
所以访问8000端口:
172.25.0.2:8000
实验完毕!
关闭并离开集群:
manager主机server2:
docker swarm leave --force
worker主机:
docker swarm leave
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。