首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Docker】 Docker容器的同宿主机不同网络容器通信+跨宿主机容器之间网络互连详解

概述

就Docker自身默认的网络来说,单台主机上的不同Docker容器可以借助docker0网桥进行直接通信,这没毛病,而不同主机上的Docker容器之间通过在主机上用映射端口的方法来进行通信,有时会很不方便,甚至不能满足需求。

因此位于不同物理机上的Docker容器之间直接使用本身的IP地址进行直接通信很有必要。再者说如果将Docker容器起在不同的物理主机上,我们不可避免的会遭遇到Docker容器的跨主机通信问题。

Docker容器网络连接基础

众多网络方案是如何与docker集成在一起的?

libnetwork docker容器网络库

CNM (Container Network Model)这个模型对容器网络进行了抽象

跨主机容器连接方案

使用网桥实现跨主机容器连接

使用Open vSwitch实现跨主机容器连接

使用weave实现跨主机容器连接

本文以局域网内的Docker跨主机通信为例,先尝试一下直接路由方式的跨主机通信。

情景构造

如下图所示,我们有两个物理主机1和主机2,我们在各自宿主机上启动一个CentOS的Linux容器,启动成功之后,两个容器分别运行在两个宿主机之上,默认的IP地址分配如图所示,这也是Docker自身默认的网络。

此时两台主机上的Docker容器如何直接通过IP地址进行通信?

一  同宿主机不同网络容器通信

方法一:使用 Docker 网络连接

创建一个自定义桥接网络

创建一个新的自定义桥接网络,然后将需要通信的容器连接到这个网络。

docker network create my_custom_network

将容器连接到自定义网络

将需要通信的容器连接到同一个自定义网络。

# 假设有两个容器 container1 和 container2 分别连接到不同的网络

docker network connect my_custom_network container1

docker network connect my_custom_network container2

验证通信

进入其中一个容器,尝试 ping 另一个容器的名称或 IP 地址。

docker exec -it container1 ping container2

方法二:使用端口映射

将容器的端口映射到宿主机

通过 -p 选项将容器的端口映射到宿主机的端口。

docker run -d --name container1 -p 8080:80 my_image1

docker run -d --name container2 -p 8081:80 my_image2

通过宿主机 IP 地址通信

容器可以通过宿主机的 IP 地址和映射的端口进行通信。

# 获取宿主机的 IP 地址

HOST_IP=$(hostname -I | awk '{print $1}') # 从 container1 访问 container2

docker exec -it container1 curl http://$HOST_IP:8081

方法三:使用 Docker Compose

创建一个 Docker Compose 文件

使用 Docker Compose 文件定义多个服务,并将它们连接到同一个网络。

version: '3'

services:

container1:

image: my_image1

networks: - my_custom_network

container2:

image: my_image2

networks: - my_custom_network

networks:

my_custom_network:

driver:

bridge

启动 Docker Compose

使用 docker-compose up 命令启动服务。

docker-compose up -d

验证通信

进入其中一个容器,尝试 ping 另一个容器的名称或 IP 地址。

docker exec -it container1 ping container2

方法四:使用 Docker 网络插件

安装网络插件

使用第三方网络插件,如 Weave Net 或 Flannel,这些插件可以提供更高级的网络功能,包括跨网络的容器通信。

# 安装 Weave Net docker plugin install weaveworks/net-plugin:latest_release

配置网络插件

按照插件的文档进行配置,将需要通信的容器连接到同一个网络。

# 使用 Weave Net 创建网络

docker network create -d weave my_weave_network # 将容器连接到 Weave 网络

docker network connect my_weave_network container1

docker network connect my_weave_network container2

验证通信

进入其中一个容器,尝试 ping 另一个容器的名称或 IP 地址。

docker exec -it container1 ping container2

二 跨宿主机容器之间网络互连

docker原生的overlay和macvlan

第三方的flannel、weave、calico

覆盖网络(Overlay Network)

优点:内置支持,易于使用,支持多主机通信和服务发现。

