docker - 在同一主机上的不同网络中的 Docker 容器之间进行通信

标签 docker containers docker-networking

是否有可能使同一主机内不同网络中的容器进行通信?请注意,我目前没有使用 docker-compose。

以下是我所做的总结。我使用以下命令创建了两个网络

docker network create --driver bridge mynetwork1   
docker network create --driver bridge mynetwork2

然后我使用以下命令在每个创建的网络上运行两个容器:

docker run --net=mynetwork1 -it name=mynet1container1 mycontainerimage
docker run --net=mynetwork1 -it name=mynet1container2 mycontainerimage
docker run --net=mynetwork2 -it name=mynet2container1 mycontainerimage
docker run --net=mynetwork2 -it name=mynet2container2 mycontainerimage

然后我从使用创建的网络中识别出每个容器的 IP 地址

docker network inspect mynetwork1
docker network inspect mynetwork2

使用那些我能够在同一网络中的容器之间进行通信,但我无法跨网络的容器之间进行通信。只有将容器添加到同一网络才能进行通信。

非常感谢...

最佳答案

不同网络中的容器无法相互通信,因为 iptables 会丢弃此类数据包。这显示在过滤器表中的 DOCKER-ISOLATION-STAGE-1 和 DOCKER-ISOLATION-STAGE-2 链中。

    sudo iptables -t filter -vL

可以将规则添加到 DOCKER-USER 链中,以允许不同网络之间的通信。在上述场景中,以下命令将允许 mynetwork1 中的任何容器与 mynetwork2 中的任何容器进行通信。

需要先找到网络的网桥接口(interface)名称(mynetwork1 和 mynetwork2)。它们的名称通常看起来像 br-07d0d51191df 或 br-85f51d1cfbf6,可以使用命令“ifconfig”或“ip link show”找到它们。由于有多个网桥接口(interface),要为感兴趣的网络识别正确的网桥接口(interface),网桥接口(interface)的 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

关于docker - 在同一主机上的不同网络中的 Docker 容器之间进行通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36035595/

相关文章:

docker - 配置无花果先运行一个容器

docker - 在 docker 中使用 nginx 时出现禁止错误

c++ - 从另一个容器创建容器,在 C++ 中应用每个元素一些函数

c++ - Boost BCCL 容器算法工作示例

postgresql - 使用Docker-compose,如何通过容器和主机中的相同端口访问容器数据库

docker - Heroku h18 错误,而我的后端响应 200 到他们的路由器(多部分/表单数据)

Azure Function Docker 无法使用 http 触发器

来自无限集合的 Python argparse 选择

docker - docker1.7来自守护程序的错误响应:无法启动容器:无效参数

networking - 配置 docker 以通过网络进行通信