摘要: 在微服务架构的浪潮中,服务发现机制如同城市的交通导航系统------没有它,服务间的通信将陷入混乱。本文将深入探讨如何利用 Docker Swarm 这一原生容器编排工具,构建高可用的 Eureka 服务注册中心集群,为您的微服务生态系统奠定坚实可靠的基础。
引言:当微服务遇见容器编排
想象这样一个场景:您的电商平台拥有用户服务、订单服务、支付服务等数十个微服务实例,它们动态伸缩、随时可能迁移。如何让这些"移动的居民"始终能找到彼此?这正是服务注册中心要解决的核心问题。
Eureka,作为 Netflix 开源的服务发现组件,以其简洁的设计和 Spring Cloud 生态的完美集成,成为众多企业的选择。然而,单节点的 Eureka Server 存在单点故障风险------这就像只有一个电话总机的城市,一旦故障,整个通信网络将陷入瘫痪。
Docker Swarm 作为 Docker 原生的集群管理工具,以其轻量、易用和与 Docker 引擎的无缝集成,为 Eureka 的高可用部署提供了优雅的解决方案。与 Kubernetes 相比,Swarm 的学习曲线更平缓,配置更简洁,特别适合中小规模团队快速构建生产级容器集群。
本文将带您从零开始,一步步构建一个三节点 Eureka 集群,实现:
- 自动服务注册与发现:微服务实例自动注册并实时更新状态
- 高可用与故障转移:任一节点故障不影响整体服务发现功能
- 负载均衡:客户端自动在可用 Eureka 节点间分发请求
- 配置即代码:所有配置版本化管理,确保环境一致性
技术栈全景图
在深入部署细节前,让我们先俯瞰整个架构的技术全景:
bash
┌─────────────────────────────────────────────────────────┐
│ Docker Swarm 集群 │
├──────────────┬──────────────┬──────────────┬─────────────┤
│ Manager节点 │ Worker节点1 │ Worker节点2 │ Worker节点3 │
│ (Leader) │ │ │ │
├──────────────┼──────────────┼──────────────┼─────────────┤
│ │ │ │ │
│ Eureka │ Eureka │ Eureka │ 可选扩展 │
│ Server 1 │ Server 2 │ Server 3 │ 节点 │
│ (副本) │ (副本) │ (副本) │ │
└──────────────┴──────────────┴──────────────┴─────────────┘
│ │ │
└──────────────┼──────────────┘
↓
┌─────────────────────────┐
│ 服务消费者/提供者集群 │
│ (SpringCloud 微服务 ) │
└─────────────────────────┘
为什么选择 Docker Swarm + Eureka?
1. 轻量级与原生集成
Docker Swarm 直接内置于 Docker Engine 中,无需额外组件。对于已经熟悉 Docker 的团队,几乎可以零成本上手集群管理。
2. 声明式服务部署
只需一个 docker stack deploy 命令,即可完成整个 Eureka 集群的部署、扩展和更新,真正实现"基础设施即代码"。
3. 内置的服务发现与负载均衡
Swarm 自带 DNS 轮询和 VIP(虚拟 IP)机制,与 Eureka 的服务发现能力形成互补,提供双重保障。
4. 滚动更新与零停机部署
通过 Swarm 的滚动更新策略,可以无缝升级 Eureka 集群版本,确保服务注册中心本身的高可用性不中断。
实战预览:三行命令启动集群
在详细解析配置之前,让我们先睹为快------使用 Docker Swarm 部署 Eureka 集群可以如此简洁:
bash
# 初始化 Swarm 集群
docker swarm init
# 部署 Eureka 集群栈
docker stack deploy -c docker-compose.yml eureka-cluster
# 查看集群状态
docker service ls
但这简洁的背后,是精心设计的配置和架构思考。接下来,我们将深入每个技术细节,从网络配置到健康检查,从服务注册到客户端集成,完整呈现一个生产可用的 Eureka 集群部署方案。
准备好了吗?让我们开始这段构建高可用服务发现中心的旅程。 无论您是初次接触容器编排,还是希望优化现有微服务架构,本文都将为您提供清晰、实用的指导。我们将从环境准备开始,逐步深入到高级配置和故障排除,确保您能够掌握每个关键环节。
部署准备:构建你的容器化实验环境
环境是成功部署的第一步。 在开始 Docker Swarm 集群部署之前,我们需要搭建一个标准化的实验环境。本节将指导您准备 7 台虚拟机并完成 Docker 环境的统一配置,确保后续部署流程的顺畅进行。
一、环境规划与架构设计
1.1 集群节点规划
我们建议使用 7台虚拟机 来模拟生产环境,具体角色分配如下:
| 节点名称 | IP地址示例 | 角色 | 配置要求 | 说明 |
|---|---|---|---|---|
| cluster-node-100 | 192.168.239.100 | 管理节点(Leader) | 2核CPU,2GB内存 | 集群管理、调度决策 |
| cluster-node-101 | 192.168.239.101 | 管理节点(Manager) | 2核CPU,2GB内存 | 管理节点高可用 |
| cluster-node-102 | 192.168.239.102 | 管理节点(Manager) | 2核CPU,2GB内存 | 管理节点高可用 |
| cluster-node-103 | 192.168.239.103 | 工作节点(Worker) | 2核CPU,2GB内存 | 运行 Eureka 服务实例 |
| cluster-node-104 | 192.168.239.104 | 工作节点(Worker) | 2核CPU,2GB内存 | 运行 Eureka 服务实例 |
| cluster-node-105 | 192.168.239.105 | 工作节点(Worker) | 2核CPU,2GB内存 | 运行 Eureka 服务实例 |
| cluster-node-106 | 192.168.239.106 | 工作节点(Worker) | 2核CPU,2GB内存 | 运行 Eureka 服务实例 |
虚机列表:
- 管理节点
3



