当前位置:首页 > 技术 > 正文内容

使用Docker Swarm Overlay网络实现跨宿主机容器互通

访客 技术 2026年6月24日 1

背景

在Java微服务架构中,当Nacos作为配置中心时,容器默认使用Docker内网IP进行服务注册,这会导致跨宿主机的服务无法正常发现。为解决此问题,需要构建跨主机的容器网络。

前置条件

1. 宿主机防火墙端口配置

Swarm集群需要开放以下端口以确保节点间正常通信:

  • 2377/tcp:集群管理端口,用于Manager与Worker节点间的任务调度和集群状态维护。
  • 2375/tcp:Docker API通信端口,通常仅在Manager节点开启。
  • 2376/tcp:TLS加密版Docker API端口。
  • 4789/udp:VXLAN隧道端口,overlay网络跨节点通信的核心。
  • 7946/tcp + 7946/udp:节点发现与心跳保活,用于Raft协议集群状态同步。

2. Docker版本要求

Swarm模式自Docker 1.12起集成到Docker引擎中,因此版本必须高于1.12。本方案使用Docker 27.1.1(Ubuntu 22.04环境)。

Docker安装(阿里源)

# 添加GPG密钥
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

# 配置阿里源仓库
sudo sh -c 'echo "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list'

# 安装并验证
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
sudo systemctl status docker
docker --version

Swarm集群搭建

Manager节点初始化

docker swarm init --advertise-addr=192.168.0.1
# 输出示例:
# Swarm initialized: current node (maw28ll7mlxuwp47z5c5vo2v1) is now a manager.
# To add a worker to this swarm, run the following command:
# docker swarm join --token SWMTKN-xxxxxxxx 192.168.0.1:2377

Worker节点加入集群

# 执行Manager节点输出的join命令
docker swarm join --token SWMTKN-xxxxxxxx 192.168.0.1:2377

# 若需离开集群:docker swarm leave

验证节点状态

root@ubuntu22:~# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
7r4vvml8kd2jem850rqfl158h *   ubuntu22   Ready     Active         Leader           27.1.1
lrvsq6quwaxleqejf0w1nawvu     ubuntu22   Ready     Active                          27.1.1
u4v4os8zats4ro795a4l6lw3y     ubuntu22   Ready     Active                          27.1.1

创建Overlay网络

# 必须使用 --attachable 参数,否则docker-compose无法引用该网络
docker network create -d overlay --attachable test

# 查看网络列表
root@ubuntu22:~# docker network ls
NETWORK ID     NAME                   DRIVER    SCOPE
c2147e916c72   docker_gwbridge        bridge    local
7jczo6vw7mig   test                   overlay   swarm
ypqnzuafqukz   ingress                overlay   swarm

激活Overlay网络(使所有节点可见)

1. 创建测试镜像

# Dockerfile
FROM busybox
MAINTAINER devops@example.com
ENTRYPOINT  ["tail","-f","/etc/hosts"]

2. 构建并部署服务

docker build -t busybox-test .
# 创建跨节点服务,副本数3确保覆盖所有节点
docker service create --replicas 3 --name busytest --network test busybox-test

3. 验证部署

root@ubuntu22:~# docker service ls
ID             NAME        MODE         REPLICAS   IMAGE
iicn2h7rw3af   busytest    replicated   3/3        busybox-test:latest

root@ubuntu22:~# docker service ps busytest
ID             NAME            IMAGE              NODE       DESIRED STATE   CURRENT STATE
s9reawp6seu5   busytest.1      busybox-test:latest ubuntu22   Running         Running 5 min
iw3fvcy3tu14   busytest.2      busybox-test:latest ubuntu22   Running         Running 5 min
vn16j18a2jzd   busytest.3      busybox-test:latest ubuntu22   Running         Running 5 min

4. 跨节点连通性测试

# 使用docker inspect查看各容器IP
# 进入任意容器测试网络互通
docker exec -it <container_id> sh
# 在容器内执行 ping <另一节点的容器IP>

Docker Compose集成Overlay网络

version: '3.8'
services:
  app:
    image: your-app:latest
    networks:
      - test

networks:
  test:
    external: true

在docker-compose.yml中声明外部网络后,服务容器即可自动加入test overlay网络,实现跨宿主机的容器间通信。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。