簡體   English   中英

如何從該模式之外的另一個容器獲取特定 network_mode 中容器的 IP?

[英]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的目錄下。

  1. 當您啟動容器時,Docker Compose 正在創建一個名為myapp-default的網絡。
  2. 您的服務vpnsecond將加入該網絡,但first將與來自vpn的網絡堆棧一起使用。
  3. 由於first使用與vpn相同的網絡命名空間,因此它可以使用服務名稱毫無問題地發現second
  4. 由於first不在default網絡中,因此second無法發現它。

如果您希望firstsecond發現,您不應該使用相同的vpn網絡堆棧,而只是讓它加入由 Compose 創建的default網絡(或自己創建另一個網絡並使他們三個加入該網絡)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM