CoreOS docker 主机无法通过 IP 访问容器;LAN 上的其他计算机可以

CoreOS docker 主机无法通过 IP 访问容器;LAN 上的其他计算机可以

我们遇到一个问题,托管容器的服务器无法通过其 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 对我们来说不是一个选择。)

相关内容