缺点:需要 Docker Swarm 模式。

第三方网络插件(如 Weave Net)

优点:提供更高级的网络功能,适用于复杂网络需求。

缺点:需要额外安装和配置。

使用桥接网络(变通方法)

优点:不需要额外的网络插件,适用于简单的跨宿主机通信。

缺点:配置复杂,需要手动设置路由和 IP 转还有种docker com

1. 覆盖网络(Overlay Network)

覆盖网络是 Docker 内置的一种网络模式,允许多个 Docker 守护进程之间的容器相互通信。这是实现跨宿主机容器网络互连的最常用和推荐的方法。

步骤

初始化 Docker Swarm(可选,但推荐):

如果你使用 Docker Swarm 模式,首先需要初始化 Swarm。

# 在其中一个宿主机上初始化 Swarm

docker swarm init --advertise-addr <宿主机IP>

获取加入 Swarm 的命令,并在其他宿主机上执行。

# 获取加入命令

docker swarm join-token worker # 在其他宿主机上执行加入命令

docker swarm join --token <TOKEN> <宿主机IP>:2377

创建覆盖网络

创建一个覆盖网络,指定网络驱动为 overlay。

docker network create --driver overlay my_overlay_network

启动容器并连接到覆盖网络

在每个宿主机上启动容器,并将它们连接到同一个覆盖网络。

# 在宿主机1上启动容器

docker run -d --name container1 --network my_overlay_network my_image

# 在宿主机2上启动容器

docker run -d --name container2 --network my_overlay_network my_image

验证通信

进入其中一个容器,尝试 ping 另一个容器的名称或 IP 地址。

docker exec -it container1 ping container2

2. 使用第三方网络插件(Weave Net)

Weave Net 是一个流行的第三方网络插件,提供了易于使用的跨主机网络解决方案。

步骤

安装 Weave Net

在每个宿主机上安装 Weave Net。

curl -L git.io/weave -o /usr/local/bin/weave chmod +x /usr/local/bin/weave

启动 Weave Net

在每个宿主机上启动 Weave Net。

# 在第一个宿主机上启动 Weave Net

weave launch

# 获取第一个宿主机的 IP 地址

HOST1_IP=$(hostname -I | awk '{print $1}')

# 在其他宿主机上启动 Weave Net 并连接到第一个宿主机

weave launch $HOST1_IP

创建 Weave 网络

创建一个 Weave 网络。

docker network create -d weave my_weave_network

启动容器并连接到 Weave 网络

在每个宿主机上启动容器,并将它们连接到同一个 Weave 网络。

# 在宿主机1上启动容器 docker run -d --name container1 --network my_weave_network my_image # 在宿主机2上启动容器 docker run -d --name container2 --network my_weave_network my_image

验证通信

进入其中一个容器,尝试 ping 另一个容器的名称或 IP 地址。

docker exec -it container1 ping container2

3. 使用桥接网络(变通方法)

虽然 Docker 的默认桥接网络(bridge)不支持跨宿主机通信,但可以通过一些变通的方法实现这一点。一种常见的方法是使用路由IP 转发

步骤

配置 IP 转发

在每个宿主机上启用 IP 转发。

echo 1 > /proc/sys/net/ipv4/ip_forward

配置路由

在每个宿主机上配置路由,使容器的流量通过宿主机转发。

# 假设宿主机1的 IP 地址是 192.168.1.100

# 宿主机2的 IP 地址是 192.168.1.101

# 在宿主机1上配置路由 ip

route add 172.18.0.0/16 via 192.168.1.101

# 在宿主机2上配置路由 ip

route add 172.17.0.0/16 via 192.168.1.100

创建自定义桥接网络

在每个宿主机上创建自定义桥接网络。

docker network create --driver bridge --subnet 172.17.0.0/16 my_custom_bridge

启动容器并连接到自定义桥接网络

在每个宿主机上启动容器,并将它们连接到同一个自定义桥接网络。

# 在宿主机1上启动容器

