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