惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Apple Machine Learning Research
Apple Machine Learning Research
aimingoo的专栏
aimingoo的专栏
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 聂微东
Engineering at Meta
Engineering at Meta
N
Netflix TechBlog - Medium
Blog — PlanetScale
Blog — PlanetScale
大猫的无限游戏
大猫的无限游戏
Vercel News
Vercel News
D
DataBreaches.Net
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
L
LangChain Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
F
Fortinet All Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
J
Java Code Geeks
Recent Announcements
Recent Announcements
Jina AI
Jina AI
G
Google Developers Blog
腾讯CDC
博客园_首页
博客园 - 【当耐特】

博客园 - xiashengwang

Rocky Linux 9 安装docker Rocky Linux 9 与Centos区别,以及软件安装dnf命令 《Linux 基础点滴》:(17)SSH 密钥生成与管理 – 免密登录的利器 Linux服务器安全登录:从入门到实践 putty 基础 《Linux 基础点滴》:(16)firewalld 防火墙管理命令 《Linux 基础点滴》:(15)用户管理 – 创建、删除、权限与 sudo 《Linux 基础点滴》:(14)定时任务 – 用 crontab 自动化 《Linux 基础点滴》:(13)文本编辑入门 – 使用 Vim 《Linux 基础点滴》:(12)tldr – 简化版命令手册 《Linux 基础点滴》:(11)系统信息与资源监控 – 掌握服务器状态 《Linux 基础点滴》:(10)压缩与打包 – tar 的艺术 《Linux 基础点滴》:(9)查找与过滤 – find, grep, 管道 《Linux 基础点滴》:(8)网络基础 – 查看 IP、连通性与端口 《Linux 基础点滴》:(7)进程管理 – 查看与控制运行中的程序 《Linux 基础点滴》:(6)文件权限与所有者 – 保护你的文件 《Linux 基础点滴》:(5)文件与目录操作 – 增删改查必会命令 《Linux 基础点滴》:(4)磁盘空间查看 – df 和 du 的妙用 《Linux 基础点滴》:(3)Linux 文件系统概览 – 一切皆文件 《Linux 基础点滴》:(2)SSH 连接与基础命令 – 从登录到第一次操作 《Linux 基础点滴》:(1)初识 Linux 大家族 – 发行版分类与选择 docker学习(7)-docker compose 文件 docker学习(11)- 容器的日志(log) docker学习(10)-利用Github Action 自动化部署 docker学习(8)-从 Windows 开发到 Linux 部署 docker学习(6)-数据持久化与网络通信 学会 Git Tag,让版本管理不再混乱 docker学习(5)-Dockerfile docker学习(4)-Docker常用命令 docker学习(3)-一个简单的例子
docker学习(9)-Docker Swarm + Nginx 跨机器负载均衡
xiashengwang · 2026-04-16 · via 博客园 - xiashengwang

2026-04-16 13:45  xiashengwang  阅读(13)  评论()    收藏  举报

环境说明
服务器 A(manager 主节点):green-powder-1(你现在这台)
服务器 B(worker 工作节点):另一台服务器
目标:3 个 Nginx 自动分布在两台机器上,能看到请求在两台机器之间切换
端口:9999(不冲突宿主机 Nginx)

一、先在 主节点(服务器 A) 执行

1. 确保 Swarm 初始化

docker swarm init

注意 实测2台公网机器,必须显示指定:--advertise-addr (花了1天时间找原因!!)

docker swarm init --advertise-addr <Manager公网IP>:2377

2. 获取【加入集群命令】(关键)

docker swarm join-token worker

你会得到类似这条(复制下来,等下在服务器 B 执行):

docker swarm join --token SWMTKN-1-xxxxxx 104.225.157.258:2377

注意 实测2台公网机器,必须显示指定:--advertise-addr 加入公网和自己的IP才行 (花了1天时间找原因!!)

docker swarm join --token <token> --advertise-addr <Worker公网IP>:2377 <Manager公网IP>:2377

Manager服务器 和 Worker服务器需要开放如下端口(包括服务器操作系统防火墙,云服务商控制面板的防火墙)(花了1天时间找原因!!)

  • TCP 2377(集群管理)
  • TCP 7946(Gossip 控制平面)
  • UDP 7946(Gossip 控制平面)
  • UDP 4789(VXLAN 数据平面)

二、去 服务器 B 执行

直接粘贴刚才复制的加入命令

docker swarm join --token SWMTKN-1-xxxxxx 104.225.157.258:2377

2个公网机器不是一个内网,需要用下面的命令(花了1天时间找原因!!)

docker swarm join --token <token> --advertise-addr <Worker公网IP>:2377 <Manager公网IP>:2377

看到:This node joined a swarm as a worker. ✅

三、回到 主节点 A,查看集群节点

docker node ls

你会看到 两台机器:

ID    HOSTNAME        STATUS  AVAILABILITY  MANAGER
xxx   green-powder-1  Ready   Active        Leader
yyy   green-powder-2  Ready   Active        Worker

四、【最终命令】创建跨机器 Nginx 服务

先删除旧服务

运行
docker service rm my-nginx

执行这条(最终完美版)

docker service create \
  --name my-nginx \
  --replicas 4 \
  -p 9999:80 \
  -e NODE_NAME="{{.Node.Hostname}}" \
  nginx \
  sh -c 'echo "<h2>容器:$(hostname)</h2><h2 style='color:red'>所在机器:$NODE_NAME</h2>" > /usr/share/nginx/html/index.html && nginx -g "daemon off;"'

五、查看副本分布在哪些机器

docker service ps my-nginx

你会看到:

my-nginx.1  green-powder-1
my-nginx.2  green-powder-2
my-nginx.3  green-powder-1
my-nginx.4  green-powder-2

✅ 4 个副本自动分布在两台服务器上!

六、测试负载均衡(看是否跨机器)

连续执行 curl

运行
curl http://104.225.157.258:9999
curl http://104.225.157.258:9999
curl http://104.225.157.258:9999
curl http://104.225.157.258:9999

你会看到真实效果(两台机器交替出现)

容器:my-nginx.1.xxx
所在机器:green-powder-1

容器:my-nginx.2.yyy
所在机器:green-powder-2

七、撤销 / 销毁集群(不想用就执行)

服务器 B 执行

docker swarm leave

服务器 A 执行

docker service rm my-nginx
docker swarm leave --force

实测图:
image