docker run -d --name container1 --network my_custom_bridge my_image

# 在宿主机2上启动容器

docker run -d --name container2 --network my_custom_bridge my_image

验证通信

进入其中一个容器,尝试 ping 另一个容器的 IP 地址。

docker exec -it container1 ping 172.17.0.2

4. 使用Open vSwitch实现跨主机容器连接

先看一个使用openvswitch连接的架构图,连接的方式是vxlan

说明:

每台主机里都有2个网桥ovs1与ovs2,ovs1是管理网络,连接内网网卡em1,ovs2是数据网络,docker测试机都连接这个ovs2,并且container创建的时候网络都是none,使用pipework指定固定ip。

5. 使用端口转发(最方便【Docker】深入浅出Docker基础——容器发展之路

【Docker】深入浅出Docker基础——走进Docker

【Docker】深入浅出Docker基础——Docker安装

【云部署】Win11+WSL2+Ubuntu+Docker-Desktop 支持GPU的深度学习环境搭建

【Docker】深入浅出Docker基础进阶——纵观Docker的运维与开发

【Docker】深入浅出Docker技术——Docker引擎(理论)

【Docker】深入浅出Docker技术——Docker镜像

【Docker】深入浅出Docker技术——Docker容器

【Docker】深入浅出Docker技术——应用的容器化(单节点Dockerfile)

【Docker】从零开始:教你将程序打包成 Docker 镜像

【Docker】秒懂 Dockerfile:构建容器镜像的必备利器

【Docker】深入浅出Docker技术——应用的容器化(单引擎多容器Docker Compose编排部署应用)

【Docker】深入浅出Docker技术——容器的规模化(跨主机单服务Docker Swarm集群)

【Docker】深入浅出Docker技术网络化——Docker网络

【Docker】深入浅出Docker技术——网络化(Docker覆盖网络Overlay Network)

【Docker】Docker容器在两个不同网络间实现连通

【网络通信】MacVlan 让 Docker 实现上网自由

【NAS】Docker 配置Macvlan网络模式,实现单个容器限速与管控

【Docker】深入浅出Docker技术——卷与持久化数据

【Docker】深入浅出Docker技术——容器的规模化(跨主机多服务Docker Stack)

【Docker】深入浅出Docker技术——Docker安全

【Docker】125个Docker的常用命令

【NAS】轻松搞定绿联UGOS系统的Docker远程访问!

【Docker】Play with Docker 在线实验室 使用教程

【NAS】NAS用户必备应用,170+ 好玩的docker容器应用,好用docker新年汇总

【网络通信】虚拟机三种网络模式:桥接模式,NAT模式,仅主机模式)

Windows 上为 WSL2 设置端口转发,实现局域网访问

WSL上搭建了docker服务 xinference

目前局域网内其他电脑无法访问

非本机 Windows 设备访问 WSL 2

要实现局域网内非本机 Windows 设备访问 WSL 2,需要在 Windows 上配置端口转发以及防火墙入站规则。

查看WSL的IP

root@DESKTOP-AETE0Q9  /home/cc  hostname -I

192.168.0.109 就是WSL的IP,一会转发到这个IP

在windows上进行端口转发

netsh interface portproxy add v4tov4 listenport=9988 listenaddress=0.0.0.0 connectport=9988 connectaddress=192.168.0.109 protocol=tcp

参数说明

add v4tov4: 指示 netsh 添加一个IPv4到IPv4

的端口转发规则。

listenport=9988: 设置侦听端口,即外部设备将连接到这个端口。在这个例子中,Windows机器将监听在端口9988上的所有入站连接。

listenaddress=0.0.0.0: 设置侦听地址。特殊的IP地址 0.0.0.0 表示接收通过任何网络接口到达该端口的数据,这使得从任何网络接入都被接受。

connectport=9988: 设置连接端口,即当数据到达侦听端口时,数据将被转发到此端口。在此例中,转发的目标端口同样是9988。