- 工作节点
4

架构说明:
- 3 个管理节点:确保 Swarm 集群管理平面的高可用(Raft 共识算法要求奇数节点)
- 4 个工作节点:运行 Eureka Server 及其他微服务
- 分离部署:管理节点与工作节点分离,符合生产环境最佳实践
1.2 网络规划
text
192.168.239.0/24 # 集群内部通信网络
├── 192.168.239.100-102 # 管理节点 IP 段
└── 192.168.239.103-106 # 工作节点 IP 段
# 端口规划
├── 2377/tcp # Swarm 集群管理端口
├── 7946/tcp+udp # 节点发现端口
├── 4789/udp # overlay 网络 VXLAN 端口
└── 8761/tcp # Eureka Server 控制台端口
注:可以自己使用 ping 命令检验这 7 台虚机的网络互通性。
二、Docker 环境安装与配置
鉴于我们是需要在 7 台虚机同时安装 Docker、Docker Compose(可选)的容器部署环境,为了避免重复冗余的准备操作,我这里使用 MobaXterm 的多执行对 7 台虚机批量进行安装。
2.1 在所有的节点安装 Docker
Docker 支持 64 位版本 CentOS 7/8,并且要求内核版本不低于 3.10。 CentOS 7 满足最低内核的要求,但由于内核版本比较低,部分功能(如overlay2存储层驱动)无法使用,并且部分功能可能不太稳定。
- 卸载旧版本
旧版本的Docker称为 docker 或者 docker-engine ,使用以下命令卸载旧版本,如果从未安装过,可略过该步骤。
bash
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
- 安装依赖包
bash
sudo yum install -y yum-utils

