news 2026/3/29 0:27:10

Docker Swarm

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Docker Swarm

Docker Swarm

在单机容器排布中,我们定义容器启动顺序,和一件启动,采用了Docker Compose,如果是生产环境多机器部署,我们需要用到Docker Swarm ,下面请看官网描述:

  • 集群模式是管理 Docker 守护进程集群的高级功能
  • 如果您打算将 Swarm 用作生产运行时环境,请使用 Swarm 模式
  • 如果您不打算使用 Swarm 进行部署,请改用 Docker Compose

Docker Swarm的先决条件

你必须要有docker,如果已经运行了Docker Swarm 输入命令docker system info查看信息
如果没有运行 需要初始化Swarm集群docker swarm init

Swarm 服务和Kubernetes 服务

这两个编排器对“服务”一词的定义截然不同。在 Swarm 中,服务同时提供调度和网络功能,负责创建容器并提供将流量路由到这些容器的工具。而在 Kubernetes 中,调度和网络功能是分开处理的,部署(或其他控制器)负责将容器调度为 Pod,而服务仅负责为这些 Pod 添加网络功能

创建和加入Swarm集群

所有机器都可通过网络通信,并都安装了Docker引擎 端口设置
必须启用以下端口。在某些系统中,这些端口默认是开放的

  • 2377用于与管理节点通信的 TCP端口
  • 7946用于覆盖网络节点发现的 TCP/UDP端口
  • 4789用于覆盖网络流量的 UDP端口(可配置)

端口4789是 Swarm 数据路径端口(也称为 VXLAN 端口)的默认值。务必阻止任何不受信任的流量到达此端口,因为 VXLAN 不提供身份验证。此端口只能对受信任的网络开放,切勿在边界防火墙上开放

# 临时关闭防火墙(测试环境) systemctl stop firewalld # 生产环境推荐开放指定端口(2377集群管理、7946节点通信、4789网络通信) firewall-cmd --permanent --add-port=2377/tcp firewall-cmd --permanent --add-port=7946/tcp firewall-cmd --permanent --add-port=7946/udp firewall-cmd --permanent --add-port=4789/udp firewall-cmd --reload

--advertise-addr标志将管理节点配置为发布其地址IP。集群中的其他节点必须能够通过该 IP 地址访问管理节点

docker swarm init --advertise-addr <MANAGER-IP> ## 输出信息有加入本集群的token docker swarm init --advertise-addr 192.168.99.100 Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager. To add a worker to this swarm, run the following command: docker swarm join \ --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \ 192.168.99.100:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

此时查看node情况,会出现已经准备好的Manager 节点信息

docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS dxn1zf6l61qsb1josjja83ngz * manager1 Ready Active Leader

加入Swarm集群

在另一台工作机器上输入join --token命令即可加入Swarm集群,集群中的manager和worker可以指定,也可以修改升级或者降级

docker swarm join \ --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \ 192.168.99.100:2377 This node joined a swarm as a worker.

Docker Swarm 部署服务

  • docker service create命令用于创建服务。
  • --name标志用于指定服务helloworld
  • --replicas标志指定 1 个正在运行的实例的期望状态。
  • 这些参数alpine ping docker.com将服务定义为执行命令的 Alpine Linux 容器ping docker.com
docker service create --replicas 1 --name helloworld alpine ping docker.com 9uk4639qpg7npwf3fn2aasksr

运行docker service ls以下命令查看正在运行的服务列表,如果我们集群只有三台机器,但是我指定的副本是4个,也可以,会随机分配,并不一定是一台机器一个

docker service ls ID NAME SCALE IMAGE COMMAND 9uk4639qpg7n helloworld 1/1 alpine ping docker.com

运行docker service inspect --pretty <SERVICE-ID>以显示有关服务的详细信息
如果要以 json 格式返回服务详细信息,请运行不带--pretty标志的相同命令