connectaddress=192.168.0.109: 设置连接地址,即数据将被转发到这个IP地址。这通常是内部网络中的一个设备(如WSL2

实例)的地址。

protocol=tcp: 指定使用TCP协议进行端口转发。这意味着规则适用于TCP连接,这是大多数网络应用程序(如HTTP服务器、数据库等)的常用协议。

netsh interface portproxy add v4tov4 listenport=9988 listenaddress=0.0.0.0 connectport=9988 connectaddress=localhost

删除转发

delete:

netsh interface portproxy delete v4tov4 listenport=9988 listenaddress=0.0.0.0

windows上添加入站规则

9988

详细操作:https://blog.csdn.net/qq_42370421/article/details/119701356

在windows上进行测试

在其他电脑上访问:192.168.0.109:9988

如果你有Nas上docker创建的Dify容器,需要连接本地电脑上WSL2上docker上的Xinference容器,也可以了!

总结

跨宿主机的容器网络互连可以通过多种方法实现,每种方法都有其特点和适用场景:

覆盖网络(Overlay Network)

优点:内置支持,易于使用,支持多主机通信和服务发现。

缺点:需要 Docker Swarm 模式。

第三方网络插件(如 Weave Net)

优点:提供更高级的网络功能,适用于复杂网络需求。

缺点:需要额外安装和配置。

使用桥接网络(变通方法)

优点:不需要额外的网络插件,适用于简单的跨宿主机通信。

缺点:配置复杂,需要手动设置路由和 IP 转

还有种docker compose 需要借助 docker swarm 就不介绍了

后 记

本文探讨了局域网中不同宿主机间Docker容器直接通信的一种简单的方案。当然现在实现跨主机容器间通信的现成方案也很多,典型的比如flannel、Calico这种,有兴趣的也可以研究一下。

——The  End——

记得点赞、分享,让更多的朋友一起探索这个IT世界的新篇章!

AIGC周边正在发布,关注生活,冻龄青春

推荐阅读

【Docker】深入浅出Docker基础——容器发展之路

【Docker】深入浅出Docker基础——走进Docker

【Docker】深入浅出Docker基础——Docker安装

【云部署】Win11+WSL2+Ubuntu+Docker-Desktop 支持GPU的深度学习环境搭建

【Docker】深入浅出Docker基础进阶——纵观Docker的运维与开发

【Docker】深入浅出Docker技术——Docker引擎(理论)

【Docker】深入浅出Docker技术——Docker镜像

【Docker】深入浅出Docker技术——Docker容器

【Docker】深入浅出Docker技术——应用的容器化(单节点Dockerfile)

【Docker】从零开始:教你将程序打包成 Docker 镜像

【Docker】秒懂 Dockerfile:构建容器镜像的必备利器

【Docker】深入浅出Docker技术——应用的容器化(单引擎多容器Docker Compose编排部署应用)

【Docker】深入浅出Docker技术——容器的规模化(跨主机单服务Docker Swarm集群)

【Docker】深入浅出Docker技术网络化——Docker网络

【Docker】深入浅出Docker技术——网络化(Docker覆盖网络Overlay Network)

【Docker】Docker容器在两个不同网络间实现连通

【网络通信】MacVlan 让 Docker 实现上网自由

【NAS】Docker 配置Macvlan网络模式,实现单个容器限速与管控

【Docker】深入浅出Docker技术——卷与持久化数据

【Docker】深入浅出Docker技术——容器的规模化(跨主机多服务Docker Stack)

【Docker】深入浅出Docker技术——Docker安全

【Docker】深入浅出Docker企业版——企业级工具

【Docker】125个Docker的常用命令

【NAS】轻松搞定绿联UGOS系统的Docker远程访问!

【Docker】Play with Docker 在线实验室 使用教程

【NAS】NAS用户必备应用,170+ 好玩的docker容器应用,好用docker新年汇总

【网络通信】虚拟机三种网络模式:桥接模式,NAT模式,仅主机模式

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OmwFYXV-JCAEkTg1Ydz-1NpQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券