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问题解决!!!
原文: