新版Docker的Swarm模式

目录
  1. 创建swarm
  2. 将节点加入swarm
  3. 在Swarm中部署服务
  4. 查询Swarm中服务的信息
  5. 在Swarm中动态扩展服务
  6. 删除Swarm中的服务

作者:杨冬 欢迎转载,也请保留这段声明。谢谢!
出处:https://andyyoung01.github.io/http://andyyoung01.16mb.com/

Docker Swarm是原生的Docker集群工具。在Docker版本1.12之后,Docker引擎加入了Swarm模式,将Swarm集成进来。大多数用户应该使用集成进Docker引擎的Swarm模式。单独的Docker Swarm仍然可用,只是它没有集成进Docker引擎的API和CLI命令当中。

在文章“使用Swarm进行Docker集群的部署”中,我们探索了如何通过Docker Swarm镜像部署Docker集群。随着Docker的不断开发,在版本1.12之后,Docker引擎加入了Swarm模式,用户可以通过原生的Docker CLI命令操作Swarm集群。本篇就对这种Swarm模式进行简单的概览。更详细的信息可以参考官方文档

本篇使用的环境包括3个节点,一个作为Swarm的manager节点,两个为worker节点,机器名和IP地址如下:
centos7: 192.168.71.131 (Swarm manager)
centos7-A: 192.168.71.167 (Swarm worker)
centos7-B: 192.168.71.168 (Swarm worker)
在三台主机上,都安装了Docker引擎1.12版,并且主机相互之间可以ping通,主机上的2377,7946,4789端口都打开。

创建swarm

下面开始创建swarm。登录到centos7主机上,执行如下命令:

[yangdong@centos7 ~]$ docker swarm init --advertise-addr 192.168.71.131
Swarm initialized: current node (41atspd62he1vshs4jmhpyufj) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-49ueborzkg0v6l3xu2g1d5zfgsjn1xobqvctwozq14m07n1ak0-2llwi551ii09zeyus5r3zi3un \
    192.168.71.131:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

--advertise-addr参数表示其它swarm中的worker节点使用此ip地址与manager联系。命令的输出包含了其它节点如何加入集群的命令。
使用docker infodocker node ls查看集群中的相关信息:

[yangdong@centos7 ~]$ docker info
...
Swarm: active
NodeID: 41atspd62he1vshs4jmhpyufj
Is Manager: true
ClusterID: 5nl0kyz1dfmkgg2sx04vr8zoi
Managers: 1
Nodes: 1
Orchestration:
Task History Retention Limit: 5
...
[yangdong@centos7 ~]$ docker node ls
ID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
41atspd62he1vshs4jmhpyufj *  centos7   Ready   Active        Leader

node ID旁边那个*号表示现在连接到这个节点上。

将节点加入swarm

登录到centos7-A主机上,执行前面创建swarm时输出的命令:

[yangdong@centos7-A ~]$     docker swarm join \
>     --token SWMTKN-1-49ueborzkg0v6l3xu2g1d5zfgsjn1xobqvctwozq14m07n1ak0-2llwi551ii09zeyus5r3zi3un \
>     192.168.71.131:2377
This node joined a swarm as a worker.

如果当时创建swarm时没有记下命令的输出,可以通过在manager节点上运行docker swarm join-token worker命令来获取如何加入swarm的命令。
在另一台主机centos7-B上也执行相同的命令,最后在manager节点上看一下集群节点的状态:

[yangdong@centos7 ~]$  docker node ls
ID                           HOSTNAME   STATUS  AVAILABILITY  MANAGER STATUS
0b57ews522yiz8xyhy3jz34ci    centos7-B  Ready   Active        
41atspd62he1vshs4jmhpyufj *  centos7    Ready   Active        Leader
d1lurs40mlah70spbetcsl9rw    centos7-A  Ready   Active        

在Swarm中部署服务

在centos7也就是manager节点上运行如下命令来部署服务:

[yangdong@centos7 ~]$ docker service create --replicas 1 --name helloworld alpine ping docker.com
50r6d8w4cwzi45s8865p9pdn4

--replicas参数指定服务由几个实例组成。最后的命令行参数alpine ping docker.com指定了使用alpine镜像创建服务,实例启动时运行ping docker.com命令。这与docker run命令是一样的。
使用docker service ls查看正在运行服务的列表:

[yangdong@centos7 ~]$ docker service ls
ID            NAME        REPLICAS  IMAGE   COMMAND
50r6d8w4cwzi  helloworld  1/1       alpine  ping docker.com

查询Swarm中服务的信息

在部署了服务之后,登录到manager节点,运行下面的命令来显示服务的信息。参数--pretty使命令输出格式化为可读的格式,不加--pretty可以输出更详细的信息:

[yangdong@centos7 ~]$ docker service inspect --pretty helloworld
ID:        50r6d8w4cwzi45s8865p9pdn4
Name:        helloworld
Mode:        Replicated
Replicas:    1
Placement:
UpdateConfig:
Parallelism:    1
On failure:    pause
ContainerSpec:
Image:        alpine
Args:        ping docker.com
Resources:

使用命令docker service ps <SERVICE-ID>可以查询到哪个节点正在运行该服务:

[yangdong@centos7 ~]$ docker service ps helloworld
ID                         NAME          IMAGE   NODE     DESIRED STATE  CURRENT STATE           ERROR
541qk5jdrb71ypna9y5zw2l33  helloworld.1  alpine  centos7  Running        Running 12 minutes ago  

在Swarm中动态扩展服务

登录到manager节点,使用命令docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>来将服务扩展到指定的实例数:

[yangdong@centos7 ~]$  docker service scale helloworld=5
helloworld scaled to 5

再次查询服务的状态列表:

[yangdong@centos7 ~]$ docker service ps helloworld
ID                         NAME          IMAGE   NODE       DESIRED STATE  CURRENT STATE           ERROR
541qk5jdrb71ypna9y5zw2l33  helloworld.1  alpine  centos7    Running        Running 16 minutes ago  
96s46qpl3qd94ntw3n2bt81m8  helloworld.2  alpine  centos7-B  Running        Running 17 seconds ago  
6p1u8hj4y31i4pjmwh8zvvf2h  helloworld.3  alpine  centos7-A  Running        Running 8 seconds ago   
02jn1fxkx8juwizk6fjgv9r9n  helloworld.4  alpine  centos7-A  Running        Running 9 seconds ago   
btbrvtnjjmgyb8emwmznziho9  helloworld.5  alpine  centos7    Running        Running 27 seconds ago  

可见Swarm创建了4个新的task来将整个服务的实例数扩展到5个。这些服务分布在不同的Swarm节点上。

删除Swarm中的服务

在manager节点上运行docker service rm helloworld便可以将服务删除。删除服务时,会将服务在各个节点上创建的容器一同删除,而并不是将容器停止。

此外Swarm模式还提供了服务的滚动升级将某个worker置为维护模式,及路由网等功能。在Docker将Swarm集成进Docker引擎后,可以使用原生的Docker CLI对容器集群进行各种操作,使集群的部署更加方便、快捷。