# 初始化集群docker swarm init
[root@swarm-manager ~]# docker swarm init
Swarm initialized: current node(5nod1t171e1kfv6bsf4dvj3ci) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join--token SWMTKN-1-6031unqtu39ma1mbtqtiov8i8beikzimm5j5e4jds6k2jy246i-c95gqxwhp5kvj6kh1df2tsi6z 192.168.1.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
# 群初始化:当前节点(5nod1t171e1kfv6bsf4dvj3ci)现在是一个管理器。# 要向集群中添加一个工作节点,运行以下命令:docker swarm join--token SWMTKN-1-6031unqtu39ma1mbtqtiov8i8beikzimm5j5e4jds6k2jy246i-c95gqxwhp5kvj6kh1df2tsi6z 192.168.1.100:2377
# 要向集群中添加管理器,请运行` docker swarm join-token manager `并按照说明操作。# 查看状态docker info -f'{{.Swarm}}'[root@swarm-manager ~]# docker info -f '{{.Swarm}}'{5nod1t171e1kfv6bsf4dvj3ci 192.168.1.100 active true[{5nod1t171e1kfv6bsf4dvj3ci 192.168.1.100:2377}]11 0xc000178c60 []}# token 忘记咋办docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join--token SWMTKN-1-6031unqtu39ma1mbtqtiov8i8beikzimm5j5e4jds6k2jy246i-c95gqxwhp5kvj6kh1df2tsi6z 192.168.1.100:2377
4.2 加入集群
# swarm-worker1 和 swarm-worker2 节点加入docker swarm join--token SWMTKN-1-6031unqtu39ma1mbtqtiov8i8beikzimm5j5e4jds6k2jy246i-c95gqxwhp5kvj6kh1df2tsi6z 192.168.1.100:2377
# swarm-worker1 节点 [root@swarm-worker1 ~]# docker swarm join --token SWMTKN-1-6031unqtu39ma1mbtqtiov8i8beikzimm5j5e4jds6k2jy246i-c95gqxwhp5kvj6kh1df2tsi6z 192.168.1.100:2377
This node joined a swarm as a worker. # 此节点以 worker 身份加入群。# swarm-worker2 节点[root@swarm-worker2 ~]# docker swarm join --token SWMTKN-1-6031unqtu39ma1mbtqtiov8i8beikzimm5j5e4jds6k2jy246i-c95gqxwhp5kvj6kh1df2tsi6z 192.168.1.100:2377
This node joined a swarm as a worker. # 此节点以 worker 身份加入群
4.3 查看状态
# swarm-manager 主机查看docker info
[root@swarm-manager ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Docker Buildx (Docker Inc., v0.8.2-docker)
scan: Docker Scan (Docker Inc., v0.23.0)
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 20.10.15
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: active # 当前状态活跃
NodeID: 5nod1t171e1kfv6bsf4dvj3ci
Is Manager: true
ClusterID: oe5ugn0ujh4i2bj0w5kutv2gz
Managers: 1# 计算节点
Nodes: 3# 工作节点
Default Address Pool: 10.0.0.0/8 # 默认地址池
SubnetSize: 24
Data Path Port: 4789# 数据通路端口
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Number of Old Snapshots to Retain: 0
Heartbeat Tick: 1
Election Tick: 10
Dispatcher:
Heartbeat Period: 5 seconds # 心跳周期
CA Configuration:
Expiry Duration: 3 months
Force Rotate: 0
Autolock Managers: false
Root Rotation In Progress: false
Node Address: 192.168.1.100 # 节点地址
Manager Addresses:
192.168.1.100:2377 # 控制节点地址
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: d2d58213f83a351ca8f528a95fbd145f5654e957
runc version: v1.1.12-0-g51d5e94
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-957.el7.x86_64
Operating System: CentOS Linux 7(Core)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 3.683GiB
Name: swarm-manager
ID: IRIN:WS4R:MACN:UNOC:TJHS:GLAB:E2ER:LC6H:D6HJ:T5I4:MOWK:XDID
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://ovvphjcn.mirror.aliyuncs.com/
Live Restore Enabled: false# 查看节点dockernodels[root@swarm-manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
5nod1t171e1kfv6bsf4dvj3ci * swarm-manager Ready Active Leader 20.10.15
itsuvlblh71h0kuv602pgd6xd swarm-worker1 Ready Active 20.10.15
qhw9dxwqo0goh1nyiaq6mfhkw swarm-worker2 Ready Active 20.10.15
# 更改节点availablity状态# swarm集群中node的availability状态可以为 active或者drain,其中:# active状态下,node可以接受来自manager节点的任务分派;# drain状态下,node节点会结束task,且不再接受来自manager节点的任务分派(也就是下线节点)。dockernode update --availbility drain itsuvlblh71h0kuv602pgd6xd
[root@swarm-manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
5nod1t171e1kfv6bsf4dvj3ci * swarm-manager Ready Active Leader 20.10.15
itsuvlblh71h0kuv602pgd6xd swarm-worker1 Ready Drain 20.10.15
qhw9dxwqo0goh1nyiaq6mfhkw swarm-worker2 Ready Active 20.10.15
# 当swarm-worker1的状态改为drain后,那么该节点就不会接受task任务分发,就算之前已经接受的任务也会转移到别的节点上。# 再次修改为active状态(及将下线的节点再次上线)dockernode update --availbility active itsuvlblh71h0kuv602pgd6xd
[root@swarm-manager ~]# docker node update --availability active itsuvlblh71h0kuv602pgd6xd
itsuvlblh71h0kuv602pgd6xd
[root@swarm-manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
5nod1t171e1kfv6bsf4dvj3ci * swarm-manager Ready Active Leader 20.10.15
itsuvlblh71h0kuv602pgd6xd swarm-worker1 Ready Active 20.10.15
qhw9dxwqo0goh1nyiaq6mfhkw swarm-worker2 Ready Active 20.10.15
# 如果需要删除一个节点dockernoderm--force itsuvlblh71h0kuv602pgd6xd
[root@swarm-manager ~]# docker node rm -f itsuvlblh71h0kuv602pgd6xd
itsuvlblh71h0kuv602pgd6xd
[root@swarm-manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
5nod1t171e1kfv6bsf4dvj3ci * swarm-manager Ready Active Leader 20.10.15
qhw9dxwqo0goh1nyiaq6mfhkw swarm-worker2 Ready Active 20.10.15
# 从新把swarm-worker1 加入集群docker swarm join-token worker
docker swarm join--token SWMTKN-1-6031unqtu39ma1mbtqtiov8i8beikzimm5j5e4jds6k2jy246i-c95gqxwhp5kvj6kh1df2tsi6z 192.168.1.100:2377
[root@swarm-worker1 ~]# docker swarm join --token SWMTKN-1-6031unqtu39ma1mbtqtiov8i8beikzimm5j5e4jds6k2jy246i-c95gqxwhp5kvj6kh1df2tsi6z 192.168.1.100:2377
This node joined a swarm as a worker.
# 再次查看节点dockernodels[root@swarm-manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
5nod1t171e1kfv6bsf4dvj3ci * swarm-manager Ready Active Leader 20.10.15
gz0ep0xbi5v1an7ulf0lmo1wx swarm-worker1 Ready Active 20.10.15
qhw9dxwqo0goh1nyiaq6mfhkw swarm-worker2 Ready Active 20.10.15
4.4 管理node
# 将 node 提升为 manager docker node promote 节点iddockernode promote itsuvlblh71h0kuv602pgd6xd
[root@swarm-manager ~]# docker node promote itsuvlblh71h0kuv602pgd6xd
Node itsuvlblh71h0kuv602pgd6xd promoted to a manager in the swarm.
# 查看节点dockernodels[root@swarm-manager ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
5nod1t171e1kfv6bsf4dvj3ci * swarm-manager Ready Active Leader 20.10.15
itsuvlblh71h0kuv602pgd6xd swarm-worker1 Ready Active Reachable 20.10.15
qhw9dxwqo0goh1nyiaq6mfhkw swarm-worker2 Ready Active 20.10.15
# 查看管理者数量docker info -f{{.Swarm.Managers}}[root@swarm-manager ~]# docker info -f {{.Swarm.Managers}}2# 将manager降级为worker docker node demote 节点iddockernode demote itsuvlblh71h0kuv602pgd6xd
[root@swarm-manager ~]# docker node demote itsuvlblh71h0kuv602pgd6xd
Manager itsuvlblh71h0kuv602pgd6xd demoted in the swarm.
# 再次查看管理者数量docker info -f{{.Swarm.Managers}}[root@swarm-manager ~]# docker info -f {{.Swarm.Managers}}1# 卸载集群 (每个机器上执行哦)docker swarm leave --force[root@swarm-manager ~]# docker swarm leave --force
Node left the swarm.
[root@swarm-manager ~]# docker node ls
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
5. 部署服务
5.1 nginx服务为例
# nginx 服务dockerservice create --replicas1--name nginx-01 -p80:80 nginx
# 解释
- 该命令将创建服务。docker service create
- 该标志为服务命名。--name nginx-01
- 该标志指定 1 个正在运行的实例的所需状态。--replicas
- 该标识为服务映射宿主机80端口到 容器80端口 -p80:80
- 镜像名称 nginx
[root@swarm-manager ~]# docker service create --replicas 1 --name nginx-01 -p 80:80 nginx
lah4f6xehd3ebymov6gb7sn77
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
# 查看服务列表dockerservicels[root@swarm-manager ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
lah4f6xehd3e nginx-01 replicated 1/1 nginx:latest *:80->80/tcp
5.2 检查服务
# 显示详细信息 dockerservice inspect --pretty<service-id || service-name>[root@swarm-manager ~]# docker service inspect --pretty lah4f6xehd3e
ID: lah4f6xehd3ebymov6gb7sn77
Name: nginx-01
Service Mode: Replicated
Replicas: 1
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:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Init: false
Resources:
Endpoint Mode: vip
Ports:
PublishedPort =80
Protocol = tcp
TargetPort =80
PublishMode = ingress
# 如果要以 json 格式返回服务详细信息 docker service inspect <service-id || service-name># 查看哪些节点正在运行服务dockerserviceps<service-id || service-name>[root@swarm-manager ~]# docker service ps lah4f6xehd3e
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
kbf7vly6wpc2 nginx-01.1 nginx:latest swarm-manager Running Running 11 minutes ago
# 在运行任务的节点上运行,查看有关任务的容器。docker ps# 注意:如果在管理器节点以外的节点上运行, 您必须通过 SSH 连接到该节点
5.3 服务扩缩容
# docker service scale <service-id>=<number-of-tasks> # 查看当前机器nginx服务数量dockerserviceps lah4f6xehd3e
[root@swarm-manager ~]# docker service ps lah4f6xehd3e
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
kbf7vly6wpc2 nginx-01.1 nginx:latest swarm-manager Running Running 17 minutes ago
# 扩容nginx服务为3dockerservice scale lah4f6xehd3e=3[root@swarm-manager ~]# docker service scale lah4f6xehd3e=3
lah4f6xehd3e scaled to 3
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]2/3: running [==================================================>]3/3: running [==================================================>]
verify: Service converged
# 再次查看nginx服务 为三个dockerserviceps lah4f6xehd3e
[root@swarm-manager ~]# docker service ps lah4f6xehd3e
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
kbf7vly6wpc2 nginx-01.1 nginx:latest swarm-manager Running Running 19 minutes ago
64oz5npq7rwi nginx-01.2 nginx:latest swarm-worker1 Running Running 48 seconds ago
j1g9zsn9y363 nginx-01.3 nginx:latest swarm-worker2 Running Running 37 seconds ago
# 缩容 比如 我只需要2个nginx实例dockerservice scale lah4f6xehd3e=2[root@swarm-manager ~]# docker service scale lah4f6xehd3e=2
lah4f6xehd3e scaled to 2
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]2/2: running [==================================================>]
verify: Service converged
# 再次查看nginx服务 为两个dockerserviceps lah4f6xehd3e
[root@swarm-manager ~]# docker service ps lah4f6xehd3e
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
kbf7vly6wpc2 nginx-01.1 nginx:latest swarm-manager Running Running 22 minutes ago
64oz5npq7rwi nginx-01.2 nginx:latest swarm-worker1 Running Running 3 minutes ago
5.3 删除服务
dockerservicerm<service-id || service-name>
5.4 服务滚动更新
# 部署一个基于 在 Redis 3.0.6 容器标签上。然后,升级服务为3.0.7 容器映像dockerservice create \--replicas3\--name redis \
--update-delay 10s \
redis:3.0.6
- 该标志配置对服务任务或任务集的更新之间的时间延迟。你可以将时间描述为秒数、分钟数或小时数的组合 --update-delay
[root@swarm-manager ~]# docker service create \>--replicas3\>--name redis \> --update-delay 10s \> redis:3.0.6
zipd741pdig2wfey520i31djg
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]2/3: running [==================================================>]3/3: running [==================================================>]
verify: Service converged
# 检查服务 redisdockerservice inspect --pretty redis
[root@swarm-manager ~]# docker service inspect --pretty redis
ID: zipd741pdig2wfey520i31djg
Name: redis
Service Mode: Replicated
Replicas: 3
Placement:
UpdateConfig:
Parallelism: 1
Delay: 10s
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: redis:3.0.6@sha256:6a692a76c2081888b589e26e6ec835743119fe453d67ecf03df7de5b73d69842
Init: false# 更新容器镜像dockerservice update --image redis:3.0.7 redis
[root@swarm-manager ~]# docker service update --image redis:3.0.7 redis
redis
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]2/3: running [==================================================>]3/3: running [==================================================>]
verify: Service converged
[root@swarm-manager ~]# docker service inspect --pretty redis
ID: zipd741pdig2wfey520i31djg
Name: redis
Service Mode: Replicated
Replicas: 3
UpdateStatus:
State: completed
Started: 2 minutes ago
Completed: 14 seconds ago
Message: update completed
Placement:
UpdateConfig:
Parallelism: 1
Delay: 10s
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: redis:3.0.7@sha256:730b765df9fe96af414da64a2b67f3a5f70b8fd13a31e5096fee4807ed802e20
Init: false
Resources:
Endpoint Mode: vip
# 重新启动已暂停的更新dockerservice update <service-id || service-name># 运行观看滚动更新 docker service ps <service-id || service-name>dockerserviceps redis
[root@swarm-manager ~]# docker service ps redis
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
ps9mfrxsn4ck redis.1 redis:3.0.7 swarm-worker2 Running Running 5 minutes ago
js5bykpb6o77 \_ redis.1 redis:3.0.6 swarm-worker2 Shutdown Shutdown 6 minutes ago
30oiggtwpbuw redis.2 redis:3.0.7 swarm-worker1 Running Running 7 minutes ago
8ixep8jvzkt5 \_ redis.2 redis:3.0.6 swarm-worker1 Shutdown Shutdown 8 minutes ago
daus97jwupgg redis.3 redis:3.0.7 swarm-manager Running Running 6 minutes ago
jf6n83zmwn69 \_ redis.3 redis:3.0.6 swarm-manager Shutdown Shutdown 7 minutes ago
# 在 Swarm 更新所有任务之前,您可以看到一些任务正在运行,而另一些任务正在运行。上面的输出显示 滚动更新完成后的状态。redis:3.0.6 redis:3.0.7