我们遇到一个问题,托管容器的服务器无法通过其 IP 访问它们,而网络上的其他计算机可以。我们的 LAN 有以下设置:
- 一台通过两根网线连接到路由器的服务器(运行CoreOS 1068.10.0和Docker 1.10.3)
- 连接服务器和客户端的路由器
- 许多客户端计算机,它们要么直接连接到路由器,要么通过连接到路由器的交换机连接
因此我们的网络看起来像这样,非常简单:
|---------| |---------| |---------|
| Docker |-----------| Router |-----------| Other computers/
| Host |-----------| | | NAS/etc |
|---------| |---------| |---------|
为了将我们的容器暴露给我们的网络,我们遵循了以下答案:https://stackoverflow.com/a/35799206
例如我们使用的命令如下:
docker network create \
--subnet 192.168.0.0/16 \
--aux-address "DefaultGatewayIPv4=192.168.0.1" \
--gateway=192.168.1.1 \
-o com.docker.network.bridge.name=br-internal_lan internal_lan
sudo brctl addif br-internal_lan eno1
sudo ip a del 192.168.1.1/16 dev br-internal_lan
到目前为止一切顺利。我们的服务器在 上有 IP 192.168.0.3 eno3
,这正是我们想要的。eno1
通过单独的电缆连接到路由器并用于桥接。桥接器的 IP 为 192.168.0.83。如果我们使用以下命令启动容器:
docker run --net=internal_lan -d --ip 192.168.1.0 serverimage:latest
我们得到以下场景:
- 工作原理:从客户端 ping 容器(反之亦然)
- 工作原理:从客户端 ping 主机(反之亦然)
- 工作原理:从容器、主机、客户端 ping 桥接 IP
- 工作原理:从容器 ping 主机
- Works:运行
docker exec container01 /bin/bash
以获取容器访问权限 - 不起作用:从主机 ping 容器,丢包率为100%
以下是我们服务器的一些示例设置:
是否配置
br-internal_lan: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.83 netmask 255.255.0.0 broadcast 192.168.255.255
inet6 fe80::42:8cff:fe30:3b4a prefixlen 64 scopeid 0x20<link>
ether 02:42:8c:30:3b:4a txqueuelen 0 (Ethernet)
RX packets 430214 bytes 62591783 (59.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4244 bytes 546612 (533.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::225:90ff:fe5d:6b80 prefixlen 64 scopeid 0x20<link>
ether 00:25:90:5d:6b:80 txqueuelen 1000 (Ethernet)
RX packets 829691 bytes 296523943 (282.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 78684 bytes 87560787 (83.5 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0xdf400000-df47ffff
eno3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.3 netmask 255.255.0.0 broadcast 192.168.255.255
inet6 fe80::225:90ff:fe5d:6b82 prefixlen 64 scopeid 0x20<link>
ether 00:25:90:5d:6b:82 txqueuelen 1000 (Ethernet)
RX packets 1744808 bytes 1583970565 (1.4 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1019186 bytes 1085667196 (1.0 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device memory 0xdf200000-df27ffff
<other interfaces omitted>
路线
default router.asus.com 0.0.0.0 UG 1024 0 0 eno3
default router.asus.com 0.0.0.0 UG 1024 0 0 br-internal_lan
172.17.0.0 * 255.255.0.0 U 0 0 0 docker0
192.168.0.0 * 255.255.0.0 U 0 0 0 eno3
192.168.0.0 * 255.255.0.0 U 0 0 0 br-internal_lan
router.asus.com * 255.255.255.255 UH 1024 0 0 eno3
router.asus.com * 255.255.255.255 UH 1024 0 0 br-internal_lan
我们尝试将/proc/sys/net/ipv4/[eno1,eno3,br-internal_lan]/rp_filter
其改为 2,但是没有任何改变(不知道是否应该改变)。/proc/sys/net/ipv4/ip_forward
设置为 1。
我们的设置可能有什么问题?我们如何通过 IP 访问我们的容器?任何帮助都非常感谢,如果我需要提供更多信息,请告诉我们。
(请注意,我们目前正在运行 Docker 1.10.3(这是使用 CoreOS 稳定版时的最新 Docker 版本),因此 macvlan 对我们来说不是一个选择。)