在一个项目中,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
的目录下有您的撰写文件。
- 当你启动容器时,Docker Compose正在创建一个名为
myapp-default
的网络。 - 您的服务
vpn
和second
将加入该网络,但first
将使用vpn
的网络堆栈。 - 由于
first
使用与vpn
相同的网络命名空间,因此使用服务名称可以发现second
。 - 由于
first
不在default
网络中,second
无法发现它。
如果你想让first
被second
发现,你不应该使用与vpn
相同的网络堆栈,而只是让它加入由Compose创建的default
网络(或自己创建另一个网络,并使它们三个加入该网络)。