如何从Docker容器连接到主机网络?

时间:2019-04-03 11:09:16

标签: docker networking ipv6

我在局域网中有两个物理服务器相互连接。服务器A使用ubuntu容器运行docker。服务器B运行一个MySQL数据库(没有任何docker东西)。

现在,我需要从服务器A上的docker-container中访问服务器B上的MySQL数据库。

服务器B仅具有ipv6地址。

当我在主机A上运行ping6 <ipv6_server_b>时,它可以工作。来自主机A的docker-container内部的同一命令给了我unknown host

我认为我需要创建一个到服务器B的ipv6-子网的docker bridge。我的所有努力都导致了相同的unknown host错误。而且我不想使用--network=host

公共Internet连接在主机接口ens16上,而服务器B位于连接在接口ens17上的本地安全区域中

详细说明

我在docker选项中启用了ipv6,如下所示:

DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ipv6 --fixed-cidr-v6=2001:db8:1::/64 "

1。我试图创建到安全区域的ipv6子网的桥接网络

docker network create --driver bridge --ipv6 --subnet=fcfc:0:0:1::/64 db-link

2。这是我用来启动容器并分配网络的命令

docker run -it --network=db-link nicolaka/netshoot

(nicolaka / netshoot包含许多有用的诊断内容)

3。尝试从容器中ping服务器B地址:

ping6 fcfc::1:24fc:25ff:fe25:c903
PING fcfc::1:24fc:25ff:fe25:c903(fcfc::1:24fc:25ff:fe25:c903) 56 data bytes
From fcfc:0:0:1::2: icmp_seq=1 Destination unreachable: Address unreachable
From fcfc:0:0:1::2: icmp_seq=2 Destination unreachable: Address unreachable
From fcfc:0:0:1::2: icmp_seq=3 Destination unreachable: Address unreachable

ping google.com
PING google.com (172.217.18.14) 56(84) bytes of data.
64 bytes from fra02s19-in-f14.1e100.net (172.217.18.14): icmp_seq=1 ttl=56 time=0.787 ms
64 bytes from fra02s19-in-f14.1e100.net (172.217.18.14): icmp_seq=2 ttl=56 time=0.631 ms

4。这是ip命令在容器中的输出

ip -6 route show
fcfc:0:0:1::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
default via fcfc:0:0:1::1 dev eth0 metric 1024 pref medium

ip route show
default via 172.21.0.1 dev eth0
172.21.0.0/16 dev eth0 proto kernel scope link src 172.21.0.2

5。我试图创建一个macvlan网络

docker network create --driver macvlan --ipv6 --subnet=fcfc:0:0:1::/64 -o parent=ens17 db-link

现在我可以ping通服务器B的IP fcfc::1:24fc:25ff:fe25:c903,但是由于macvlan限制了对不同接口的访问,因此我无法连接到公共互联网。

6。结论

  • 已创建网桥网络,但我没有连接到服务器B的ipv6提交的连接/路由-为什么?
  • macvlan网络使容器能够ping通服务器B,但无法访问公共Internet。

1 个答案:

答案 0 :(得分:0)

我们与ISP一起找到了解决方案:

/etc/docker/daemon.json中,我们将子网更改为:

{
"ipv6": true,
"fixed-cidr-v6": "fefe:1234::/80"
}

然后运行以下iptables命令:

ip6tables -t nat -I POSTROUTING -s fefe:1234::/80 -o ens16 -j MASQUERADE
ip6tables -t nat -A POSTROUTING -s fefe:1234::/80 -d fcfc::1/32 -o ens17 -j MASQUERADE

现在,我可以在不使用任何自定义网桥或macvlan网络的情况下,也可以从容器内部ping ipv6地址,并且可以正确访问公共Internet。