概述
Docker Swarm是容器的集群管理工具。它的主要特性:
- 集成于Docker Engine的集群管理工具。
- 分布式设计。从一个image生成整个集群。一个docker swarm下的不同node,可以分布于同一,或不同的物理设备上。
- 灵活调度。按需启动或关闭容器。
- 高可用性。支持监控容器状态,如果容器崩溃,可以自动重启容器。
- 支持多样的网络配置。支持overlay、macvlan、bridge、host等网络形式。
- 服务发现。
- 负载均衡。
- 加密传输。默认基于TLS实现容器间的交互,实现加密传输。
- 升级回退。支持动态升级容器,如果升级后的容器运行不正常,可自动回退到上一版本。
主要概念
node(节点)
每个docker node都是docker engine的实例(可以理解成,每个docker node即是安装了docker环境的PC),可分为manager和worker两类。
- manager node:
- 给worker nodes分配任务(task)。
- 识别worker nodes的状态,调度容器。
- worker node
- 执行manager mode分配的任务(task)。
service(服务)与task(任务)
Docker Swarm通过一个YAML格式的文件,定义了生产环境(in production)中的Docker container行为。此文件包含对services定义、运行、扩容。
service可以理解为是"containers in production"。它是一个swarm系统中最关键的定义。
一个service只能运行一个image,但是可以运行出同一个image的多个containers。
一个task是swarm调度的最小单位,它运行于manager或worker nodes上。它即对应service中的一个container实例。它包含:
- 一个container
- container启动后运行的指令
搭建一个Docker Swarm
环境准备
准备两个虚拟机,一个作为manager,一个作为worker。两个虚拟机间能ping通。并且要求以下端口开放访问:2377,2946。
创建Swarm
在manager设备上,创建swarm,同时配置一下manager的ip。
$ docker swarm init --advertise-addr 192.168.154.135
Swarm initialized: current node (78ayx9kk6n3qr4gcn05nmuvzg) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-523lnlcl8xbol5hmg4aab6ur2g2flmdx5zxb31qzj8r8ty0mbo-bhfp0yf7er2vysftf753s3rz5 192.168.154.135:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
通过docker info
确认一下swarm已经创建。
$ docker info
Client:
Debug Mode: false
Server:
Containers: 5
Running: 0
Paused: 0
Stopped: 5
...
Swarm: active
NodeID: 78ayx9kk6n3qr4gcn05nmuvzg
Is Manager: true
ClusterID: ommhsz8xug6ltvauyusfn3vsp
Managers: 1
Nodes: 1
Default Address Pool: 10.0.0.0/8
SubnetSize: 24
Data Path Port: 4789
Orchestration:
Task History Retention Limit: 5
...
通过docker node ls
确认docker node信息。
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
78ayx9kk6n3qr4gcn05nmuvzg * ubuntu Ready Active Leader 19.03.5
把worker nodes加入swarm
在上一步创建swarm时,docker提示了加入此swarm应执行的命令。在worker node上执行这些命令。
$ docker swarm join --token SWMTKN-1-523lnlcl8xbol5hmg4aab6ur2g2flmdx5zxb31qzj8r8ty0mbo-bhfp0yf7er2vysftf753s3rz5 192.168.154.135:2377
This node joined a swarm as a worker.
如果你没有记录下这个加入swarm的命令,可以在manager node上执行docker swarm join-token worker
以重新获取命令。
再回到manager节点上,查看当前swarm的成员。
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
78ayx9kk6n3qr4gcn05nmuvzg * ubuntu Ready Active Leader 19.03.5
lugs1vyy3o6z3dvnpytkxf6yi ubuntu Ready Active 19.03.5
创建并部署一个service
在manager节点上,创建一个service。
docker service create --replicas 1 --name helloworld alpine ping docker.com
参数解释:
- --replicas:service运行的实例个数
- --name: 命名service为helloword
- alpine ping docker.com: 定义此service为,在
Alpine Linux容器中,执行ping docker.com
docker service ls
确认一下:
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
uyxa5ye0061k helloworld replicated 1/1 alpine:latest
在执行了docker service create之后,此service即是已经被拆解成task执行了。通过以下命令可以查看它的执行状态。这里不具体展开了。
docker service inspect --pretty <SERVICE-ID>
docker service ps <SERVICE-ID>
docker ps
可以查看在当前node上执行的task。此service当前在manager node上执行。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1f880ea0a72 alpine:latest "ping docker.com" 16 minutes ago Up 15 minutes helloworld.1.crxx3hwti4wmj5p6zyqe8yi03
service缩容与扩容
docker service scale
可以修改一个serivce衍生出的副本数量,也就是task数量。通过以下命令将helloworld扩容到5个task。
$ docker service scale helloworld=5
helloworld scaled to 5
overall progress: 5 out of 5 tasks
1/5: running [==================================================>]
2/5: running [==================================================>]
3/5: running [==================================================>]
4/5: running [==================================================>]
5/5: running [==================================================>]
verify: Service converged
查看service在各nodes上的运行情况
$ docker service ps helloworld
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
crxx3hwti4wm helloworld.1 alpine:latest ubuntu Running Running 55 minutes ago
1kej5h5qmkvt helloworld.2 alpine:latest ubuntu-2 Running Running about a minute ago
u7i09cvrv7sj helloworld.3 alpine:latest ubuntu-2 Running Running about a minute ago
glipqhq70jo7 \_ helloworld.3 alpine:latest ubuntu-2 Shutdown Shutdown 8 minutes ago
x9qkewnqf2fa helloworld.4 alpine:latest ubuntu Running Running about a minute ago
vwkke0hvmxk8 \_ helloworld.4 alpine:latest ubuntu-2 Shutdown Shutdown 8 minutes ago
dsyijxuant14 helloworld.5 alpine:latest ubuntu-2 Running Running about a minute ago
ku0o7qg243tl \_ helloworld.5 alpine:latest ubuntu-2 Shutdown Shutdown 8 minutes ago
删除service
执行docker service rm
删除service。
$ docker service rm helloworld
helloworld
若干秒后,此service衍生出的task也都停止运行。
$ docker service ps helloworld
no such service: helloworld