如何从该模式之外的另一个容器获得特定network_mode中容器的IP ?



在一个项目中,docker包含三个服务:

VPN。

使用network_mode连接到该VPN的容器(名为first)。

没有连接到VPN的容器(命名为second)

first我可以得到second的IP使用容器名称(第二),但相反的不工作。

"至上";和";second"是使用套接字互相发送数据的简单python脚本。

我可以从"second"以"至上";如果我使用IP地址而不是容器名称,但这不是我可以在项目中使用的解决方案。

这是我正在使用的。yml:

version: '3.9'
services:
vpn:
build: ./vpn
container_name: vpn
env_file:
- ss.env
cap_add: 
- NET_ADMIN
- NET_RAW
devices:
- /dev/net/tun:/dev/net/tun
dns:
- 1.1.1.1
first:
build: ./first
container_name: first
depends_on: 
- vpn
network_mode: service:vpn
second:
build: ./second
container_name: second
depends_on: 
- vpn

python脚本的相关部分:

#first.py
client.sendto(bytes('message from second',encoding='utf8'), ('second', 37021))
#second.py
client.sendto(bytes('message from second',encoding='utf8'), ('first', 37020))

还有vpn日志:

vpn       | 2021-10-20 00:44:21 TUN/TAP device tun0 opened
vpn       | 2021-10-20 00:44:21 /sbin/ip link set dev tun0 up mtu 1500
vpn       | 2021-10-20 00:44:21 /sbin/ip link set dev tun0 up
vpn       | 2021-10-20 00:44:21 /sbin/ip addr add dev tun0 10.8.8.2/24
vpn       | 2021-10-20 00:44:21 /sbin/ip route add 104.111.100.109/32 via 192.168.144.1
vpn       | 2021-10-20 00:44:21 /sbin/ip route add 0.0.0.0/1 via 10.8.8.1
vpn       | 2021-10-20 00:44:21 /sbin/ip route add 128.0.0.0/1 via 10.8.8.1

你的问题来自于网络配置错误。

首先,当您使用docker-compose up -d启动服务时,您正在创建一个默认网络,其中包含撰写文件所在文件夹的名称。你可以用docker network ls检查。

好吧,你所有的服务都会默认连接到那个网络,除非你定义了一个不同的默认或者你改变了网络模式,因为这是你的first的情况。

基本上,让我们假设您在一个名为myapp的目录下有您的撰写文件。

  1. 当你启动容器时,Docker Compose正在创建一个名为myapp-default的网络。
  2. 您的服务vpnsecond将加入该网络,但first将使用vpn的网络堆栈。
  3. 由于first使用与vpn相同的网络命名空间,因此使用服务名称可以发现second
  4. 由于first不在default网络中,second无法发现它。

如果你想让firstsecond发现,你不应该使用与vpn相同的网络堆栈,而只是让它加入由Compose创建的default网络(或自己创建另一个网络,并使它们三个加入该网络)。

最新更新