To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
node2加入集群
[root@node2 ~]# docker swarm join \
> --token SWMTKN-1-0mlhcveie1hpqsj8m9recv40bmv6h3nvvf05rqjqkvdxs4dqpp-7z2advdggin0g9yqvsr4bg4q9 \
> 192.168.1.107:2377 This node joined a swarm as a worker.
node3加入集群
[root@node3 ~]# docker swarm join \
> --token SWMTKN-1-0mlhcveie1hpqsj8m9recv40bmv6h3nvvf05rqjqkvdxs4dqpp-7z2advdggin0g9yqvsr4bg4q9 \
> 192.168.1.107:2377 This node joined a swarm as a worker
提升node2为manager节点
[root@node1 ~]# docker node promote node2 Node node2 promoted to a manager in the swarm.
查看集群节点情况
[root@node1 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
6qfftgsw2ba2eq0j0ztvcyjna node3 Ready Active
9cxfsbt5294ya0wn7ji0gs3ji * node1 Ready Active Leader
c1lpchr06vjl7pg5s3leezxrq node2 Ready Active Reachable
至此基础环境已配置完毕
开始搭建私有仓库
在node1上传registry:2镜像也可直接#docker pull registry:2
[root@node1 src]# docker load < registry2.tar
[root@node1 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE
[root@node2 ~]# mkdir /httpd
[root@node2 ~]# cd /httpd/
[root@node2 httpd]# vim Dockerfile FROM 50dae1ee8677
RUN yum -y install httpd net-tools
RUN sed 's/#ServerName /ServerName /g' -i /etc/httpd/conf/httpd.conf
EXPOSE 80
CMD ["/usr/sbin/httpd","-DFOREGROUND"]
[root@node2 httpd]# docker build -t 192.168.1.107:5000/centos:httpd .
[root@node2 httpd]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.1.107:5000/centos httpd e500f78679e6 28 seconds ago 334.8 MB
docker.io/centos latest 50dae1ee8677 13 months ago 196.7 MB
测试:在node2主机上推送镜像到registry
[root@node2 httpd]# docker push 192.168.1.107:5000/centos:httpd The push refers to a repository [192.168.1.107:5000/centos]
参数:
docker service create命令创建一个 service.
--name标签命名service为web1.
--replicas标签来声明1个运行实体(即容器副本数)
注意, 我们启动的镜像名字192.168.1.107:5000/centos:http使用我们本地镜像仓库的镜像名称, 这样当主机上没有这个镜像时, 会自动到本地镜像仓库拉取镜像.
使用docker service ls查看服务
[root@node1 ~]# docker service list ID NAME REPLICAS IMAGE COMMAND
使用docker serviceps<SERVICE-ID/NAME>查看服务运行在哪个节点上
[root@node1 ~]# docker service ps ceshi1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
35s0e9ebps6oijty0klhsc6sy ceshi1.1 192.168.1.107:5000/centos:httpd node3 Running Running about a minute ago
现在你可以用浏览器访问http://192.168.1.107:8080 就能访问测试页
[root@node1 ~]# docker service ps ceshi2 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
1nop65bw2tx5n8oz4ydas1shv ceshi2.1 192.168.1.107:5000/centos:httpd node2 Running Running 4 minutes ago
dspxbg8yd42ftdx0k9p61ld1p ceshi2.2 192.168.1.107:5000/centos:httpd node1 Running Running 4 minutes ago
从上面可以看到ceshi2名称的service有2个副本分别运行在node1和node2节点上。
以全局服务类型运行服务
[root@node1 ~]# docker service create --mode global --name ceshi3 -p 8020:80 192.168.1.107:5000/centos:httpd 3tm3krvcg3xoe6tlobbn4xp8x
[root@node1 ~]# docker service ls ID NAME REPLICAS IMAGE COMMAND
2syr9grsirji ceshi1 1/1 192.168.1.107:5000/centos:httpd
3ljbgwjrgtiw ceshi2 2/2 192.168.1.107:5000/centos:httpd
3tm3krvcg3xo ceshi3 global 192.168.1.107:5000/centos:httpd
从下面可以看到服务ceshi3在每个节点上都运行一个
[root@node1 ~]# docker service ps ceshi3 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
28qcqbocq3fssq6prry8b1yhr ceshi3 192.168.1.107:5000/centos:httpd node3 Running Running about a minute ago
601t61m1a9vhjsx2enbwrwkk1 \_ ceshi3 192.168.1.107:5000/centos:httpd node2 Running Running about a minute ago
5zip3tapzobnxit0bhi07zvxl \_ ceshi3 192.168.1.107:5000/centos:httpd node1 Running Running about a minute ag
下面我们扩展旧的服务,从下面可以看到ceshi1 service目前只有一个副本
[root@node1 ~]# docker service ls ID NAME REPLICAS IMAGE COMMAND
扩展已有的服务的副本数
这里将ceshi1服务扩展到3个副本
[root@node1 ~]# docker service scale ceshi1=3 ceshi1 scaled to 3
[root@node1 ~]# docker service ls ID NAME REPLICAS IMAGE COMMAND
2syr9grsirji ceshi1 3/3 192.168.1.107:5000/centos:httpd
3ljbgwjrgtiw ceshi2 2/2 192.168.1.107:5000/centos:httpd
3tm3krvcg3xo ceshi3 global 192.168.1.107:5000/centos:httpd 缩减已有的服务的副本数
这里将ceshi1服务缩减到2个副本
[root@node1 ~]# docker service ls ID NAME REPLICAS IMAGE COMMAND
Swarm节点是自组织(self-organizing)和自修复(self-healing)的,什么意思?只要有节点或容器宕掉,swarm engine就会尝试修复,下面我们来具体看一下
自修复(self-healing)
经过上面的操作之后,我们有以下3个节点:
[root@node1 ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
6qfftgsw2ba2eq0j0ztvcyjna node3 Ready Active
9cxfsbt5294ya0wn7ji0gs3ji * node1 Ready Active Reachable
c1lpchr06vjl7pg5s3leezxrq node2 Ready Active Leader
运行着3个服务共5个任务(容器)
[root@node1 ~]# docker service ls ID NAME REPLICAS IMAGE COMMAND
2syr9grsirji ceshi1 2/2 192.168.1.107:5000/centos:httpd
3ljbgwjrgtiw ceshi2 2/2 192.168.1.107:5000/centos:httpd
3tm3krvcg3xo ceshi3 global 192.168.1.107:5000/centos:httpd
node1节点上运行着容器2个容器还有一个私有仓库注册服务器容器
[root@node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
00ea67d76d15 192.168.1.107:5000/centos:httpd "/usr/sbin/httpd -DFO" 16 minutes ago Up 16 minutes 80/tcp ceshi3.0.5zip3tapzobnxit0bhi07zvxl
cef6786aa5bf 192.168.1.107:5000/centos:httpd "/usr/sbin/httpd -DFO" 25 minutes ago Up 25 minutes 80/tcp ceshi2.2.dspxbg8yd42ftdx0k9p61ld1p
35639a4b8c60 registry:2 "/entrypoint.sh /etc/" 51 minutes ago Up 47 minutes 0.0.0.0:5000->5000/tcp registry2
node2节点上运行着容器3个容器
[root@node2 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c81a2f073941 192.168.1.107:5000/centos:httpd "/usr/sbin/httpd -DFO" 14 minutes ago Up 13 minutes 80/tcp ceshi1.2.avu47j8eim8gclzkbws9lgvuc
9cb3704e8221 192.168.1.107:5000/centos:httpd "/usr/sbin/httpd -DFO" 17 minutes ago Up 17 minutes 80/tcp ceshi3.0.601t61m1a9vhjsx2enbwrwkk1
35c95d81dc1b 192.168.1.107:5000/centos:httpd "/usr/sbin/httpd -DFO" 26 minutes ago Up 26 minutes 80/tcp ceshi2.1.1nop65bw2tx5n8oz4ydas1shv
node3节点上运行着容器2个容器
[root@node3 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0542ea9089e7 192.168.1.107:5000/centos:httpd "/usr/sbin/httpd -DFO" 18 minutes ago Up 18 minutes 80/tcp ceshi3.0.28qcqbocq3fssq6prry8b1yhr
cd52075eea06 192.168.1.107:5000/centos:httpd "/usr/sbin/httpd -DFO" 35 minutes ago Up 34 minutes 80/tcp ceshi1.1.35s0e9ebps6oijty0klhsc6sy
这就是Docker Swarm Engine的self-healing功能。
[root@node3 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad2f0a30f991 192.168.1.107:5000/centos:httpd "/usr/sbin/httpd -DFO" 27 seconds ago Up 21 seconds 80/tcp ceshi1.1.7qxmmvfbej3w9yekrqpf4gptf
c6ae75728aa0 192.168.1.107:5000/centos:httpd "/usr/sbin/httpd -DFO" 28 seconds ago Up 22 seconds 80/tcp ceshi3.0.exxmoz1443gybq4txds2vu4v1
Self-Organizing
现在我们让node3整个宕掉,node3上的容器会自动在其它节点上启动。
在manager节点上执行docker server ps服务名
[root@node1 ~]# docker service ps ceshi3 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
exxmoz1443gybq4txds2vu4v1 ceshi3 192.168.1.107:5000/centos:httpd node3 Running Running 2 minutes ago
28qcqbocq3fssq6prry8b1yhr \_ ceshi3 192.168.1.107:5000/centos:httpd node3 Shutdown Complete 3 minutes ago
601t61m1a9vhjsx2enbwrwkk1 \_ ceshi3 192.168.1.107:5000/centos:httpd node2 Running Running 23 minutes ago
5zip3tapzobnxit0bhi07zvxl \_ ceshi3 192.168.1.107:5000/centos:httpd node1 Running Running 23 minutes ago
[root@node1 ~]# docker service ps ceshi1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
7qxmmvfbej3w9yekrqpf4gptf ceshi1.1 192.168.1.107:5000/centos:httpd node3 Running Running 3 minutes ago
35s0e9ebps6oijty0klhsc6sy \_ ceshi1.1 192.168.1.107:5000/centos:httpd node3 Shutdown Complete 3 minutes ago
avu47j8eim8gclzkbws9lgvuc ceshi1.2 192.168.1.107:5000/centos:httpd node2 Running Running 19 minutes ago
a4samjx85fw7v4cqsm3asr09j ceshi1.3 192.168.1.107:5000/centos:httpd node3 Shutdown Shutdown 18 minutes ago