如何使用桥接网络在 docker 容器之间启用发夹式 NAT

如何使用桥接网络在 docker 容器之间启用发夹式 NAT

我们有 2 个使用网络在同一主机上运行的 docker 容器bridgehost由于端口冲突,网络不是一个选项)。

  • 容器B正在监听端口9000,该端口是主机IP上打开的服务,并转发到容器B
  • 容器 A 无法连接到HOST.IP:9000,它可以连接到172.17.0.6.:9000(容器 B 的内部 IP),但那是我们不想跟踪的动态 IP
  • 这个问题建议MASQUERADE添加一条规则iptables以启用发夹式 NAT,但是,这是按端口配置的,因此不可移植。从可维护性角度来看,对主机环境的更改是不可取的。

有没有办法从容器 A 访问容器 B,而无需更改主机配置或知道容器 A 的动态 IP?

运行时我看到以下选项docker network inspect bridge

       "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },

运行时,我在容器上看到了这个可疑的设置docker inspect CONTAINER-NAME

       "NetworkSettings": {
            "HairpinMode": false,

答案1

有没有办法从容器 A 访问容器 B,而无需更改主机配置或知道容器 A 的动态 IP?

最简单和推荐的方法是创建一个用户定义网络并将容器连接到此网络。这样,您就可以使用容器名称从容器 B 连接到容器 A(反之亦然)。

默认桥接网络上的容器只能通过 IP 地址相互访问,除非您使用 --link 选项,该选项被视为旧选项。在用户定义的桥接网络上,容器可以通过名称或别名相互解析。用户定义的桥接可在容器之间提供自动 DNS 解析。

您可以使用以下命令创建网络并连接:

docker network create <net-name>
docker network connect <net-name> <container-name>
docker network connect <net-name> <container-name>

相关内容