如果安装过程中出现如下问题,可通过更换仓库源进行修复,如果没有该问题,忽视即可。
bash
[root@cluster-node-100 ~]# sudo yum install -y yum-utils
已加载插件:fastestmirror, langpacks
Determining fastest mirrors
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was
14: curl#6 - "Could not resolve host: mirrorlist.centos.org; 未知的错误"
One of the configured repositories failed (未知),
and yum doesn't have enough cached data to continue. At this point the only
safe thing yum can do is fail. There are a few ways to work "fix" this:
1. Contact the upstream for the repository and get them to fix the problem.
2. Reconfigure the baseurl/etc. for the repository, to point to a working
upstream. This is most often useful if you are using a newer
distribution release than is supported by the repository (and the
packages for the previous distribution release still work).
3. Run the command with the repository temporarily disabled
yum --disablerepo=<repoid> ...
4. Disable the repository permanently, so yum won't use it by default. Yum
will then just ignore the repository until you permanently enable it
again or use --enablerepo for temporary usage:
yum-config-manager --disable <repoid>
or
subscription-manager repos --disable=<repoid>
5. Configure the failing repository to be skipped, if it is unavailable.
Note that yum will try to contact the repo. when it runs most commands,
so will have to try and fail each time (and thus. yum will be be much
slower). If it is a very temporary problem though, this is often a nice
compromise:
yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true
Cannot find a valid baseurl for repo: base/7/x86_64
执行下列命令进行修复:
bash
# 删除旧仓库
rm -f /etc/yum.repos.d/CentOS-Base.repo
# 下载新仓库
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 清理
yum clean all
- 切换镜像源
鉴于国内网络问题,强烈建议使用国内源,官方源请在注释中查看。
执行下面的命令添加 yum 软件源:
bash
# 官方源
sudo yum-config-manager \
--add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 国内源(推荐)
sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 使用sed工具在文件docker-ce.repo中进行字符串替换
# 目标字符:download.docker.com
# 替换后字符:mirrors.aliyun.com/docker-ce
# 通常目的是为了将 Docker 的源更改为阿里云的镜像源,以加快下载和安装的速度
sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
- 安装 Docker
bash
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
安装过程中可能会因为部分虚机网络波动造成的安装失败,重试即可。

- 修改镜像源
bash
# 写入配置
cat <<EOF > /etc/docker/daemon.json
{
"data-root": "$HOME/.docker/",
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.xuanyuan.me",
"https://docker.m.daocloud.io",
"https://dockerproxy.net",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://registry.docker-cn.com"
]
}
EOF
# 重启
systemctl daemon-reload
systemctl restart docker
- 设置开机自启动
bash
# 查看已经启动的服务:
systemctl list-units --type=service
# Docker 启动命令
systemctl start docker
# 查看是否设置开机启动
systemctl list-unit-files | grep docker
# 设置开机启动
systemctl enable docker.service
# 取消开机启动,执行命令
systemctl disable docker.service
- 验证 Docker 配置
bash
docker info

2.2 在所有的节点安装 Docker Compose
- 安装 Docker Compose
bash
# 下载
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" \
-o /usr/local/bin/docker-compose
# 这是我找的代理生成的加速地址(下载快一点,你也可以去找一个代理的服务,该条命令仅作参考,不确保有效)
sudo curl -L "https://gh-proxy.org/https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" \
-o /usr/local/bin/docker-compose
# 提权
sudo chmod +x /usr/local/bin/docker-compose
# 建立链接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
- 验证版本号
bash
docker-compose --version

