Docker Swarm 学习手札
Docker Swarm 节点介绍
运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。
节点分为管理 (manager) 节点和工作 (worker) 节点。
管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。
工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。

Docker Swarm 服务和任务介绍
任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。
服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式:
replicated services按照一定规则在各个工作节点上运行指定个数的任务。global services每个工作节点上运行一个任务
两种模式通过 docker service create 的 --mode 参数指定。

搭建 Swarm 集群
[root@owy-bd-c16-21 ~]# docker swarm --help
Usage: docker swarm COMMAND
Commands:
ca Display and rotate the root CA # 显示和轮转root的ca
init Initialize a swarm # 初始化集群
join Join a swarm as a node and/or manager # 加入集群
join-token Manage join tokens # 获取令牌
leave Leave the swarm # 退出集群
unlock Unlock swarm
unlock-key Manage the unlock key
update Update the swarm # 更新集群
初始化集群
格式:docker swarm init
[root@owy-bd-c16-21 ~]# docker swarm init --help
Usage: docker swarm init [OPTIONS]
Options:
--advertise-addr string Advertised address (format: <ip|interface>[:port])
--autolock Enable manager autolocking (requiring an unlock key to start a stopped manager)
--availability string Availability of the node ("active"|"pause"|"drain") (default "active")
--cert-expiry duration Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s)
--data-path-addr string Address or interface to use for data path traffic (format: <ip|interface>)
--data-path-port uint32 Port number to use for data path traffic (1024 - 49151). If no value is set or is set to 0, the default port (4789) is used.
--default-addr-pool ipNetSlice default address pool in CIDR format (default [])
--default-addr-pool-mask-length uint32 default address pool subnet mask length (default 24)
--dispatcher-heartbeat duration Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s)
--external-ca external-ca Specifications of one or more certificate signing endpoints
--force-new-cluster Force create a new cluster from current state
--listen-addr node-addr Listen address (format: <ip|interface>[:port]) (default 0.0.0.0:2377)
--max-snapshots uint Number of additional Raft snapshots to retain
--snapshot-interval uint Number of log entries between Raft snapshots (default 10000)
--task-history-limit int Task history retention limit (default 5)
在已经安装好 Docker 的主机上执行如下命令:
执行 docker swarm init 命令的节点自动成为管理节点。
如果你的 Docker 主机有多个网卡,拥有多个 IP,必须使用 --advertise-addr 指定 IP
docker swarm init --advertise-addr 10.228.237.108
[root@owy-bd-c16-21 ~]# docker swarm init --advertise-addr 10.228.237.108
Swarm initialized: current node (soz5k82c0kn8045ia9izfiy2o) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-0ezupkgyc2vppqlaym2koemfgwm4q4tw8tije1g9kxqmovl5au-2oofp2scwaqzohdqhsaxcd2w0 10.228.237.108:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
获取令牌,并加入
在manager机器执行,让其他服务器加入
# 获取工作者令牌
docker swarm join-token worker
# 获取管理者令牌
docker swarm join-token manager
离开集群
工作节点:docker swarm leave
管理节点默认是不允许离开集群的,网上说可通过
docker swarm leave -f退出,但是会造成很大的错误.因此我自个测试时先把 管理节点降为工作节点:docker node demote 服务id,在进行退出集群….[root@owy-bd-c16-21 ~]# docker node --help Usage: docker node COMMAND Manage Swarm nodes Commands: demote Demote one or more nodes from manager in the swarm # 从管理节点降级为工作节点 inspect Display detailed information on one or more nodes # 显示详情信息 ls List nodes in the swarm # 查询列表 promote Promote one or more nodes to manager in the swarm # 从工作节点升级为管理节点 ps List tasks running on one or more nodes, defaults to current node # 查询运行任务 rm Remove one or more nodes from the swarm # 删除节点 update Update a node # 更新节点
查看集群信息:
在管理节点使用 docker node ls 查看集群。
[root@owy-bd-c16-21 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
kapqvw15476aswk9fiq7my6wv owy-bd-c16-18 Ready Active Reachable 20.10.11
fokja54a2tyimuxdtoongawb2 owy-bd-c16-19 Ready Active 20.10.11
wdg0tl5qct8ibzqfio4t2l0xb owy-bd-c16-20 Ready Active 20.10.11
soz5k82c0kn8045ia9izfiy2o * owy-bd-c16-21 Ready Active Leader 20.10.11
部署Swarm 服务
[root@owy-bd-c16-21 ~]# docker service --help
Usage: docker service COMMAND
Commands:
create Create a new service # 创建服务
inspect Display detailed information on one or more services #查看详细信息
logs Fetch the logs of a service or task # 查看日志
ls List services # 查看服务
ps List the tasks of one or more services # 列出一个或多个服务的任务
rm Remove one or more services # 删除服务
rollback Revert changes to a service's configuration # 回滚服务
scale Scale one or multiple replicated services # 动态复制服务(动态扩展)
update Update a service #更新服务
新建服务
类似docker run的命令…
docker service create -p 8881:80 --name nginx nginx:latest
docker service create --replicas 3 -p 8881:80 --name nginx nginx:latest
查看服务
使用 docker service ls 来查看当前 Swarm 集群运行的服务。
[root@owy-bd-c16-21 ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
o6lnarmuzjwc nginx replicated 1/1 nginx:latest *:8881->80/tcp
使用 docker service ps 来查看某个服务的详情。
[root@owy-bd-c16-21 ~]# docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
1swm97itvxxr nginx.1 nginx:latest owy-bd-c16-18 Running Running 14 minutes ago
使用 docker service logs 来查看某个服务的日志。
服务伸缩
我们可以使用 docker service scale 对一个服务运行的容器数量进行伸缩。
当业务处于高峰期时,我们需要扩展服务运行的容器数量。
docker service scale nginx=5
当业务平稳时,我们需要减少服务运行的容器数量。
docker service scale nginx=2
删除服务
使用 docker service rm 来从 Swarm 集群移除某个服务。
docker service rm nginx