Docker Swarm介绍
docker swarm是由一个或者多个Docker节点组成。这些节点可以是物理服务器、虚拟机、树莓派(Raspberry Pi)或云实例。唯一的前提就是要求所有节点通过可靠的网络相连。
节点会被配置为管理节点(Manager)或工作节点(Worker)。管理节点负责集群控制面(Control Plane),进行诸如监控集群状态、分发任务至工作节点等操作。工作节点接收来自管理节点的任务并执行。
Docker Swarm集群搭建
1. 网络条件
需要在路由器和防火墙中开放如下端口。
- 2377/tcp:用于客户端与 Swarm 进行安全通信。
- 7946/tcp 与 7946/udp:用于控制面 gossip 分发
- 4789/udp:用于基于 VXLAN 的覆盖网络。
2.初始化一个docker swarm 集群
[root@localhost ~]# docker swarm init --advertise-addr 192.168.3.21:2377
Swarm initialized: current node (1ounn2qr62r50m2x8oso0l0nu) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1h9lh31ewg4pqku6kcnz5b7v4my28ixm3kqxh8g37idby4t5m1-1r95q74re7etke0objpa2iclt 192.168.3.21:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
命令解析:
docker swarm init: Docker 来初始化一个新的 Swarm,并将自身设置为第一个管理节点。同时也会使该节点开启 Swarm 模式。
–advertise-addr : 指定其他节点用来连接到当前管理节点的 IP 和端口。这一属性是可选的,当节点上有多个 IP 时,可以用于指定使用哪个IP。此外,还可以用于指定一个节点上没有的 IP,比如一个负载均衡的 IP。
3.列出Swarm中的节点
[root@localhost ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
1ounn2qr62r50m2x8oso0l0nu * localhost.localdomain Ready Active Leader 18.09.6
4. 将节点加入到集群中
- ssh到要加入的集群的节点上
- 运行创建swarm集群时候产生的命令来将woker1加入到集群中:
[root@localhost ~]#ocker swarm join --token SWMTKN-1-1h9lh31ewg4pqku6kcnz5b7v4my28ixm3kqxh8g37idby4t5m1-1r95q74re7etke0objpa2iclt 192.168.3.21:2377
This node joined a swarm as a worker.
- 如果你找不到加入命令了,可以在管理节点运行下列命令找回加入命令:
[root@localhost ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-1h9lh31ewg4pqku6kcnz5b7v4my28ixm3kqxh8g37idby4t5m1-1r95q74re7etke0objpa2iclt 192.168.3.21:2377
- 可以ssh到管理节点查看节点是否加入成功
[root@localhost ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
xzbl21fhfflll1afowmt4cd01 localhost.localdomain Ready Active 19.03.0
1ounn2qr62r50m2x8oso0l0nu * manageer Ready Active Leader 18.09.6
ID名带有*号的为管理节点
Docker Swarm 服务部署
1.创建服务
[root@localhost ~]# docker service create --name nginx --replicas 2 -p:80:80 -d nginx
2zi34oq4c31tyy4movs73rmp7
命令解析:
docker service creale : 命令告知 Docker 正在声明一个新服务,
–name: 参数将其命名为 nginx。
-p 80:80: 将每个节点上的 80 端口映射到服务副本内部的 80 端口。
–replicas : 参数告知 Docker 应该总是有 52个此服务的副本。
-d nginx: 告知 Docker 哪个镜像用于副本,重要的是,要了解所有的服务副本使用相同的镜像和配置。
2.查看服务
- docker service ls 命令可以查看 Swarm 中所有运行中的服务。
[root@localhost ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
2zi34oq4c31t nginx replicated 2/2 nginx:latest *:80->80/tcp
- docker service ps 命令可以查看服务副本列表及各副本的状态
[root@localhost ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
clvy0gbzqo06 nginx.1 nginx:latest manageer Running Running 7 minutes ago
oqzxq01dnyvs nginx.2 nginx:latest localhost.localdomain Running Running 7 minutes ago
- docker service inspect 命令查看服务更为详细的信息
[root@localhost ~]# docker service inspect --pretty nginx
ID: 2zi34oq4c31tyy4movs73rmp7
Name: nginx
Service Mode: Replicated
Replicas: 2
Placement:
UpdateConfig:
Parallelism: 1
On failure: pause
Monitoring Period: 5s
Max failure ratio: 0
Update order: stop-first
RollbackConfig:
Parallelism: 1
On failure: pause
Monitoring Period: 5s
Max failure ratio: 0
Rollback order: stop-first
ContainerSpec:
Image: nginx:latest@sha256:53ddb41e46de3d63376579acf46f9a41a8d7de33645db47a486de9769201fec9
Init: false
Resources:
Endpoint Mode: vip
Ports:
PublishedPort = 80
Protocol = tcp
TargetPort = 80
PublishMode = ingress
3.服务的扩容
假设业务呈爆发式增长,则 Web 前端服务接收到双倍的流量压力。所幸通过一个简单的 docker service scale 命令即可对 nginx 服务进行扩容。
[root@localhost ~]# docker service scale nginx=3
nginx scaled to 3
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
4. 删除服务
[root@localhost ~]# docker service rm nginx
nginx
Docker Swarm服务日志
docker service logs <service-name>
Docker Swarm下线和恢复集群中的节点
- 下线集群中的节点
docker node update --availability drain NODE_NAME
- 回复集群中的某个节点
docker node update --availability active NODE_NAME