【问题标题】:How do I connect to to hosts network from within a docker container?如何从 docker 容器内连接到主机网络?
【发布时间】:2019-04-03 11:09:16
【问题描述】:

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

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

服务器 B 只有一个 ipv6 地址。

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

我想我需要创建一个到服务器 B 的 ipv6 子网的 docker 网桥。我所有的努力都导致了同样的 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-commands 的输出

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,但无法访问公共互联网。

【问题讨论】:

  • 你有enabled ipv6 in your docker configuration吗?你的容器有 ipv6 地址吗?
  • 是的,然后我添加了这样的桥接器docker network create --driver bridge --ipv6 --subnet=fcfc::1:24fc:25ff:fe25:c903/80 db-link。 ping 服务器 B 私有 IP fcfc::1:24fc:25ff:fe25:c903 给我no route to host
  • 您能否将该信息从评论移到您的问题中,以及 (a) 您用于启动容器的 docker run 命令和 (b) ip addr 从内部的输出容器?
  • 我已经更新了最初的问题。谢谢。
  • 您正在使用不允许使用的保留 IPv6 寻址。没有私有 IPv6 地址范围。 fc00::/7 块是 ULA(Unique 本地寻址),这是一个与 IPv4 私有寻址非常不同的概念。您正在使用的块的前半部分 (fc00::/8) 保留给全局权限分配。您可以在块的后半部分分配地址 (fd00::/8),但您需要随机选择接下来的 40 位。见RFC 4193, Unique Local IPv6 Unicast Addresses

标签: docker networking ipv6


【解决方案1】:

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

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

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

然后运行以下 iptables-commands:

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

现在我能够从容器内部 ping ipv6 地址,也可以正确访问公共互联网,而无需使用任何自定义桥接或 macvlan 网络。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    相关资源
    最近更新 更多