概述
使用Docker的swarm模式,需要安装Docker的1.12.0或者更新的版本。
swarm的特点包括:
- 集成进Docker引擎;
- 去中心化设计;
- 可缩放扩展;
- 状态监控;
- 跨主机通信;
- 负载均衡;
- 安全;
- 滚动升级。
基本概念
节点
运行Docker的主机可以主动初始化一个swarm集群,或者加入一个已经存在的swarm集群,这样这个运行Docker的主机就成为一个swarm集群的节点(node)。
节点可以分为管理节点和工作节点:
- 管理节点:用于swarm集群管理的节点,一个swarm集群可以有多个管理节点,但是只有一个管理节点可以成为leader,leader通过raft协议实现。
- 工作节点:任务执行的节点,管理节点将服务(service)下发至工作节点执行。管理节点默认也可以为工作节点。
服务和任务
任务(task)是swarm中最小的调度单位,目前来说是单一的容器。
服务(services)是指一组任务的集合,服务定义了任务的属性。服务包括两种模式:
- replicated services,按照一定的规则在各个工作节点上运行指定数量的任务;
- global services,每个工作节点上运行一个任务。
create a swarm
创建一个新的swarm:
[root@jamza_vm_master_litepaas ~]# docker swarm init --advertise-addr 192.168.83.83
Swarm initialized: current node (8g9b2wnb82wno5gkx60fdli9h) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-5a8t5fz2rqel51bdvvcjq3oemeg1bcdk1ry85f27abft4lomyo-cn9kucfudl1rlqf4wrqrx00gh \
192.168.83.83:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
[root@jamza_vm_master_litepaas ~]#
指令中的–advertise-addr选项配置管理节点的公开IP地址,在swarm中的其他节点需要能够访问到该地址。
通过指令docker info来查看当前swarm的状态:
[root@jamza_vm_master_litepaas ~]# docker info
......
Swarm: active
NodeID: 8g9b2wnb82wno5gkx60fdli9h
Is Manager: true
ClusterID: 29eo1av9nwk38a4dsx8dg6vao
Managers: 1
Nodes: 1
......
查看node节点信息的指令:
[root@jamza_vm_master_litepaas ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
8g9b2wnb82wno5gkx60fdli9h * jamza_vm_master_litepaas Ready Active Leader
[root@jamza_vm_master_litepaas ~]#
Add nodes to the swarm
在工作节点上运行docker swarm init的输出指令,将工作节点加入到之前创建的的swarm。可以在管理节点执行以下的命令,以查看加入指令的内容:
[root@jamza_vm_master_litepaas ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-5a8t5fz2rqel51bdvvcjq3oemeg1bcdk1ry85f27abft4lomyo-cn9kucfudl1rlqf4wrqrx00gh \
192.168.83.83:2377
[root@jamza_vm_master_litepaas ~]#
[root@jamza_vm_master_litepaas ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-5a8t5fz2rqel51bdvvcjq3oemeg1bcdk1ry85f27abft4lomyo-c5d1vz4lkhwvkiqr5uii6ezlo \
192.168.83.83:2377
[root@jamza_vm_master_litepaas ~]#
在工作节点执行docker swarm join指令,将工作节点加入到swarm中:
[root@jamza_vm_slave_litepaas ~]# docker swarm join --token SWMTKN-1-5a8t5fz2rqel51bdvvcjq3oemeg1bcdk1ry85f27abft4lomyo-cn9kucfudl1rlqf4wrqrx00gh 192.168.83.83:237
This node joined a swarm as a worker.
[root@jamza_vm_slave_litepaas ~]#
[root@jamza_vm_lp0_litepaas ~]# docker swarm join --token SWMTKN-1-5a8t5fz2rqel51bdvvcjq3oemeg1bcdk1ry85f27abft4lomyo-cn9kucfudl1rlqf4wrqrx00gh 192.168.83.83:2377
This node joined a swarm as a worker.
[root@jamza_vm_lp0_litepaas ~]#
在管理节点执行docker node ls命令,查看当前swarm集群中的节点信息:
[root@jamza_vm_master_litepaas ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
223cec79gjydf7pxqts9gn098 jamza_vm_lp0_litepaas Ready Active
3d1i3ammfohefre5fvtma90en jamza_vm_slave_litepaas Ready Active
8g9b2wnb82wno5gkx60fdli9h * jamza_vm_master_litepaas Ready Active Leader
[root@jamza_vm_master_litepaas ~]#
Deploy a service to the swarm
部署服务到swarm中,使用命令docker service来在管理节点进行部署:
[root@jamza_vm_master_litepaas ~]# docker service create --replicas 1 --name test busybox/x86_64:latest ping www.zte.com.cn
9oa3y95hyi4n82sypqyx414wx
[root@jamza_vm_master_litepaas ~]#
命令docker service ls来查看当前运行的服务列表:
[root@jamza_vm_master_litepaas ~]# docker service ls
ID NAME REPLICAS IMAGE COMMAND
9oa3y95hyi4n test 1/1 busybox/x86_64:latest ping www.zte.com.cn
[root@jamza_vm_master_litepaas ~]#
Inspect a service on the swarm
运行命令docker service inspect --pretty <SERVICE-ID>以易读的方式显示服务的细节信息:
[root@jamza_vm_master_litepaas ~]# docker service inspect --pretty test
ID: 9oa3y95hyi4n82sypqyx414wx
Name: test
Mode: Replicated
Replicas: 1
Placement:
UpdateConfig:
Parallelism: 1
On failure: pause
ContainerSpec:
Image: busybox/x86_64:latest
Args: ping www.zte.com.cn
Resources:
[root@jamza_vm_master_litepaas ~]#
命令若没有–pretty选项,则命令输出json格式的服务细节数据:
[root@jamza_vm_master_litepaas ~]# docker service inspect test
[
{
"ID"