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

推荐订阅源

The Register - Security
The Register - Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MyScale Blog
MyScale Blog
V
Visual Studio Blog
云风的 BLOG
云风的 BLOG
aimingoo的专栏
aimingoo的专栏
C
Check Point Blog
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
L
LangChain Blog
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Security @ Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
人人都是产品经理
人人都是产品经理
H
Hacker News: Front Page
L
Lohrmann on Cybersecurity
T
Troy Hunt's Blog
T
Threat Research - Cisco Blogs
A
About on SuperTechFans
T
Threatpost
AWS News Blog
AWS News Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
Tor Project blog
Google Online Security Blog
Google Online Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tenable Blog
W
WeLiveSecurity
博客园 - 叶小钗
K
Kaspersky official blog
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
Hugging Face - Blog
Hugging Face - Blog
M
MIT News - Artificial intelligence
Hacker News - Newest:
Hacker News - Newest: "LLM"
Engineering at Meta
Engineering at Meta
有赞技术团队
有赞技术团队
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Secure Thoughts
小众软件
小众软件
D
Docker
爱范儿
爱范儿
C
Cyber Attacks, Cyber Crime and Cyber Security
N
News and Events Feed by Topic
S
Schneier on Security
博客园 - 三生石上(FineUI控件)
D
DataBreaches.Net

博客园 - 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学习(2)-安装 docker学习(1)-基本概念 Github 使用 Self-hosted Runner 实现服务器自动化部署 github创建分支 + Pull Request 合并 Git Rebase vs Git Merge:深入理解与实战选择 Git 系统学习教程:从零到团队协作 AI学习笔记(2)-OpenClaw安装 windbg分析dmp文件 docker desktop 和 Vmware冲突的解决办法
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