[manager1]$ docker service inspect --pretty helloworld ID: 9uk4639qpg7npwf3fn2aasksr Name: helloworld Service Mode: REPLICATED Replicas: 1 Placement: UpdateConfig: Parallelism: 1 ContainerSpec: Image: alpine Args: ping docker.com Resources: Endpoint Mode: vip

运行以下命令docker service ps <SERVICE-ID>查看哪些节点正在运行该服务

[manager1]$ docker service ps helloworld NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS helloworld.1.8p1vev3fq5zm0mi8g0as41w35 alpine worker2 Running Running 3 minutes

在集群中扩展服务

docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>

docker service scale helloworld=5 helloworld scaled to 5

在集群中删除服务

docker service rm helloworld helloworld

服务滚动更新

部署一个基于 Redis 7.4.0 容器镜像的服务。然后,将使用滚动更新的方式将该服务升级到 Redis 7.4.1 容器镜像
--update-delay标志位用于配置服务任务或任务集更新之间的延迟时间

docker service create \ --replicas 3 \ --name redis \ --update-delay 10s \ redis:7.4.0 0u6a4s31ybk7yw2wyvtikmu50

发布服务端口

创建服务时,可以使用该--publish标志发布端口。` --port`target用于指定容器内部的端口,`published--bind` 用于指定路由网格上绑定的端口。如果省略端口published,则每个服务任务都会绑定一个随机的高位端口

eg:将 nginx 容器中的 80 端口发布到 swarm 集群中任何节点的 8080 端口

docker service create \ --name my-web \ --publish published=8080,target=80 \ --replicas 2 \ nginx

绕过路由网格

默认情况下,发布端口的 Swarm 服务会使用路由网格。当您连接到任何 Swarm 节点上发布的端口时(无论该节点是否运行特定服务),您都会被透明地重定向到运行该服务的工作节点。实际上,Docker 充当了 Swarm 服务的负载均衡器

要绕过路由网格,必须使用长--publish服务并设置mode`--password` 参数host。如果省略该mode参数或将其设置为 `--password`ingress,则会使用路由网格

docker service create --name dns-cache \ --publish published=53,target=53,protocol=udp,mode=host \ --mode global \ dns-cache

overlay网络

Docker集群会产生两种不同的流量:

  • 控制和管理平面流量:这包括集群管理消息,例如加入或离开集群的请求。此类流量始终加密。

  • 应用数据平面流量:包括容器流量以及与外部客户端之间的流量。

当您初始化一个集群或将 Docker 主机加入现有集群时,会在该 Docker 主机上创建两个新网络:

  • 一个名为 `<overlay_network>` 的覆盖网络ingress,用于处理与 Swarm 服务相关的控制和数据流量。当您创建 Swarm 服务但未将其连接到用户定义的覆盖网络时,它ingress默认连接到该网络。
  • 一个名为 的桥接网络docker_gwbridge,它将各个 Docker 守护进程连接到参与集群的其他守护进程

创建覆盖网络

在Manager 节点创建网络

# 创建名为 test-network 的overlay网络(自定义网络名可修改)

  • --driver overlay:指定网络类型为 overlay,这是 Swarm 集群跨节点通信的唯一支持类型;
  • --attachable:允许手动创建的容器(非 Swarm Service)也能加入该网络,提升灵活性;
  • think-big-network:自定义网络名称,后续部署服务时需引用该名称
docker network create --driver overlay --attachable test-network

验证网络是否创建成功,在Manager节点上执行

docker network ls | grep test-network

