Docker Swarm Mode 是什么?

很多人用了几百年docker却不知道docker swarm,这让人很震惊!! 我只用了不到一百年,所以不知道也不丢人,所以写下来。

Docker Swarm Mode 是 Docker 内置的 集群管理与编排工具,允许你将多个 Docker 主机组成一个集群,使它们看起来像一个单一的 Docker 引擎。通过 Docker Swarm Mode,用户可以更轻松地管理和协调在多台主机上运行的容器应用。

Docker Swarm Mode 的核心概念:

  1. Swarm 集群 (Swarm Cluster)
    • Swarm 是由多台 Docker 主机构成的集群,这些主机可以作为集群中的节点。集群中的每个节点都可以运行 Docker 容器。
  2. 管理节点 (Manager Node)
    • 管理节点负责整个集群的控制、协调和调度任务。它们接受用户的请求,分配容器到工作节点运行。你可以有多个管理节点来确保高可用性。
  3. 工作节点 (Worker Node)
    • 工作节点仅负责在管理节点分配的任务下运行容器。工作节点不直接参与集群的管理,但会通过管理节点获取工作指令。
  4. 服务 (Service)
    • 服务 是 Swarm Mode 中的应用程序定义,它描述了需要运行的容器以及在集群中分配的方式。例如,服务可以指定在集群中运行 5 个副本的 Nginx 容器。
  5. 任务 (Task)
    • 每个服务在 Docker Swarm 中都会产生具体的 任务。任务是一个单一的容器运行单元,分配到集群中的某个节点。每个任务代表集群中的一个容器实例。
  6. 服务调度 (Service Scheduling)
    • Swarm Mode 会自动决定哪个节点来运行服务的任务。例如,如果你想要部署一个应用的 3 个副本,Swarm Mode 会自动将这些容器分布在可用的节点上。
  7. 全局服务 (Global Service)
    • Swarm Mode 支持 全局服务,即在集群中的每个节点上运行一个容器。这在需要每个节点上都有相同服务(如日志收集或监控代理)时特别有用。
  8. 滚动更新 (Rolling Update)
    • Swarm Mode 支持 滚动更新,允许你逐步更新服务,确保在更新过程中最小化应用程序中断。例如,可以逐步停止旧版本容器并启动新版本容器。

Docker Swarm Mode 的优点:

  1. 简化管理:通过 Swarm,你可以像管理单个 Docker 主机一样管理整个集群,简化了多主机环境下容器的管理。
  2. 高可用性 (High Availability):你可以配置多个管理节点来确保高可用性,即使某个节点宕机,集群仍然可以正常工作。
  3. 自动扩展与负载均衡:Swarm 可以根据定义自动扩展服务的副本数量,并提供内置的负载均衡功能,将流量分配给不同的服务副本。
  4. 安全性:Swarm Mode 集成了 TLS 加密来保证节点之间的通信安全。

Docker Swarm Mode 的常见使用场景:

  • 微服务架构:Swarm 非常适合运行微服务架构,多个微服务可以作为独立的服务在集群中运行,并根据需要动态扩展。
  • 集群中的应用部署:当需要在多个主机上运行同一应用时,Swarm 可以帮助管理这些应用实例,并确保它们平衡分布在集群中。
  • 高可用架构:当应用需要高可用时,可以使用 Swarm Mode 来确保服务在集群的多个节点上运行,避免单点故障。

简单例子:创建 Swarm 集群

  1. 添加节点到集群
    在其他主机上运行 docker swarm join 命令,并提供管理节点的 IP 地址和 Token,新的主机会加入 Swarm 集群,成为工作节点或管理节点。

创建服务
例如,要运行一个 3 个副本的 Nginx 服务:

docker service create --replicas 3 --name my_nginx nginx

这会在集群中分布运行 3 个 Nginx 容器。

初始化 Swarm 集群

docker swarm init

这会在当前主机上创建一个管理节点。

总结:

Docker Swarm Mode 提供了集群管理和编排的功能,使你可以轻松地在多主机环境中管理和扩展容器应用,同时保证高可用性和负载均衡。


docker swarm 只有两个节点的情况 docker service create --replicas 3 --name my_nginx nginx 运行3个?

在 Docker Swarm 中,即使只有两个节点,你仍然可以通过 --replicas 3 指定服务副本数为 3,Docker Swarm 会尽量满足你的副本数量要求。然而,副本的分配和调度有一些规则和行为模式:

具体情况:

  1. 副本分配:比如:
    • 如果你有两个节点,而你要求运行 3 个副本,Docker Swarm 会将 3 个容器分配到这两个节点上。
    • 一般情况下,Swarm 会尽量将副本均匀分布在两个节点上。由于你有两个节点,它会将两个副本分配到一个节点,剩下的一个副本分配到另一个节点。
    • 节点 A:运行 2 个 Nginx 容器
    • 节点 B:运行 1 个 Nginx 容器
  2. 资源不足的情况
    • 如果节点的资源(例如 CPU 或内存)不足以运行这些副本,Swarm 可能会提示错误,无法启动所有副本。你可以通过 docker service ps my_nginx 查看每个副本的状态。如果资源不足,某些副本可能会处于 Pending 状态。
  3. 节点故障的情况
    • 如果其中一个节点发生故障,Swarm 会尽量在剩余的节点上重新分配副本。
    • 例如,若节点 A 出现故障,Swarm 会尝试在节点 B 上创建足够多的容器来满足副本数(假设节点 B 资源足够)。

总结:

在只有两个节点的情况下,Swarm 可以按照你的要求运行 3 个副本,Swarm 会根据节点的数量和资源情况进行副本分配。如果没有更多的节点,Swarm 也只能在这两个节点中进行分配。


我不是很懂哦。 那公开的端口都一样的话, 怎么解决的冲突?

在 Docker Swarm 中,当你创建服务并为多个副本分配相同的公开端口时,Swarm 会通过内置的 负载均衡服务调度机制 来处理端口冲突问题,确保所有副本都能通过同一个端口访问,而不会产生冲突。

具体说明:

  1. Swarm 内置的负载均衡 (Swarm Load Balancer)
    • 当你在 Docker Swarm 中创建一个服务并公开一个端口(例如 -p 80:80),Swarm 会自动在集群中配置一个虚拟 IP(VIP),这个虚拟 IP 会将流量分发到该服务的多个副本上。
    • 即使多个副本在不同节点上运行并使用相同的内部端口(例如 80),Swarm 会在每个节点上监听这个端口,并通过 VIP 将流量根据负载均衡策略分发给相应的副本。
  2. Docker 的端口映射 (Port Mapping)
    • 在 Swarm 模式下,你不需要像在普通 Docker 环境中那样为每个容器手动映射不同的端口。在 Swarm 中,所有副本的公开端口是通过 Swarm 服务的虚拟 IP 管理的,这样可以避免端口冲突。
    • 例如,如果你运行一个有 3 个副本的服务 my_nginx 并暴露端口 80,Swarm 会在每个节点上监听端口 80,然后将请求根据负载均衡规则路由到某一个容器副本。
  3. Ingress 网络 (Ingress Network)
    • Docker Swarm 使用 Ingress 网络 来确保流量能够在集群的所有节点之间流动。即使一个服务的副本没有在某个节点上运行,只要 Swarm 集群在这个节点上监听了公开端口,Ingress 网络会将请求转发到运行副本的其他节点。
    • 例如,你有两个节点,一个节点上运行 2 个副本,另一个节点上运行 1 个副本。如果你访问任意一个节点的公开端口,Swarm 都会通过 Ingress 网络将流量分发到其他节点的副本。

如何解决端口冲突问题:

当多个副本使用相同的公开端口时,Swarm 会通过以下几种方式避免冲突:

  • 服务级别的端口公开:端口是对整个服务公开的,而不是对每个容器实例公开。因此,服务的所有副本共享同一个公开端口,而 Swarm 内部通过负载均衡来处理具体哪个副本响应请求。
  • 虚拟 IP (VIP) 负载均衡:每个服务都有一个 VIP,这个 VIP 是服务的统一入口。Swarm 会根据 VIP 将请求分配到不同节点上的副本,而不会暴露每个副本的实际容器端口。
  • Ingress 网络:即使某些副本没有在某个节点上运行,Swarm 也会通过 Ingress 网络将流量从监听端口路由到运行副本的节点,确保无论你访问哪个节点的公开端口,请求都可以被处理。

举例说明:

假设你有两个节点,创建一个 nginx 服务并要求运行 3 个副本,公开端口 80

docker service create --name my_nginx --replicas 3 -p 80:80 nginx
  • 节点 A 和 B 各自运行 2 个和 1 个 nginx 副本。
  • Swarm 在每个节点的 80 端口上监听请求。
  • 用户可以通过访问任意一个节点的 IP 地址和端口 80 访问服务,例如:
    • http://nodeA:80http://nodeB:80
  • Swarm 会自动负载均衡请求,并将流量分配到任意一个可用的 nginx 副本,无论这个副本是在节点 A 还是节点 B 上运行。

最终结果:你不需要担心端口冲突,Swarm 会确保所有节点的端口保持一致,并通过负载均衡和网络路由解决副本的访问问题。

总结:

  • Docker Swarm 使用集群的服务级别端口管理,不会为每个容器单独分配端口,而是为整个服务分配一个公开端口。
  • Swarm 内置的负载均衡和 Ingress 网络确保所有节点上监听的公开端口是统一的,并通过网络将请求路由到实际运行容器的节点,避免端口冲突问题。