三、初始化 Docker Swarm 集群
请按照前面规划好的主机所担任的角色进行执行下列操作步骤。
- 修改 Docker 监听配置
192.168.239.100
bash
# 1. 停止 Docker 服务
sudo systemctl stop docker.socket docker.service
# 2. 修改配置
sudo systemctl edit docker
# 添加:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2377
# 3. 重新加载
sudo systemctl daemon-reload
# 4. 清理 Swarm 数据
# sudo rm -rf /var/lib/docker/swarm
sudo rm -rf $HOME/.docker/swarm
# 5. 启动服务
sudo systemctl restart docker
- 初始化集群
192.168.239.100
bash
# 示例
[root@cluster-node-100 ~]# docker swarm init --advertise-addr 192.168.239.100
Swarm initialized: current node (e8uvzhylptnp5huonkxbw1r7p) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-059gio4mm0npu01x5i8bk6bo9k36fgw34zw1ynhlvl1qa37917-01uh1bywte9vdrzgmlve3kor7 192.168.239.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
- 查看 IPv4 监听状态
192.168.239.100
bash
ss -tlnp | grep 2377
- 所有节点防火墙需开放集群端口
all
bash
# sudo firewall-cmd --permanent --add-port=7946/tcp
# sudo firewall-cmd --permanent --add-port=7946/udp
# sudo firewall-cmd --permanent --add-port=4789/udp
sudo firewall-cmd --permanent --add-port=2377/tcp
sudo firewall-cmd --reload
- 获取 Manager 加入 Token
192.168.239.100
bash
# 示例
[root@cluster-node-100 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-059gio4mm0npu01x5i8bk6bo9k36fgw34zw1ynhlvl1qa37917-2cv5kz0zbyz4zkvl9lulxhetn 192.168.239.100:2377
- 作为管理者加入
192.168.239.101192.168.239.102
bash
# 示例 192.168.239.101
[root@cluster-node-101 ~]# docker swarm join --token SWMTKN-1-059gio4mm0npu01x5i8bk6bo9k36fgw34zw1ynhlvl1qa37917-2cv5kz0zbyz4zkvl9lulxhetn 192.168.239.100:2377 --advertise-addr 192.168.239.101
This node joined a swarm as a manager.
# 示例 192.168.239.102
[root@cluster-node-102 ~]# docker swarm join --token SWMTKN-1-059gio4mm0npu01x5i8bk6bo9k36fgw34zw1ynhlvl1qa37917-2cv5kz0zbyz4zkvl9lulxhetn 192.168.239.100:2377 --advertise-addr 192.168.239.102
This node joined a swarm as a manager.
- 作为工作者加入
192.168.239.103192.168.239.104192.168.239.105192.168.239.106
bash
# 示例 192.168.239.103
[root@cluster-node-103 ~]# docker swarm join --token SWMTKN-1-059gio4mm0npu01x5i8bk6bo9k36fgw34zw1ynhlvl1qa37917-01uh1bywte9vdrzgmlve3kor7 192.168.239.100:2377
This node joined a swarm as a worker.
# 示例 192.168.239.104
[root@cluster-node-104 ~]# docker swarm join --token SWMTKN-1-059gio4mm0npu01x5i8bk6bo9k36fgw34zw1ynhlvl1qa37917-01uh1bywte9vdrzgmlve3kor7 192.168.239.100:2377
This node joined a swarm as a worker.
# 示例 192.168.239.105
[root@cluster-node-105 ~]# docker swarm join --token SWMTKN-1-059gio4mm0npu01x5i8bk6bo9k36fgw34zw1ynhlvl1qa37917-01uh1bywte9vdrzgmlve3kor7 192.168.239.100:2377
This node joined a swarm as a worker.
# 示例 192.168.239.106
[root@cluster-node-106 ~]# docker swarm join --token SWMTKN-1-059gio4mm0npu01x5i8bk6bo9k36fgw34zw1ynhlvl1qa37917-01uh1bywte9vdrzgmlve3kor7 192.168.239.100:2377
This node joined a swarm as a worker.
四、准备需要部署的镜像及编排模板
- 部署镜像准备
为了节省时间,我提前准备好了 2 个版本的镜像,如果你也想尝试,请移步至 hub.docker.com/r/caixb/spr... 查阅相关部署手册。

- 编排模板制作
yml
version: '3.8'
services:
eureka:
image: caixb/spring-cloud-eureka:1.0
deploy:
mode: replicated
replicas: 2
# placement:
# constraints:
# - "node.role==worker"
# preferences:
# - spread: node.labels.zone
resources:
limits:
cpus: '0.25'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
update_config:
parallelism: 1
delay: 10s
failure_action: continue
monitor: 60s
max_failure_ratio: 0.3
ports:
- target: 8761
published: 8761
protocol: tcp
mode: ingress
environment:
# 设置为服务名称,方便服务间通信
- HOSTNAME=eureka
# eureka 服务端口(默认8761)
- SERVER_PORT=8761
# eureka 应用名称(默认 autumnnook-eureka)
- APPLICATION_NAME=spring-cloud-eureka
# Eureka 管理员用户名(默认soaadmin)
- EUREKA_ADMIN_NAME=soaadmin
# Eureka 管理员密码(默认 jsepc01!)
- EUREKA_ADMIN_PASSWORD=jsepc01
# 是否开启 Eureka 自我保护机制(默认 true)
- ENABLE_SELF_PRESERVATION=true
# 服务剔除间隔时间,单位毫秒(默认30000)
- EVICTION_INTERVAL_TIMER_IN_MS=30000
# 续约百分比阈值(默认0.85)
- RENEWAL_PERCENT_THRESHOLD=0.85
# 实例优先使用IP地址(默认 false)
- PREFER_IP_ADDRESS=false
# 心跳发送间隔(秒)(默认 10 s)
- LEASE_RENEWAL_INTERVAL_IN_SECONDS=10
# 是否从Eureka服务器获取注册表(默认 false)
- FETCH_REGISTRY=false
# 是否向Eureka服务器注册自己(默认 false)
- REGISTER_WITH_EUREKA=false
# Eureka集群节点地址列表
- EUREKA_PEERS=http://soaadmin:jsepc01@eureka:8761/eureka/
# 监控端点配置
- ENDPOINTS=info,health
# 排除的端点
- EXCLUDE_ENDPOINTS=shutdown,autoconfig,mappings,dump,trace,heapdump
# 是否启用Shutdown端点(默认 false)
- ENABLE_SHOWDOWN=false
networks:
- cluster-network
networks:
cluster-network:
driver: overlay
attachable: true
将编排文件上传至任意 管理者节点 服务器中。
- 部署服务
执行下述命令,即可部署成功。
bash
# 可以更改镜像版本后重复执行,类似版本更新
docker stack deploy --compose-file stack.yml <服务名>
# 示例
[root@cluster-node-100 ~]# docker stack deploy --compose-file stack.yml springcloud
Since --detach=false was not specified, tasks will be created in the background.
In a future release, --detach=false will become the default.
Creating network springcloud_cluster-network
Creating service springcloud_eureka
部署之前,尽量先保证所有节点上都有要部署的镜像,防止过程中因网络波动造成镜像拉取失败。
- 查看服务列表
bash
docker stack services stack.yml <栈名>
# 示例
[root@cluster-node-100 ~]# docker stack services springcloud
ID NAME MODE REPLICAS IMAGE PORTS
qzp0g2cmzjb9 springcloud_eureka replicated 0/2 caixb/spring-cloud-eureka:1.0 *:8761->8761/tcp
- 查看服务详情
bash
docker service inspect <服务名>
# 示例
[root@cluster-node-100 ~]# docker service inspect springcloud_eureka
[
{
"ID": "v3ulzox923i6odz99ju3g38x4",
"Version": {
"Index": 84
},
"CreatedAt": "2025-12-19T05:52:17.511209204Z",
"UpdatedAt": "2025-12-19T05:52:17.626604661Z",
"Spec": {
"Name": "springcloud_eureka",
"Labels": {
"com.docker.stack.image": "caixb/spring-cloud-eureka:1.0",
"com.docker.stack.namespace": "springcloud"
},
"TaskTemplate": {
"ContainerSpec": {
"Image": "caixb/spring-cloud-eureka:1.0@sha256:3a70773f0361e2120efa66aa3bb643417db01ec3c3d6401042685214720d2f8f",
"Labels": {
"com.docker.stack.namespace": "springcloud"
},
"Env": [
"APPLICATION_NAME=spring-cloud-eureka",
"ENABLE_SELF_PRESERVATION=true",
"ENABLE_SHOWDOWN=false",
"ENDPOINTS=info,health",
"EUREKA_ADMIN_NAME=soaadmin",
"EUREKA_ADMIN_PASSWORD=jsepc01",
"EUREKA_PEERS=http://soaadmin:jsepc01@eureka:8761/eureka/",
"EVICTION_INTERVAL_TIMER_IN_MS=30000",
"EXCLUDE_ENDPOINTS=shutdown,autoconfig,mappings,dump,trace,heapdump",
"FETCH_REGISTRY=false",
"HOSTNAME=eureka",
"LEASE_RENEWAL_INTERVAL_IN_SECONDS=10",
"PREFER_IP_ADDRESS=false",
"REGISTER_WITH_EUREKA=false",
"RENEWAL_PERCENT_THRESHOLD=0.85",
"SERVER_PORT=8761"
],
"Privileges": {
"CredentialSpec": null,
"SELinuxContext": null,
"NoNewPrivileges": false
},
"StopGracePeriod": 10000000000,
"DNSConfig": {},
"Isolation": "default"
},
....more
- 查看服务任务(容器)
bash
docker service ps <服务名>
# 示例
[root@cluster-node-100 ~]# docker service ps springcloud_eureka
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
s11j55pvdysp springcloud_eureka.1 caixb/spring-cloud-eureka:1.0 cluster-node-102 Running Running 2 minutes ago
33vm1k0ebzca springcloud_eureka.2 caixb/spring-cloud-eureka:1.0 cluster-node-101 Running Running 2 minutes ago
- 查看服务日志
bash
docker service logs <服务名>
# 示例
[root@cluster-node-100 ~]# docker service logs springcloud_eureka
springcloud_eureka.2.33vm1k0ebzca@cluster-node-101 |
springcloud_eureka.2.33vm1k0ebzca@cluster-node-101 | . ____ _ __ _ _
springcloud_eureka.2.33vm1k0ebzca@cluster-node-101 | /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
springcloud_eureka.2.33vm1k0ebzca@cluster-node-101 | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
springcloud_eureka.2.33vm1k0ebzca@cluster-node-101 | \\/ ___)| |_)| | | | | || (_| | ) ) ) )
springcloud_eureka.2.33vm1k0ebzca@cluster-node-101 | ' |____| .__|_| |_|_| |_\__, | / / / /
springcloud_eureka.2.33vm1k0ebzca@cluster-node-101 | =========|_|==============|___/=/_/_/_/
springcloud_eureka.2.33vm1k0ebzca@cluster-node-101 | :: Spring Boot :: (v2.1.3.RELEASE)
springcloud_eureka.2.33vm1k0ebzca@cluster-node-101 |
springcloud_eureka.2.33vm1k0ebzca@cluster-node-101 | 2025-12-19 13:54:47.750 INFO 7 --- [ main] com.autumnnook.EurekaApplication : No active profile set, falling back to default profiles: default
...more
- 滚动更新
bash
docker service update --image caixb/spring-cloud-eureka:2.0 <服务名>
# 示例
[root@cluster-node-100 ~]# docker service update --image caixb/spring-cloud-eureka:2.0 springcloud_eureka
springcloud_eureka
overall progress: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service springcloud_eureka converged
- 副本控制
bash
docker service scale <服务名>=<数量>
# 示例
[root@cluster-node-100 ~]# docker service scale springcloud_eureka=3
springcloud_eureka scaled to 3
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service springcloud_eureka converged
- 查看分配的 IP(VIP)
bash
docker service inspect \
--format '{{range $p := .Endpoint.VirtualIPs}}{{println $p.Addr}}{{end}}' \
<服务名>
# 示例
[root@cluster-node-100 ~]# docker service inspect --format '{{range $p := .Endpoint.VirtualIPs}}{{println $p.Addr}}{{end}}' springcloud_eureka
10.0.0.12/24
10.0.3.7/24
- 回滚到前一个版本
bash
docker service rollback <服务名>
# 示例
[root@cluster-node-100 ~]# docker service rollback springcloud_eureka
springcloud_eureka
rollback: manually requested rollback
overall progress: rolling back update: 2 out of 2 tasks
1/2: running [==================================================>]
2/2: running [==================================================>]
verify: Service springcloud_eureka converged
- 节点退出集群环境
bash
docker swarm leave
docker swarm leave --force
五、安装 Portainer 可视化管理面板(可选)
- 拉取中文版镜像
bash
docker pull 6053537/portainer-ce
- 创建数据卷
bash
docker volume create portainer_data
- 启动
bash
docker run -d --name portainer \
-p 9000:9000 \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
6053537/portainer-ce
- 查看服务集群状态

- 查看服务列表

我们能够清楚的看到 eureka 服务创建了 2 个副本服务,Swarm 内置了负载均衡机制,可以自动为服务分配虚拟 IP(VIP)或使用 DNS 轮询(DNS Round-Robin)方式,将外部客户端的请求分发到服务的不同实例。
六、安装 1Panel 运维管理面板(可选)
- 下载离线包
下载地址: community.fit2cloud.com/#/download/...
- 解压离线包
bash
mv 1panel-v1.10.33-lts-linux-amd64.tar.gz /tmp
cd /tmp
tar zxvf 1panel-v1.10.33-lts-linux-amd64.tar.gz
- 执行安装脚本
bash
cd 1panel-v1.10.33-lts-linux-amd64
/bin/bash install.sh
安装成功后进入:
