Docker swarm介绍和简单使用
- vicentz
- 0
- Posted on
Docker Swarm 是 Docker 官方提供的原生容器编排(Orchestration)工具,用于将多个 Docker 主机(Docker Engine)组成一个集群(Cluster),从而能够以分布式的方式管理、调度和运行容器化应用。
简单来说,Docker Swarm 让你能够:
- 将多台机器(物理机或虚拟机)组成一个“虚拟的单一 Docker 主机”;
- 在这个集群上部署、扩展和管理容器服务;
- 自动进行服务的负载均衡、故障恢复和节点管理。
一、Docker Swarm 的核心概念
1. Swarm(集群)
一个 Swarm 就是由一个或多个 Docker 节点(Node)组成的集群,这些节点共同工作来运行你的应用服务。
2. Node(节点)
Swarm 中的每一个 Docker 主机称为一个 Node,分为两种类型:
- Manager Node(管理节点):
- •负责管理 Swarm 集群的状态,处理集群的编排、调度任务。
- •可以执行普通节点的所有操作,同时可以创建服务、查看集群状态等。
- •建议至少有 3 个 manager 节点 以保证高可用(HA)。
- Worker Node(工作节点):
- •接收并运行由 Manager 分配的任务(即容器)。
- •本身不参与集群的管理决策,只负责干活。
3. Service(服务)
- 是 Swarm 中定义要运行的应用的抽象,比如一个 Web 服务、数据库服务等。
- 你可以定义服务的镜像、副本数、网络、存储等。
- Swarm 会确保指定数量的副本(容器)在集群中运行,并自动做负载均衡和故障恢复。
4. Task(任务)
- 是 Service 的最小调度单位,一般就是一个容器。
- Swarm 会将 Service 拆解为多个 Task,并分配到各个 Worker 节点上运行。
二、Docker Swarm 的优势
- 原生支持:Docker 自带,无需额外安装其他编排工具(如 Kubernetes)。
- 简单易用:命令行操作直观,适合中小规模应用和团队快速上手。
- 内置服务发现与负载均衡:通过内置的 DNS 和 ingress 网络实现。
- 高可用性:支持多 Manager 节点,具备故障转移能力。
- 滚动更新与回滚:支持服务的无缝升级和版本回退。
三、Docker Swarm 的简单使用教程
⚠️ 注意:以下操作建议在至少两台装有 Docker 的机器(或一台机器开多个 Docker 实例,如使用 Docker Desktop + 虚拟机)上进行。
步骤 1:初始化 Swarm(创建集群)
在一台 Docker 主机上执行以下命令,将其初始化为 Swarm 的 Manager 节点:
docker swarm init --advertise-addr <MANAGER_IP>
<MANAGER_IP>是该节点在 Swarm 网络中的 IP 地址,可以是局域网 IP,比如192.168.1.100,或者eth0的地址。- 如果你在本机测试,可以直接用
localhost或127.0.0.1,但通常推荐用局域网 IP,方便其他节点加入。
示例:
docker swarm init --advertise-addr 192.168.1.100
执行成功后,会输出一段 Join Token,类似于:
Swarm initialized: current node (abc123...) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-xxxx... 192.168.1.100:2377
To add a manager to this swarm, run:
docker swarm join --token SWMTKN-1-manager-xxxx... 192.168.1.100:2377
📌 请保存好这个
docker swarm join命令,后面 Worker 节点加入集群时会用到。
步骤 2:查看 Swarm 状态
在 Manager 节点上运行:
docker node ls
会列出当前 Swarm 中所有的节点,例如:
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
abc123... * manager1 Ready Active Leader 24.0.7
def456... worker1 Ready Active 24.0.7
*表示当前你所在节点。Leader表示这是主 Manager。- 其它节点根据加入方式可能是 Worker 或 Manager。
步骤 3:加入 Worker 节点到 Swarm
在你要作为 Worker 的机器上,使用之前 Manager 初始化成功后提供的 docker swarm join ...命令:
docker swarm join --token SWMTKN-1-xxxx... 192.168.1.100:2377
这条命令会让该主机作为一个 Worker 节点 加入到 Swarm 集群中。
你可以在 Manager 上通过 docker node ls查看是否成功加入。
步骤 4:部署一个 Service(服务)
在 Manager 节点上运行以下命令,部署一个 Nginx 服务,运行 2 个副本:
docker service create \
--name my-nginx \
--replicas 2 \
-p 8080:80 \
nginx
解释:
--name my-nginx:服务名称--replicas 2:运行 2 个容器(即 2 个 task)-p 8080:80:将容器的 80 端口映射到宿主机的 8080 端口nginx:使用的镜像
这个命令的含义是:
- 创建一个名为
my-的 Servicenginx - 希望运行 3 个副本(即 3 个 nginx 容器)
- 把容器的 80 端口映射到宿主机的 8080
接下来会发生什么?
- Manager 节点 会:
- 记录这个 Service 的定义(镜像、副本数、端口等)
- 根据当前 Swarm 集群中 Worker 节点的状态(比如谁在线、谁资源够用),决定把 3 个 nginx 容器(即 3 个 Tasks)分别调度到哪些 Worker 上运行
- 比如:
- 副本1 → Worker A(IP 192.168.1.2)
- 副本2 → Worker B(IP 192.168.1.3)
- 副本3 → Worker C(IP 192.168.1.4)
- Worker 节点(A/B/C) 会:
- 接收 Manager 的指令
- 拉取 nginx 镜像(如果本地没有)
- 运行 nginx 容器
- 对外提供 80 端口的服务(通过 Swarm 的 ingress 网络,统一从 Manager 的 8080 端口访问)
- 你访问
http://<任一Manager或Worker的IP>:8080,Swarm 会通过内置的负载均衡,把请求转发给某个运行 nginx 的容器。
| 操作/功能 | Manager 节点 | Worker 节点 |
|---|---|---|
| 创建 Service | ✅ 可以 | ❌ 不可以 |
| 删除/更新 Service | ✅ 可以 | ❌ 不可以 |
| 查看 Service 状态 | ✅ 可以 | ✅ 可以(但只能看到部分信息) |
| 运行容器(Task) | ✅ 可以(如果它同时也是 Worker) | ✅ 主要负责运行 |
| 调度任务到节点 | ✅ 是 Manager 做的 | ❌ Worker 只接收任务 |
| 管理 Swarm 集群 | ✅ 是 Manager 做的 | ❌ 不参与管理 |
步骤 5:查看服务状态
docker service ls
示例输出:
ID NAME MODE REPLICAS IMAGE PORTS
xyz123... my-nginx replicated 2/2 nginx *:8080->80/tcp
2/2表示期望 2 个副本,实际也运行了 2 个。
查看某个服务的详情:
docker service ps my-nginx
会显示每个副本(task)运行在哪个节点上。
步骤 6:访问服务
如果你在 Manager 或某个节点上映射了端口(如 -p 8080:80),那么可以通过浏览器或 curl 访问:
curl http://localhost:8080
# 或者访问宿主机的 IP:8080
你应该能看到 Nginx 的默认欢迎页面。
步骤 7:扩展服务(Scale)
想把 Nginx 副本数从 2 扩展到 5:
docker service scale my-nginx=5
然后查看:
docker service ps my-nginx
Swarm 会自动将新的副本调度到可用的节点上。
步骤 8:删除服务
docker service rm my-nginx
步骤 9:离开 Swarm
- Worker 节点离开:
docker swarm leave
- Manager 节点离开(慎重,可能导致集群不可用):
docker swarm leave --force
如果要删除整个 Swarm,通常需要所有节点都离开。
四、总结:Docker Swarm 适合谁?
| 场景 | 是否推荐 Swarm |
|---|---|
| 小团队 / 中小规模应用 | ✅ 推荐,简单易用 |
| 快速原型、测试环境 | ✅ 推荐 |
| 需要 Kubernetes 高级功能(如 CRD、复杂调度) | ❌ 建议用 K8s |
| 需要大规模生产级集群、跨云、多租户 | ❌ 建议用 Kubernetes |