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

推荐订阅源

Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
WordPress大学
WordPress大学
云风的 BLOG
云风的 BLOG
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
腾讯CDC
V
V2EX
Martin Fowler
Martin Fowler
A
About on SuperTechFans
大猫的无限游戏
大猫的无限游戏
Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Check Point Blog
博客园 - 【当耐特】
Cisco Talos Blog
Cisco Talos Blog
The Hacker News
The Hacker News
K
Kaspersky official blog
Security Latest
Security Latest
H
Help Net Security
博客园_首页
美团技术团队
Spread Privacy
Spread Privacy
博客园 - 司徒正美
Hugging Face - Blog
Hugging Face - Blog
S
SegmentFault 最新的问题
G
Google Developers Blog
NISL@THU
NISL@THU
爱范儿
爱范儿
I
Intezer
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
N
News and Events Feed by Topic
P
Privacy International News Feed
Application and Cybersecurity Blog
Application and Cybersecurity Blog
S
Security @ Cisco Blogs
Schneier on Security
Schneier on Security
雷峰网
雷峰网
人人都是产品经理
人人都是产品经理
V
Vulnerabilities – Threatpost
W
WeLiveSecurity
P
Palo Alto Networks Blog
G
GRAHAM CLULEY
Hacker News: Ask HN
Hacker News: Ask HN
I
InfoQ
The Cloudflare Blog
F
Full Disclosure
SecWiki News
SecWiki News
宝玉的分享
宝玉的分享
N
Netflix TechBlog - Medium

博客园 - 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