1.初始化创建swarm

1
docker swarm init --advertise-addr <MANAGER-IP>
  • –listen-addr:指定swarm节点监听的地址/网络接口及端口,默认端口为0.0.0.0:2377
  • –advertise-addr:指定为其它swarm节点提供API access和overlay networking的监听地址和端口,若不指出,会使用–listen-addr指定的端口;若系统有多个IP地址,这个参数必须指定监听到哪个网络地址

2.查看swarm信息

1
docker info

有相关swarm信息(示例如下)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Swarm: active
NodeID: os0l8xe87o0nz0sc04vrrpppl
Is Manager: true
ClusterID: o1c3g9ockktlagwpqirgb49no
Managers: 1
Nodes: 2
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Number of Old Snapshots to Retain: 0
Heartbeat Tick: 1
Election Tick: 3
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Node Address: 192.168.1.146
Manager Addresses:
192.168.1.146:2377

3.增加swarm节点

1
docker swarm join --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c 192.168.99.100:2377

4.查看主节点供连接信息

1
2
docker swarm join-token worker
docker swarm join-token manager

重新生成token

1
swarm join-token --rotate

强烈建议manager节点为奇数个,方便在某节点故障时选举出leader,以下为manager节点规划和可FT(Fault Tolerance)数,以此类推,即swarm cluster允许(N-1)/2个节点故障。

docker swarm mode cluster节点建议

分布式manager节点配置:不同节点上配置的manager节点数,保证更好的容错性

swarm manager nodes

运行manager-only节点(默认manager节点也是worker节点),即将节点状态变为drain状态

1
docker node update --availability drain <NODE-ID>

节点从故障中恢复

1
2
docker swarm init --force-new-cluster --listen-addr node01:2377
The --force-new-cluster flag puts the Docker Engine into swarm mode as a manager node of a single-node cluster. It discards cluster membership information that existed before the loss of the quorum but it retains data necessary to the Swarm cluster such as services, tasks and the list of worker nodes.This flag forces an existing node that was part of a quorum that was lost to restart as a single node Manager without losing its data

5.在主节点上查看所有节点信息

1
docker node ls

6.创建(发布)服务

1
docker service create --replicas 1 --name helloworld alpine ping docker.com

参数解析:

  • –replicas:服务实例数
  • –name:服务名称
  • alpine:镜像名称
  • ping docker.com:执行的命令等参数

还有其它常用参数如:

  • –publish:设置映射到外面的端口
  • –env:设置环境变量
  • –workdir:设置运行目录
  • –user:设置运行用户
  • –mode:设置任务模式
  • –network:创建overlay网络
  • –update-delay:设置更新时间间隔
  • –update-parallelism:设置同时更新的任务数,默认是1
  • –update-failure-action:设置更新失败后的行为,如continue

具体查询–help或https://docs.docker.com/engine/reference/commandline/service_create/

配置挂载项:–mount

挂载项分为卷挂载(默认)和绑定挂载,卷是指容器任务完成并被移除后仍然存在的存储,推荐使用已有的卷挂载

1
2
docker service create --mount src=<VOLUME-NAME>,dst=<CONTAINER-PATH> --name myservice <IMAGE>
docker service create --mount type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=<DRIVER>,volume-opt=<KEY0>=<VALUE0>,volume-opt=<KEY1>=<VALUE1> --name myservice <IMAGE>

绑定挂载是指来自那些调度部署容器任务的主机文件系统路径,docker会挂载到容器内部的路径,这个文件系统路径必须在swarm初始化容器任务之前已存在,同时绑定挂载是有风险的,通常情况下不推荐使用,因为需要在每个机器上存在此挂载的文件系统路径,调度程序随时可能重新调度分配那些不健康或者无法连接的服务容器,并且此种挂载不能保证开发和生产一致。

1
2
docker service create --mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH> --name myservice <IMAGE>
docker service create --mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH>,readonly --name myservice <IMAGE>

7.查看服务状态

1
docker service ls

8.查看服务详细信息

1
docker service inspect --pretty helloworld
  • –pretty:以人性华(非json)方式显示,方便查看

9.查看有哪些节点运行此服务

1
docker service ps helloworld

也可在每个swarm节点上直接使用docker ps查看运行的容器

10.变更服务任务数(只能在manager节点执行,可同时变更多个服务的任务数)

1
docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>

例如:docker service scale helloworld=5表示实例数变更为5个

11.删除服务(只能在manager节点执行)

1
docker service rm helloworld

可通过docker service inspect helloworld确认是否删除

12.滚动更新

1
docker service update --image redis:3.0.7 redis

默认更新步骤如下:
关闭第一个任务(实例)
开始在此关闭节点执行计划中的更新
更新完成后启动此任务
如果被更新的节点状态返回为RUNNING,等待指定的delay时间,然后停止下一个任务
如果,在更新的任意时间,任务返回FAILED,则暂停更新
更新完成后可以使用docker service inspect --pretty redis查看服务的images是否更新成功
若更新失败,使用docker service inspect --pretty 会显示失败,可重新使用docker service update 再次重启更新
使用docker service ps 可查看滚动更新

13.停用节点

1
docker node update --availability drain <NODE-ID>

被信用的节点即不会再接受新的任务指派,也会停止节点上所有运行的任务,此节点上的服务状态会显示为Shutdown,且它的任务会被重新指派到新的可用节点上

14.启用节点

1
docker node update --availability active <NODE-ID>

此时节点可以接受新的任务指派

15.查看本地节点信息

1
docker node inspect self --pretty

16.提升或者降职节点

1
2
docker node promote node-3 node-2
docker node demote node-3 node-2

17.节点退出swarm

1
docker swarm leave

主管理节点退出时需要加–force
待节点退出后,可在任意管理节点从节点列表中删除掉此节点

1
docker node rm node-2

18.创建overlay网络

1
docker network create --driver overlay my-network