在一个项目中,修船厂中有三个服务组成yml:
虚拟专用网
使用first连接到该虚拟专用网的容器(名为network_mode )。
未连接到该虚拟专用网的容器(名为second)。
通过first,我可以使用容器名(第二个)获得second的IP,但是oposite不能工作。
"first“和"second”是使用套接字相互发送数据的简单python脚本。
如果我使用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:
- vpnpython脚本的相关部分:
#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发布于 2021-10-20 09:07:39
你的问题来自网络的错误配置。
首先,当您使用docker-compose up -d启动服务时,您将创建一个默认网络,其名称为该组合文件所在的文件夹的名称。你可以用docker network ls来检查它。
在默认情况下,所有服务都将连接到该网络,除非您定义了不同的默认或更改了网络模式,这是first的情况。
基本上,假设您的撰写文件位于一个名为myapp的目录下。
当您启动容器时,Docker正在创建一个名称为myapp-default.
vpn的网络,second将加入该网络,但是first将使用来自使用vpn的相同网络名称空间的网络堆栈工作,它可以在使用服务名称时发现second而没有任何问题。
H 121因为first不在default网络中,d24无法发现它。H 225G 226
如果您想让first被second发现,您不应该使用相同的vpn网络堆栈,而应该让它加入由Compose创建的default网络(或者自己创建另一个网络,并让其中三个网络加入该网络)。
https://stackoverflow.com/questions/69639213
复制相似问题