部署服务指定ip和网络(用主机名约束更加稳妥

# 方式1:用IP约束部署 docker service create \ --name redis-service \ --network test-network \ # 加入自定义网络 --constraint node.ip==10.19.1.2 \ # 强制部署到10.19.1.2 --publish 6379:6379 \ # 端口映射 --replicas 1 \ # 单副本 redis:latest # 镜像名 # 方式2:用主机名约束(替换为10.19.1.2的实际主机名,如redis-node) # docker service create \ # --name redis-service \ # --network test-network \ # --constraint node.hostname==redis-node \ # --publish 6379:6379 \ # --replicas 1 \ # redis:latest

数据持久化,例如Mysql(--mount)

# 部署MySQL时添加数据挂载 docker service create \ --name db-service \ --network think-big-network \ --constraint node.ip==10.19.3.1 \ --publish 3306:3306 \ --replicas 1 \ --env MYSQL_ROOT_PASSWORD=123456 \ --mount type=bind,src=/home/ubuntu/mysql/data,dst=/var/lib/mysql \ # 数据持久化挂载 mysql:8.0

验证网络通信(直接用服务名,overlay网络自动解析

# 进入app-service容器 docker exec -it $(docker ps | grep app-service | awk '{print $1}') /bin/bash # ping Redis服务(直接用服务名,overlay网络自动解析) ping redis-service # ping 数据库服务 ping db-service # ping MinIO服务 ping minio-service
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/14 3:54:24

容量规划预测模型:基础设施投入精准测算

容量规划预测模型&#xff1a;基础设施投入精准测算 在AI服务大规模上线的今天&#xff0c;一个看似简单的问题却困扰着无数工程团队&#xff1a;我们到底需要多少GPU&#xff1f;采购少了&#xff0c;大促期间系统崩盘&#xff1b;买多了&#xff0c;资源常年闲置&#xff0c;…

作者头像 李华
网站建设 2026/3/21 5:33:49

日志留存策略优化:存储成本与法规遵从平衡

TensorRT 推理优化实战&#xff1a;如何释放 GPU 的极致性能 在自动驾驶系统每秒处理上千帧图像、智能客服要求毫秒级响应的今天&#xff0c;模型推理早已不再是“能跑就行”的阶段。当一个训练好的 PyTorch 模型从实验室走向生产环境时&#xff0c;真正的挑战才刚刚开始——我…

作者头像 李华
网站建设 2026/3/26 22:03:05

NVIDIA TensorRT镜像安装与配置最简教程

NVIDIA TensorRT镜像安装与配置最简教程 在AI模型日益复杂、部署场景愈加多样化的今天&#xff0c;推理性能已经成为决定系统能否落地的关键瓶颈。一个训练得再好的模型&#xff0c;如果在线上服务中响应迟缓、吞吐低下&#xff0c;那它的实际价值将大打折扣。尤其是在自动驾驶…

作者头像 李华
网站建设 2026/3/24 14:24:58

多语言翻译服务质量保障:通信无国界的基石

多语言翻译服务质量保障&#xff1a;通信无国界的基石 在全球化浪潮席卷各行各业的今天&#xff0c;企业跨国协作、科研机构联合攻关、用户跨语言社交已成常态。然而&#xff0c;语言鸿沟依然是信息流通的隐形壁垒。尽管深度学习驱动的神经机器翻译&#xff08;NMT&#xff09;…

作者头像 李华
网站建设 2026/3/21 20:12:23

跨区域数据同步加速:全球化业务的底层支撑

跨区域数据同步加速&#xff1a;全球化业务的底层支撑 在当今全球化的数字生态中&#xff0c;用户对服务响应速度的容忍度正变得越来越低。无论是欧洲消费者在午夜下单购物、东南亚用户与语音助手对话&#xff0c;还是美洲金融机构进行实时反欺诈决策&#xff0c;他们都不希望因…

作者头像 李华
网站建设 2026/3/26 15:41:39

植物养护提醒机器人:阳台绿植不再轻易枯萎

植物养护提醒机器人&#xff1a;阳台绿植不再轻易枯萎 在城市生活的方寸阳台上&#xff0c;一盆绿植往往承载着人们对自然的向往。然而&#xff0c;工作繁忙、出差频繁&#xff0c;常常让人忘记浇水、忽视光照——再顽强的生命也扛不住长期疏于照料。于是&#xff0c;我们开始思…

作者头像 李华