簡體   English   中英

從遠程計算機連接到容器

[英]connect to container from a remote machine

我創建了一個用戶定義的網絡(橋接模式)hb1並添加了2個容器。 但是,我無法從網絡上的外部主機連接到它們。

我檢查並盡可能地按照這里這里的說明進行操作。

pi@raspberrypi:~ $ docker network inspect hb1
[
    {
        "Name": "hb1",
        "Id": "278a4ba8bb7a4a34b25b5f5fde9a965a807ff896d5e57c2b1d7d39af60d0a046",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.1.32/27",
                    "Gateway": "192.168.1.33"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "7dc7be3ae45813450bb7f75a6e2c7b4d93e59aa147aa7d393061748b8201381a": {
                "Name": "modest_bohr",
                "EndpointID": "eda20bbb52319b10911f3da6f6afadbd2167298d5a9cfd5c91f933f4b6d5fe86",
                "MacAddress": "02:42:c0:a8:01:22",
                "IPv4Address": "192.168.1.34/27",
                "IPv6Address": ""
            },
            "f12fbc30bcf5e37737bfe8c7868dcd40e6c632bb3672f5641ffd6960ede4f777": {
                "Name": "infallible_torvalds",
                "EndpointID": "92d0ecfad597485c25ad309d48c3c77b9368f25ebbd851b1168f59a795c497f2",
                "MacAddress": "02:42:c0:a8:01:23",
                "IPv4Address": "192.168.1.35/27",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

當我從我的docker主機ping時,它按預期工作。

user@myhost: ~$ ping -c 1 192.168.1.34
PING 192.168.1.34 (192.168.1.34) 56(84) bytes of data.
64 bytes from 192.168.1.34: icmp_seq=1 ttl=64 time=0.474 ms

--- 192.168.1.34 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.474/0.474/0.474/0.000 ms

但是,從遠程主機,無法訪問容器。

user@remotehost: ~$ ping -c 1 192.168.1.34
PING 192.168.1.34 (192.168.1.34) 56(84) bytes of data.
From 192.168.1.100 icmp_seq=1 Destination Host Unreachable

--- 192.168.1.34 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

我應該如何配置docker用戶定義的網絡或我的本地網絡,以便我可以在單獨的IP地址上訪問容器?

我今天回答了一個非常相似的問題,你能不能在這里看一下我的答案並遵循它,它對我來說非常適合。

將LAN IP地址分配給Docker容器,與主機的IP地址不同

這是答案:

創建持久性網橋

Bridge是一種設備(在我們的例子中是虛擬設備),其行為類似於網絡swiches(主要在網絡層2上運行),即,它可以將兩個或多個網絡接口連接到同一局域網(LAN)上如果他們有相同的子網

您將創建新的持久性橋接器br0 (它將在系統引導時自動啟動),將您的物理網絡接口添加到其中(在我的情況下,它是eth0 )。 請注意,在將接口添加到網橋后,接口不再需要IP地址,因為網橋將獲得IP地址,可以代替您的接口使用,也就是說,您可以使用網橋進行通信,就好像它是您的物理接口,它將輸入/輸出數據包轉發到正確的目的地。 您不需要將任何硬件(MAC地址)分配給網橋,它將自動獲取第一個添加的接口的MAC。

警告:強烈建議您不要遠程執行這些步驟,除非您具有對服務器的物理訪問權限! 如果您不小心,可能會丟失與服務器的連接。

安裝橋管理實用程序:

 sudo apt install bridge-utils 

沒有bridge-utils包,系統將無法創建橋。

要創建持久性橋,請編輯interfaces文件:

auto br0
iface br0 inet static
    bridge_ports eth0
    address 192.168.1.10
    netmask 255.255.255.0
    broadcast 192.168.1.255
    gateway 192.168.1.1

將以下配置添加到文件末尾(根據您的需要進行調整):

sudo systemctl stop docker
sudo ip link set dev docker0 down
sudo brctl delbr docker0

現在刪除Docker的默認橋接器docker0,因為我們不需要它:

 sudo systemctl stop docker sudo ip link set dev docker0 down sudo brctl delbr docker0 

編輯Docker的服務啟動腳本以使用您的網橋(br0)而不是Docker的默認網橋(docker0),並傳遞一些重要的網橋參數:

Ubuntu的:

[Service]

ExecStart=/usr/bin/dockerd -H fd:// --bridge=br0 --fixed-cidr=192.168.1.32/27 --default-gateway=192.168.1.1

將文件調整為如下所示:

sudo systemctl daemon-reload

現在告訴系統有關該文件的更改:

sudo reboot

重啟系統:

ip addr

現在檢查你的橋,它應該在那里!

  docker run --name myContainer \
  -it --restart always --memory 100M \
  --network bridge --cap-add NET_ADMIN \
  --hostname client1.noureldin.local \
  --add-host "client1.noureldin.local client1":192.168.1.123 \
  mnoureldin/general-purpose:latest /bin/bash -c " \
  ip addr flush dev eth0; \
  ip addr add 192.168.1.123/24 brd + dev eth0; \
  ip route add default via 192.168.1.1 dev eth0; \
  /bin/bash"

現在創建像bellow一樣的容器, 這將導致為您的容器提供修復IP

  --network bridge --cap-add NET_ADMIN \
  ip addr flush dev eth0; \
  ip addr add 192.168.1.123/24 brd + dev eth0; \
  ip route add default via 192.168.1.1 dev eth0; \

與您的網絡要求相關的重要部分是:

  --network bridge --cap-add NET_ADMIN \\ ip addr flush dev eth0; \\ ip addr add 192.168.1.123/24 brd + dev eth0; \\ ip route add default via 192.168.1.1 dev eth0; \\ 

當然,請確保在容器中安裝了iproute2 net-tools iputils-ping軟件包,以便能夠執行公共網絡命令(通過ip命令完成固定IP)。

第一次運行容器時,您可能不會注意到IP地址的任何更改,因為您的conainer可能沒有iproute2包(即沒有ip命令) ,只是安裝提到的包然后重啟容器和一切應該完全按照你的意願!

希望有所幫助。

暫無
暫無

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

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