![](/img/trans.png)
[英]Why docker container already set network_mode:“host” and the public still can access from “http://ip:port”
[英]How can I get the IP of a container in a specific network_mode from another container outside of that mode?
在一個項目中,docker compose yml 中有三個服務:
一個VPN。
使用 network_mode 連接到該 VPN 的容器(名為first
)。
未連接到該 VPN 的容器(名為second
)。
從first
我就可以使用容器名稱(第二個)獲得second
的 IP,但相反的不起作用。
“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:
- 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
啟動服務時,您將使用 Compose 文件所在文件夾的名稱創建一個默認網絡。 您可以使用docker network ls
進行檢查。
好吧,默認情況下,您的所有服務都將連接到該網絡,除非您定義了不同的默認值或更改了網絡模式,因為這是您的情況first
。
基本上,假設您的 Compose 文件位於名為myapp
的目錄下。
myapp-default
的網絡。vpn
和second
將加入該網絡,但first
將與來自vpn
的網絡堆棧一起使用。first
使用與vpn
相同的網絡命名空間,因此它可以使用服務名稱毫無問題地發現second
。first
不在default
網絡中,因此second
無法發現它。 如果您希望first
被second
發現,您不應該使用相同的vpn
網絡堆棧,而只是讓它加入由 Compose 創建的default
網絡(或自己創建另一個網絡並使他們三個加入該網絡)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.