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 info
和docker 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对容器集群进行各种操作,使集群的部署更加方便、快捷。
作者:杨冬
出处:https://andyyoung01.github.io/
评论前必须登录!
注册