1、简介
Swarm是Docker的一个编排工具,参考官网:https://docs.docker.com/engine/swarm/
1、Swarm模式简介
要在Swarm模式下运行docker,需要先安装docker,参考安装教程
当前版本的docker包含了swarm模式,用于管理docker集群。可以使用命令行来创建swarm集群,部署应用,管理swarm的行为。
如果你使用低于1.12.0版本的docker,可以使用独立模式的是swarm,但是建议使用最新版本
2、Swarm特性
与docker集成的集群管理工具
去中心化设计,只使用docker引擎即可创建各类节点
声明式服务模型。可以声明的方式来定义应用。
动态伸缩。管理节点自动调整服务数量。
高可用,对于服务期望状态做到动态调整,swarm的管理节点会持续监控集群状态,集群中有没有达到期望状态的服务,管理节点会自动调度来达到期望状态。
自定义网络。可以为你的服务指定一个网络,容器创建的时候分配一个IP
服务发现。管理节点给集群中每个服务一个特定的DNS名字,并给运行的容器提供负载均衡。
负载均衡。你可以暴露服务端口给外部的负载均衡。内部swarm提供可配置的容器分配到节点的策略。
默认的安全机制。swarm集群中各个节点强制TLS协议验证。连接加密,你可以自定义根证书。
滚动更新。增量跟新,可以自定义更新下个节点的时间间隔,如果有问题,可以会滚到上个版本。
3、Swarm 主要概念
(1)开始使用Swarm模式
后续文档按如下流程进行:
在swarm模式下初始化一个基于docker引擎的swarm集群
在swarm集群中添加节点
部署应用服务到swarm集群中
管理swarm集群
本教程使用docker命令行的方式交互
(2)安装环境要求
准备3台主机,3台可以网络通信的linux主机,可以是物理机,虚拟机,云主机,甚至是docker machine创建的主机,并且3台主机都要安装docker(docker版本要大于1.12.0,安装步骤参考:在linux上安装docker),本例3台主机名称分别为:cnkanon-1、cnkanon-2、cnkanon-3
安装1.12.0以上的docker,本例中 docker 版本为:v18.09.6, build 481bc77156
管理节点的IP地址
主机之间开放端口
(3)管理节点的IP地址
所有swarm集群中的节点都能连接到管理节点的IP地址。
(4)端口开放
以下端口需要开放
2377/tcp 为集群管理通信
7946/tcp、7946/udp 为节点间通信
4789/udp 为网络间流量2、创建一个swarm集群
完成上面的开始过程后,可以开始创建一个swarm集群,确保docker的后台应用已经在主机上运行了。
登陆到 cnkanon-1 上,如果使用 docker-machine 创建的主机,要求可以 docker-machine ssh cnkanon-1
1、运行以下命令来创建一个新的swarm集群:
docker swarm init --advertise-addr <MANAGER1-IP>使用如下命令在 cnkanon-1 上创建swarm集群:
[root@cnkanon-1 ~]# docker swarm init --advertise-addr 192.168.56.3
Swarm initialized: current node (82a19cjqf5gvorp2p5jxwhnn6) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2if9pe4h2bvnv2izdaqckxsbhxferygh9h9enh7uqpalyi284o-3hp093o5gyb9oimfn4v64zqz1 192.168.56.3:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
–advertise-addr 选项表示管理节点公布它的IP是多少。其它节点必须能通过这个IP找到管理节点。
命令输出了加入swarm 集群的命令。通过 --token 选项来判断是加入为管理节点还是工作节点
2、运行 docker info 来查看当前 swarm 集群的状态:
[root@cnkanon-1 ~]# docker info
Containers: 8
Running: 1
Paused: 0
Stopped: 7
Images: 5
Server Version: 18.09.6
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: active
NodeID: 82a19cjqf5gvorp2p5jxwhnn6
Is Manager: true
ClusterID: 7jmo6jykf14u1lpd90lwinxso
Managers: 1
Nodes: 1
Default Address Pool: 10.0.0.0/8
SubnetSize: 24
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.56.3
Manager Addresses:
192.168.56.3:2377
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: bb71b10fd8f58240ca47fbb579b9d1028eea7c84
runc version: 2b18fe1d885ee5083ef9f0838fee39b62d653e30
init version: fec3683
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-957.21.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 991.2MiB
Name: cnkanon-1
ID: RZDA:2RQT:Q5M5:HHTW:VTTD:E4GW:ZNHK:E7GI:D6HV:PHFD:NGDZ:TOUE
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://registry.docker-cn.com/
http://hub-mirror.c.163.com/
https://docker.mirrors.ustc.edu.cn/
http://ef017c13.m.daocloud.io/
Live Restore Enabled: false
Product License: Community Engine
WARNING: API is accessible on http://0.0.0.0:2375 without encryption.
Access to the remote API is equivalent to root access on the host. Refer
to the 'Docker daemon attack surface' section in the documentation for
more information: https://docs.docker.com/engine/security/security/#docker-daemon-attack-surface
3、运行 docker node ls 来查看节点信息:

