对swarm的认识:
Docker 是一种新型的虚拟化技术,它的目标在于实现轻量级操作系统的虚拟化。相比传统的虚拟化方案,Docker 虚拟化技术有一些很明显的优势:启动容器的速度明显快于传统虚拟化技术,同时创建一台虚拟机占用的资源也要远远小于传统的虚拟技术。Swarm 是 Docker 集群化的技术,而 Swarm 集群化 Docker 离不开服务发现。Consul 能够解决 Swarm 的服务发现问题。本文将介绍 Swarm 如何使用 Consul 作为服务发现。
实验环境:
172.25.23.1 manager
172.25.23.2 node
172.25.23.3 node
这里我用的是主机的docker仓库,大家可以从网上下载镜像,也可以创建镜像仓库,具体操作在镜像仓库博客中查看
真机:
建立好镜像仓库
[root@foundation23 westos.org]# docker push westos.org/nginx
The push refers to a repository [westos.org/nginx]
08d25fa0442e: Pushed
a8c4aeeaa045: Pushed
cdb3f9544e4c: Pushed
latest: digest: sha256:2de9d5fc6585b3f330ff5f2c323d2a4006a49a476729bbc0910b695771526e3f size: 948
[root@foundation23 westos.org]# scp ca.crt [email protected]:/etc/docker/certs.d/westos.org/
[email protected]'s password:
ca.crt 100% 2094 2.0KB/s 00:00
[root@foundation23 westos.org]# scp ca.crt [email protected]:/etc/docker/certs.d/westos.org/
[email protected]'s password:
ca.crt 100% 2094 2.0KB/s 00:00
[root@foundation23 westos.org]# scp ca.crt [email protected]:/etc/docker/certs.d/westos.org/
[email protected]'s password:
ca.crt 100% 2094 2.0KB/s 00:00
[root@foundation23 westos.org]# vim /etc/hosts
[root@foundation23 westos.org]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7aecc6af4716 registry:2 "/entrypoint.sh /e..." 29 minutes ago Up 29 minutes 0.0.0.0:443->443/tcp, 5000/tcp registry
90b268360c70 haproxy "/docker-entrypoin..." 3 hours ago Dead compose_haproxy_1
ecbbfe401523 rhel7:v1 "/usr/sbin/httpd -..." 3 hours ago Dead compose_apache_1
e56353584938 nginx "nginx -g 'daemon ..." 3 hours ago Dead compose_nginx_1
虚拟机:
server1 :manager
[root@server1 ~]# docker swarm init
Swarm initialized: current node (u99yzhyydlqpioxdvqewz4vm5) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-2l60mdx0sf0ioieddhspz4zn34mmctm4ymnj0lna4h8ew1wvuv-et8aeeji8l5z2ceqcauckuo2m \
172.25.23.1:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
server 2.3
[root@server2 ~]# docker swarm join \
> --token SWMTKN-1-2l60mdx0sf0ioieddhspz4zn34mmctm4ymnj0lna4h8ew1wvuv-et8aeeji8l5z2ceqcauckuo2m \
> 172.25.23.1:2377
This node joined a swarm as a worker.
[root@server2 ~]# vim /etc/hosts
172.25.23.250 westos.org
[root@server2 ~]# docker pull westos.org/nginx
Using default tag: latest
latest: Pulling from nginx
2da35ff30a7d: Pull complete
831fb1a65ced: Pull complete
7a63da4e8a19: Pull complete
Digest: sha256:2de9d5fc6585b3f330ff5f2c323d2a4006a49a476729bbc0910b695771526e3f
Status: Downloaded newer image for westos.org/nginx:latest
[root@server2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
westos.org/nginx latest c82521676580 4 weeks ago 109 MB
server1
创建集群服务
[root@server1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
qlsn2s7okys1ru4as9qvece4n server2 Ready Active
sj2p39xj36o76pzm2x1fvp48p server3 Ready Active
u99yzhyydlqpioxdvqewz4vm5 * server1.example.com Ready Active Leader
[root@server1 ~]# docker service create --name nginx --publish 80:80 --replicas 3 westos.org/nginx
t2yd0qgtbw5dhyiql9nwqy8xr
[root@server1 ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
e6jizz9mo6sg nginx.1 westos.org/nginx:latest server3 Running Running 1 second ago
0d2cxrq1uc44 nginx.2 westos.org/nginx:latest server1.example.com Running Running 1 second ago
6t8k5pf6dp53 nginx.3 westos.org/nginx:latest server2 Running Running less than a second ago
将nginx服务的轮询换为6,每虚拟机承担两个
[root@server1 ~]# docker service scale nginx=6
nginx scaled to 6
[root@server1 ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
e6jizz9mo6sg nginx.1 westos.org/nginx:latest server3 Running Running 2 minutes ago
0d2cxrq1uc44 nginx.2 westos.org/nginx:latest server1.example.com Running Running 2 minutes ago
6t8k5pf6dp53 nginx.3 westos.org/nginx:latest server2 Running Running 2 minutes ago
ltmi3kiie2sy nginx.4 westos.org/nginx:latest server2 Running Starting less than a second ago
1y4wo80ype8i nginx.5 westos.org/nginx:latest server3 Running Starting less than a second ago
ukm5yr9n8p03 nginx.6 westos.org/nginx:latest server1.example.com Running Starting less than a second ago
[root@server1 ~]#
导入 visualizer,进行监控
[root@server1 ~]# docker load -i visualizer.tar
5bef08742407: Loading layer [==================================================>] 4.221 MB/4.221 MB
5f70bf18a086: Loading layer [==================================================>] 1.024 kB/1.024 kB
0a19bde117a5: Loading layer [==================================================>] 60.01 MB/60.01 MB
f7e883283ebc: Loading layer [==================================================>] 3.942 MB/3.942 MB
dfd8ee95c7e7: Loading layer [==================================================>] 1.536 kB/1.536 kB
设置监控vmi
[root@server1 ~]# docker tag dockersamples/visualizer westos.org/visualizer
[root@server1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
westos.org/nginx latest c82521676580 4 weeks ago 109 MB
dockersamples/visualizer latest 17e55a9b2354 11 months ago 148 MB
westos.org/visualizer latest 17e55a9b2354 11 months ago 148 MB
[root@server1 ~]# docker service create \
> --name=viz \
> --publish=8080:8080/tcp \
> --constraint=node.role==manager \
> --mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
> westos.org/visualizer
unable to pin image westos.org/visualizer to digest: manifest unknown: manifest unknown
kk1exyrnbkl60c3zyywhv8x18
[root@server1 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE
42zs26ji0f89 nginx replicated 6/6 westos.org/nginx:latest
kk1exyrnbkl6 viz replicated 1/1 westos.org/visualizer
[root@server1 ~]# docker service scale nginx=3
nginx scaled to 3
[root@server1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
92726f6db76c westos.org/nginx@sha256:2de9d5fc6585b3f330ff5f2c323d2a4006a49a476729bbc0910b695771526e3f "nginx -g 'daemon ..." 2 minutes ago Up 2 minutes 80/tcp nginx.6.w1f1mv3pw3h41zjepc0sk1mw7
2d095a1b922e westos.org/visualizer:latest "npm start" 8 minutes ago Up 8 minutes (healthy) 8080/tcp viz.1.jmobxiah25kxq0i8r1p2pke4g
[root@server1 ~]echo server1 > index.html
[root@server1 ~]# docker container cp index.html nginx.6.w1f1mv3pw3h41zjepc0sk1mw7:/usr/share/nginx/html
server2上设置默认发布目录
[root@server2 ~]# echo server2 > index.html
[root@server2 ~]# docker container cp index.html nginx.3.v5cpmkbl4r4ws0e0yyg3390s8:/usr/share/nginx/html
server3上设置默认发布目录
[root@server3 ~]# echo server3 > index.html
docker container cp index.html nginx.5.1y4wo80ype8ic9y72iwygipay:/usr/share/nginx/html
测试:
[root@foundation23 docker]# for i in {1..10}; do curl 172.25.23.1; done
server2
server1
server3
server2
server1
server3
server2
server1
server3
server2
浏览器上进行监控