从远程机器连接到容器

我创build了一个用户定义的networking(网桥模式)hb1并添加了2个容器。 但是,我无法通过networking上的外部主机连接到它们。

我仔细检查并遵循了这里和这里的指示。

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 

我应该如何configurationdocker用户定义的networking或我的本地networking,以便我可以访问一个单独的IP地址上的容器?

我今天回答了一个非常类似的问题,你能否看看我的答案,并遵循它,这对我来说是完美的。

将LAN IP地址分配给与主机IP地址不同的Docker容器

答案是:

创build持久性networking桥

Bridge是一种设备(在我们的情况下是虚拟设备),其function类似于networking切换(主要在networking层2上运行),即它可以将两个或多个networking接口连接到同一局域网(LAN)如果他们有相同的子网

你将要创build一个新的持久桥br0 (它将在系统启动时自动启动),将你的物理networking接口添加到它(在我的情况下是eth0 )。 请注意,将接口添加到桥接器后,接口不再需要IP地址,因为桥接器将获得IP地址,可以用来代替您的接口,也就是说,您可以使用桥接器进行通信,就好像它是您的物理接口,它会将input/输出数据包转发到正确的目的地。 您不需要为桥分配任何硬件(MAC地址),它将自动采用第一个添加的接口的MAC。

警告:强烈build议不要远程执行这些步骤,除非您有物理访问您的服务器! 如果你不小心,你可能会失去与服务器的连接。

安装桥梁pipe理工具:

 sudo apt install bridge-utils 

如果没有bridge-utils软件包,系统将无法创build网桥。

要创build持久桥,编辑interfaces文件:

 sudo vim /etc/network/interfaces 

将以下configuration添加到文件末尾(使其适合您的需要):

 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 

现在删除Docker的默认网桥docker0,因为我们不需要它:

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

编辑Docker的服务启动脚本以使用您的桥(br0)而不是Docker的默认桥(docker0),并传递一些重要的桥参数:

Ubuntu的:

 sudo vim /etc/systemd/multi-user.target.wants/docker.service 

调整文件看起来像这样:

 [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 

现在创build你的容器像波纹pipe, 这将导致给你的容器一个修复IP

  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" 

与您的networking要求相关的重要部分是:

  --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软件包,以便能够执行常用的networking命令(通过ip命令给出固定的IP)。

你第一次运行容器,你可能不会注意到IP地址有任何变化,因为你的容器可能没有iproute2软件包(也就是没有ip命令) ,只要安装上述软件包,然后重新启动容器和一切应该是你想要的!

希望有所帮助。