我在默认容器网络中运行 postgres,因为它使用 docker run 命令运行。并且,我们的 webapp 在同一台服务器上运行,但作为 docker-compose 服务运行。因此,会自动为此创建单独的桥接网络。
如何将自定义网络中创建的 docker-compose 服务 web 应用容器连接到默认网络中使用 docker run 命令创建的 postgres 数据库?
我尝试使用 localhost、host.docker.internal,但都不起作用。主机的 LAN 连接 IP 可以工作,但如果我在不同的服务器上运行,它可能会改变,因此没用。
答案1
不同网络中的容器无法相互通信,因为 iptables 会丢弃此类数据包。这在 filter 表中的 DOCKER-ISOLATION-STAGE-1 和 DOCKER-ISOLATION-STAGE-2 链中有所体现。
sudo iptables -t filter -vL
可以将规则添加到 DOCKER-USER 链以允许不同网络之间的通信。在上述场景中,以下命令将允许 mynetwork1 中的任何容器与 mynetwork2 中的任何容器进行通信。
首先需要找到网络的桥接接口名称(mynetwork1 和 mynetwork2)。它们的名称通常类似于 br-07d0d51191df 或 br-85f51d1cfbf6,可以使用命令“ifconfig”或“ip link show”找到它们。由于存在多个桥接接口,因此为了识别相关网络的正确接口,桥接接口的 inet 地址(ifconfig 中显示)应与命令“docker network inspect mynetwork1”中显示的子网地址匹配
sudo iptables -I DOCKER-USER -i br-########1 -o br-########2 -j ACCEPT
sudo iptables -I DOCKER-USER -i br-########2 -o br-########1 -j ACCEPT
规则可以进行微调,以仅允许特定 IP 之间的通信。例如,
sudo iptables -I DOCKER-USER -i br-########1 -o br-########2 -s 172.17.0.2 -d 172.19.0.2 -j ACCEPT
sudo iptables -I DOCKER-USER -i br-########2 -o br-########1 -s 172.19.0.2 -d 172.17.0.2 -j ACCEPT