如何从 docker 容器连接到主机网络?
How do I connect to to hosts network from within a docker container?
我有两台物理服务器在局域网中相互连接。服务器 A 运行s docker 带有 ubuntu 容器。服务器 B 运行 是一个 MySQL 数据库(没有任何 docker 内容)。
现在我需要从服务器 A 上的 docker- 容器中访问服务器 B 上的 MySQL- 数据库。
服务器 B 只有一个 ipv6 地址。
当我 运行 ping6 <ipv6_server_b>
在主机 A 上工作时。来自主机 A 上 docker-容器内的相同命令给了我一个 unknown host
.
我想我需要创建一个 docker 到服务器 B 的 ipv6 子网的网桥。我所有的努力都导致了同样的 unknown host
错误。而且我不想使用 --network=host
.
public 互联网连接到主机接口 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 限制了对不同接口的访问,我无法连接到 public 互联网。
6.结论
- 桥接网络已创建,但我没有连接/路由到服务器 B 的 ipv6 提交 – 为什么?
- macvlan 网络使容器能够 ping 服务器 B 但无法连接到 public 互联网。
我们与 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
现在我可以从容器内部 ping ipv6 地址,也可以正确访问 public 互联网,而无需使用任何自定义网桥或 macvlan 网络。
我有两台物理服务器在局域网中相互连接。服务器 A 运行s docker 带有 ubuntu 容器。服务器 B 运行 是一个 MySQL 数据库(没有任何 docker 内容)。
现在我需要从服务器 A 上的 docker- 容器中访问服务器 B 上的 MySQL- 数据库。
服务器 B 只有一个 ipv6 地址。
当我 运行 ping6 <ipv6_server_b>
在主机 A 上工作时。来自主机 A 上 docker-容器内的相同命令给了我一个 unknown host
.
我想我需要创建一个 docker 到服务器 B 的 ipv6 子网的网桥。我所有的努力都导致了同样的 unknown host
错误。而且我不想使用 --network=host
.
public 互联网连接到主机接口 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 限制了对不同接口的访问,我无法连接到 public 互联网。
6.结论
- 桥接网络已创建,但我没有连接/路由到服务器 B 的 ipv6 提交 – 为什么?
- macvlan 网络使容器能够 ping 服务器 B 但无法连接到 public 互联网。
我们与 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
现在我可以从容器内部 ping ipv6 地址,也可以正确访问 public 互联网,而无需使用任何自定义网桥或 macvlan 网络。