如何在 Docker 中跨容器访问其他容器的 IP 地址

爱站 今天 1 0条评论
摘要: Docker会为每个容器分配一个默认的主机名,可以使用这个主机名来访问其他容器。例如,有两个容器名分别为web和db,则可以在一个容器中使用web或db来访问另一个容器。可以创建一...

Docker 会为每个容器分配一个默认的主机名,可以使用这个主机名来访问其他容器。例如,有两个容器名分别为 "web" 和 "db",则可以在一个容器中使用 "web" 或 "db" 来访问另一个容器。

可以创建一个自定义的 Docker 网络,并将容器连接到该网络。可以使用容器的服务名称或 IP 地址来访问其他容器。这种方法可以提供更好的可靠性和灵活性。

可以在容器启动时设置环境变量来存储其他容器的 IP 地址。这样可以在容器内部访问这些变量,从而访问其他容器。

Docker 提供一个内置的服务发现机制,可以让容器自动注册和发现彼此的 IP 地址。这种方法适用于较复杂的多容器应用程序。

在 Docker 中跨容器访问其他容器的 IP 地址有多种方法,开发者可以根据具体需求选择合适的方式。


Docker容器跨主机通信之:直接路由方式

就目前Docker自身默认的网络来说,单台主机上的不同Docker容器可以借助docker0网桥直接通信,这没毛病,而不同主机上的Docker容器之间只能通过在主机上用映射端口的方法来进行通信,有时这种方式会很不方便,甚至达不到我们的要求,因此位于不同物理机上的Docker容器之间直接使用本身的IP地址进行通信很有必要。 再者说,如果将Docker容器起在不同的物理主机上,我们不可避免的会遭遇到Docker容器的跨主机通信问题。 本文就来尝试一下。

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

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

一种直接想到的方案便是通过分别在各自主机中 添加路由来实现两个centos容器之间的直接通信。我们来试试吧

由于使用容器的IP进行路由,就需要避免不同主机上的容器使用了相同的IP,为此我们应该为不同的主机分配不同的子网来保证。 于是我们构造一下两个容器之间通信的路由方案,如下图所示。

各项配置如下:

这样配置之后,两个主机上的Docker容器就肯定不会使用相同的IP地址从而避免了IP冲突。

我们接下来 定义两条路由规则即可:

综上所述,数据包在两个容器间的传递过程如下:

我们心里方案想的是这样,接下来实践一下看看是否可行。

编辑主机1上的/etc/docker/文件,添加内容: bip : ip/netmask

编辑主机2上的/etc/docker/文件,添加内容: bip : ip/netmask

主机1和主机2上均执行如下命令重启docker服务以使修改后的docker0网段生效

主机1上添加路由规则如下:

主机2上添加路由规则如下:

主机1上添加如下规则:

主机2上添加如下规则:

主机1上启动centos容器:

主机2上启动centos容器:

好了,现在两容器可以互ping了

如何使不同主机上的docker容器互相通信

Docker网络基础---Docker跨主机容器访问通信

在同一宿主机下的Docker的容器之间是默认互相联通的。 通过dockerinspect id或name可以查看到ip地址。 在不通的容器中来执行ping是可以ping通的。

但我们通过观察发现,每一个启动容器的ip地址不是固定的,所以如果我们通过ip地址来实现互连明显是不靠谱的。但我们发现这些ip又处于同一网段中而且默认是127.0.0.X,这就是Docker容器默认跨主机之间的链接方法的第一种:网桥实现

在docker宿主机上运行ifconfig命令可以看的存在一个docker0的网桥。 Docker容器通过docker0 网桥实现同一主机间中,容器的ip地址分配和访问,所以,如果希望Docker跨主机访问,最简单的方式就是将不同主机的docker0 设置为同一网段。

如何实现docker跨主机之间容器通信问题

一、环境信息?主机名宿主机IP容器分配网段启动容器的IPtesta192.168.1..172.0.0/.172.0.10testb192.168.1..172.1.0/.172.1.10二、具体实践1.在testa主机上创建docker桥接网络docker network create --subnet=172.172.0.0/24 docker-br02.在testb主机上创建docker桥接网络docker network create --subnet=172.172.1.0/24 docker-br0

备注:这里选取了172.172.0.0网段,也可以指定其他任意空闲的网段,docker-br0为自定义网桥的名字,可自己任意取名。

注意:这里子网掩码要使用255.255.255.0也就是IP后面的那个24,因为后面要使用iptables配置路由表,我之前使用255.255.0.0 无法配置.所以这里配置成24.\

创建网桥之后,使用ifconfig查看 会多出一个网桥,该网桥在docker启动或者重启之后,会自动显示出来。 永久的,可以使用docker network rm docker-br0 移除网桥。

3.在testa主机中你自定义的网段选取任意IP地址作为你要启动容器IPdocker run -i -d --net docker-br0 --ip 172.172.0.10 --name test1 3bee3060bfc8 /bin/bashtestb主机中你自定义的网段选取任意IP地址作为你要启动容器IPdocker run -i -d --net docker-br0 --ip 172.172.1.10 --name test2 3bee3060bfc8 /bin/bash4.进入testa主机中的dockerdocker exec -it test1 /bin/bash进入testb主机中的dockerdocker exec -it test2 /bin/bash5. 配置路由表添加路由规则

ip route add 对方容器所在的ip网段/子网掩码 via 对方虚拟机ip dev 通过哪个网卡通信

testa主机中

ip route add 172.172.1.0/24 via 192.168.1.106 dev eno?? ?

testb主机中

ip route add 172.172.0.0/24 via 192.168.1.105 dev eno?\

添加完成之后,可以使用 route命令 查看添加之后的规则,也可以使用 ip route del 172.172.1.0/24? 移除路由规则

6测试跨主机容器互ping

问题解决!!!

原文:
文章版权及转载声明:

作者:爱站本文地址:https://www.awz.cc/post/3140.html发布于 今天
文章转载或复制请以超链接形式并注明出处爱网站

赞(0