nodeId 旁边的 * 号表示你当前连接到的节点
docker 引擎的swarm模式自动使用宿主机的主机名作为节点名
3、将其他节点加入Swarm集群
1、找回指令
如果你找不到加入命令了,可以在管理节点运行下列命令找回加入命令:
[root@cnkanon-1 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-2if9pe4h2bvnv2izdaqckxsbhxferygh9h9enh7uqpalyi284o-3hp093o5gyb9oimfn4v64zqz1 192.168.56.3:2377
2、加入节点到集群
一旦前面的创建swarm集群完成,你就可以加入工作节点了。
登录到服务器 cnkanon-2、cnkanon-3,将这两个服务器加入到集群 cnkanon-1运行如下指令加入到集群中:
# 服务器 cnkanon-2
[root@cnkanon-2 ~]# docker swarm join --token SWMTKN-1-2if9pe4h2bvnv2izdaqckxsbhxferygh9h9enh7uqpalyi284o-3hp093o5gyb9oimfn4v64zqz1 192.168.56.3:2377
This node joined a swarm as a worker.
# 服务器 cnkanon-3
[root@cnkanon-3 ~]# docker swarm join --token SWMTKN-1-2if9pe4h2bvnv2izdaqckxsbhxferygh9h9enh7uqpalyi284o-3hp093o5gyb9oimfn4v64zqz1 192.168.56.3:2377
This node joined a swarm as a worker.
返回服务器 cnkanon-1 管理节点查看集群中节点列表:
[root@cnkanon-1 ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
82a19cjqf5gvorp2p5jxwhnn6 * cnkanon-1 Ready Active Leader 18.09.6
a9durycfoospewwyf7gvyoo35 cnkanon-2 Ready Active 18.09.6
s879hzzvfqc9l2ixmj130ved4 cnkanon-3 Ready Active 18.09.6
查看swarm状态


3、限制CPU/内存资源
在 Docker Swarm 中创建服务时,限制 CPU 和内存是保障服务稳定性和合理分配资源的关键。你可以通过 docker service create 命令直接设置,或者使用 docker-compose.yml 文件进行更细致的编排。下面是一个快速参考表格,汇总了核心的限制选项:
🛠️ 配置方法与示例
1. 使用命令行直接创建
你可以直接在 docker service create 命令中指定资源限制参数。
bash
# 基本示例:同时限制 CPU 和内存
docker service create \
--name my-web-app \
--limit-cpu 0.5 \
--limit-memory 512m \
--reserve-cpu 0.25 \
--reserve-memory 256m \
nginx:latest2. 使用 Stack File(推荐)
通过 docker-compose.yml 文件定义服务并部署,这种方式更利于版本管理和复杂服务的配置。
yaml
# docker-compose.yml
version: '3.8'
services:
my-app:
image: nginx:latest
deploy:
resources:
limits:
cpus: '0.5' # 限制最多使用 0.5 个 CPU 核心
memory: 512M # 限制最多使用 512MB 内存
reservations:
cpus: '0.25' # 预分配 0.25 个 CPU 核心
memory: 256M # 预分配 256MB 内存然后使用以下命令部署:
bash
docker stack deploy -c docker-compose.yml my-stack📝 重要说明与最佳实践
limits与reservations的区别:limits是资源使用的硬上限,容器不能超过此值。 而reservations是资源预留,Swarm 会确保服务至少能获得这部分资源,但容器实际可以使用更多(直到limits设定的上限)。内存限制建议:强烈建议为所有生产环境的服务设置内存限制(
-m或--limit-memory),这样可以防止因某个服务内存泄漏(OOME)而拖垮整个宿主机的风险。CPU限制的灵活性:CPU 是一种可压缩资源,即使容器偶尔超过限制,通常也不会导致崩溃,但设置限制可以保证不同服务间的公平性。
更新现有服务:你可以使用
docker service update命令来动态调整一个已运行服务的资源限制。bash
docker service update --limit-cpu 1 --limit-memory 1g my-web-app
4、部署服务
1、基于镜像创建服务
创建好 swarm 集群后,就可以部署服务了(也可以不加入工作节点,直接在管理节点单节点上部署服务),回到管理节点 cnkanon-1,基于 jm-cloud-admin 镜像创建服务:

docker service create --replicas=1 --name=jm-cloud-admin --publish=23521:23521 jm-cloud-admin
# 注意,如果其他节点没有该镜像,需要提前将镜像上传,或者使用指定镜像库下载
# 详细的镜像打包、推送阿里私有镜像,见其他笔记
docker service create --replicas=1 --name=jm-cloud-admin --with-registry-auth --publish=23521:23521 registry.cn-hongkong.aliyuncs.com/wushusong/jm-cloud:admin
docker service create --replicas=2 --name=wss-demo-1 --with-registry-auth --publish=31022:31012 registry.cn-hangzhou.aliyuncs.com/wushusong/my-study:wss-demo-v01–replicas:表示期望1个服务实例
–name:表示创建服务的名称
–publish:表示映射的端口
--with-registry-auth:将镜像仓库认证信息带到各个node节点
如果指定的镜像未下载,则系统会自动下载,本例中的 portainer/portainer 镜像是提前下载好的


2、在管理节点 cnkanon-1 上查看运行的服务
docker service ls
3、查看服务详情
docker service inspect jm-cloud-admin --pretty–pretty:表示以 yaml 格式显示,不加此参数将以 json 格式显示

4、查看服务在哪个节点运行
docker service ps jm-cloud-admin
5、在swarm集群中动态伸缩服务实例数
一旦你在swarm集群中创建一个服务后,你就可以使用命令来改变服务的实例个数。在服务中运行的容器称为“任务”。
在管理节点 cnkanon-1 中执行如下指令将 dev-portainer 的实例个数变为3个:
[root@cnkanon-1 ~]# docker service scale jm-cloud-admin=3
dev-portainer scaled to 3
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
scale service-name/service-id=n n:伸缩服务实例的个数
在管理节点 cnkanon-1 上查看服务 jm-cloud-admin 的运行情况及实例个数:
现在登录其他节点,查看服务运行情况
6、删除服务:
docker service rm jm-cloud-admin尽管服务不存在了,任务容器还需要几秒钟来清理,你可以在工作节点 cnkanon-2、cnkanon-3 上 docker ps 查看任务什么时候被移除。
实力的