Docker swarm介绍和简单使用

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-nginx的 ​​Service​
  • 希望运行 ​​3 个副本(即 3 个 nginx 容器)​
  • 把容器的 80 端口映射到宿主机的 8080

接下来会发生什么?

  1. 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)
  2. ​Worker 节点(A/B/C)​​ 会:
    • ​接收 Manager 的指令​
    • ​拉取 nginx 镜像(如果本地没有)​
    • 运行 nginx 容器​
    • 对外提供 80 端口的服务(通过 Swarm 的 ingress 网络,统一从 Manager 的 8080 端口访问)​
  3. ​你访问 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
Previous Post Next Post

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注