从远程机器连接到容器
connect to container from a remote machine
我创建了一个用户定义的网络(桥接模式)hb1 并添加了 2 个容器。但是,我无法从网络上的外部主机连接到它们。
我已检查并尽可能严格按照说明进行操作 here and here。
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 地址访问容器?
我今天回答了一个非常相似的问题,你能不能看看我的回答并按照它做,它非常适合我。
答案如下:
创建持久性网桥
Bridge
是一个设备(在我们的例子中是虚拟设备),其行为类似于网络交换机(主要在网络第 2 层运行),即它可以连接两个或多个网络接口 在同一个局域网 (LAN) 上,如果它们具有相同的子网。
您将创建新的持久性桥 br0
(它将在系统启动时自动启动),将您的物理网络接口添加到其中(在我的例子中是 eth0
)。请注意,将接口添加到网桥后,接口不再需要 IP 地址,因为网桥将获得 IP 地址并可以代替您的接口使用,即,您可以 使用网桥进行通信 就好像它是您的物理接口一样,它会将 in/out 数据包转发到正确的目的地。您不需要为网桥分配任何硬件(MAC地址),它会自动占用第一个添加接口的MAC。
Warning: It is highly recommended not to do these steps remotely except you have a physical access to your server! You may lose your connection to your server if you were not careful.
安装网桥管理实用程序:
sudo apt install bridge-utils
The system will not be able to create the bridge without bridge-utils
package.
要创建持久性桥,编辑 interfaces
文件:
sudo vim /etc/network/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
现在删除 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
现在像下面这样创建你的容器,这将导致给你的容器一个修复 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"
与您的网络要求相关的重要部分是:
--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 地址有任何变化,因为您的容器可能没有 iproute2
包(即没有不是 ip
命令),只需安装提到的包,然后重新启动容器,一切都应该完全如您所愿!
希望对您有所帮助。
我创建了一个用户定义的网络(桥接模式)hb1 并添加了 2 个容器。但是,我无法从网络上的外部主机连接到它们。
我已检查并尽可能严格按照说明进行操作 here and here。
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 地址访问容器?
我今天回答了一个非常相似的问题,你能不能看看我的回答并按照它做,它非常适合我。
答案如下:
创建持久性网桥Bridge
是一个设备(在我们的例子中是虚拟设备),其行为类似于网络交换机(主要在网络第 2 层运行),即它可以连接两个或多个网络接口 在同一个局域网 (LAN) 上,如果它们具有相同的子网。
您将创建新的持久性桥 br0
(它将在系统启动时自动启动),将您的物理网络接口添加到其中(在我的例子中是 eth0
)。请注意,将接口添加到网桥后,接口不再需要 IP 地址,因为网桥将获得 IP 地址并可以代替您的接口使用,即,您可以 使用网桥进行通信 就好像它是您的物理接口一样,它会将 in/out 数据包转发到正确的目的地。您不需要为网桥分配任何硬件(MAC地址),它会自动占用第一个添加接口的MAC。
Warning: It is highly recommended not to do these steps remotely except you have a physical access to your server! You may lose your connection to your server if you were not careful.
安装网桥管理实用程序:
sudo apt install bridge-utils
The system will not be able to create the bridge without
bridge-utils
package.
要创建持久性桥,编辑 interfaces
文件:
sudo vim /etc/network/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
现在删除 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
现在像下面这样创建你的容器,这将导致给你的容器一个修复 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"
与您的网络要求相关的重要部分是:
--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 地址有任何变化,因为您的容器可能没有 iproute2
包(即没有不是 ip
命令),只需安装提到的包,然后重新启动容器,一切都应该完全如您所愿!
希望对您有所帮助。