准备工作

至少需要 2 台以上的机器搭建 docker swarm,每台机器之间都能ping通。根据一致性协议,至少要大于2台主机。
一台机器当做 manager,其它的机器作为 worker。
看看 docker swarm 有哪些命令:

  1. docker swarm --help
  2. Usage: docker swarm COMMAND
  3. Manage Swarm
  4. Commands:
  5. ca Display and rotate the root CA
  6. init Initialize a swarm
  7. join Join a swarm as a node and/or manager
  8. join-token Manage join tokens
  9. leave Leave the swarm
  10. unlock Unlock swarm
  11. unlock-key Manage the unlock key
  12. update Update the swarm

我们看到init这个参数,它用于初始化swarm。我们再看看它的具体参数:

  1. docker swarm init --help
  2. Usage: docker swarm init [OPTIONS]
  3. Initialize a swarm
  4. Options:
  5. --advertise-addr string Advertised address
  6. (format: <ip|interface>[:port])
  7. --autolock Enable manager autolocking
  8. (requiring an unlock key
  9. to start a stopped manager)
  10. --availability string Availability of the node
  11. ("active"|"pause"|"drain")
  12. (default "active")
  13. --cert-expiry duration Validity period for node
  14. certificates
  15. (ns|us|ms|s|m|h) (default
  16. 2160h0m0s)
  17. --data-path-addr string Address or interface to
  18. use for data path traffic
  19. (format: <ip|interface>)
  20. ...

后面的选项参数很多,注意看第一个参数,它用于广播地址。也就是说,告诉其他工作者:我是谁,我在哪里。

新建 manager

初始化集群,在 manager 机器上操作:

  1. docker swarm init --advertise-addr=192.168.113.130

初始化结果:

  1. Swarm initialized: current node (zgbzi61s274oh2hubv6lhzhnm) is now a manager.
  2. To add a worker to this swarm, run the following command:
  3. docker swarm join --token SWMTKN-1-4uddqewwy5r86ywaescfktepx54i8txi0uhk0dw6axhxrfkll7-bwiein2hxpsrn0fnagpc7at5j 192.168.113.130:2377
  4. To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

初始化集群后,会生成一个token。其他工作者想要加入集群,必须携带此token。就好比参加一个私人舞会,请柬是很重要的。
上面还显示了加入集群的命令,来让我们看看这个命令的详情:

  1. docker swarm join --help
  2. Usage: docker swarm join [OPTIONS] HOST:PORT
  3. Join a swarm as a node and/or manager
  4. Options:
  5. --advertise-addr string Advertised address (format:
  6. <ip|interface>[:port])
  7. --availability string Availability of the node
  8. ("active"|"pause"|"drain") (default "active")
  9. --data-path-addr string Address or interface to use for data path
  10. traffic (format: <ip|interface>)
  11. --listen-addr node-addr Listen address (format:
  12. <ip|interface>[:port]) (default 0.0.0.0:2377)
  13. --token string Token for entry into the swarm

获取令牌的快捷指令:

docker swarm join-token worker # 获取工作节点的加入token
docker swarm join-token manager # 获取管理节点的加入token

新建worker

切换到其它worker机器,输入新建manager后打印的凭证:

docker swarm join --token SWMTKN-1-4uddqewwy5r86ywaescfktepx54i8txi0uhk0dw6axhxrfkll7-bwiein2hxpsrn0fnagpc7at5j 192.168.113.130:2377

注意:manager的防火墙必须开放某些端口:

firewall-cmd --add-port=2376/tcp --permanent
firewall-cmd --add-port=2377/tcp --permanent
firewall-cmd --add-port=7946/tcp --permanent
firewall-cmd --add-port=7946/udp --permanent
firewall-cmd --add-port=4789/udp --permanent

切换到 manager 机器,输入命令查看已加入的 worker

docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
ozavne9qnzcy99pnho1p4r851     www                 Ready               Active              
zgbzi61s274oh2hubv6lhzhnm *   www                 Ready               Active              Leader

新建服务

新建一个名为busybox镜像,取个别名为demo:

docker service create --name demo busybox sh -c "while true;do sleep 3600;done"
gf13affebul808h7lxvq4y0rk
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged

其实新建服务就是创建了一个容器。

docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
gf13affebul8        demo                replicated          1/1                 busybox:latest

我们在上面得知有一个正在运行的进程。
查看服务进程:

docker service ps demo
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
n3l7uh6tlkws        demo.1              busybox:latest      www                 Running             Running 4 minutes ago

docker swarm 最大的好处就是可以动态地扩缩容:

docker service scale demo=5

上面的命令把demo容器扩容至5个。
删除服务:

docker service rm demo