无法让两个容器(在两个不同的网络中)相互通信

编码器

如下图所示,有两个容器,每个容器包含一个容器。我试图让这两个容器相互通信,但到目前为止未能完成。

在此处输入图片说明

$ docker -v
Docker version 17.09.0-ce, build afdb6d4

这是我到目前为止所做的。

1. 创建两个网络。

$ docker network create --subnet 192.168.1.0/24 --driver bridge net_1
$ docker network create --subnet 192.168.2.0/24 --driver bridge net_2

列表

NETWORK ID          NAME            DRIVER              SCOPE
8a9ae0d69c9c        net_1           bridge              local
e8a8460784d0        net_2           bridge              local

检查详情

2. 创建容器。

$ docker run -i -t -d -p 5011:80 --network=net_1 --ip 192.168.1.11 --name=app_1_con app_1_img
$ docker run -i -t -d -p 5022:80 --network=net_2 --ip 192.168.2.22 --name=app_2_con app_2_img

列表

ID  IMAGE      COMMAND      STATUS  PORTS                  NAMES
f6  app_1_img  "/bin/bash"  Up      0.0.0.0:5011->80/tcp   app_1_con
0a  app_2_img  "/bin/bash"  Up      0.0.0.0:5022->80/tcp   app_2_con

检查详情

测试

这两个命令都在最后挂起并死亡。

$ docker exec -it app_1_con ping 192.168.2.22
PING 192.168.2.22 (192.168.2.22) 56(84) bytes of data.

$ docker exec -it app_2_con ping 192.168.1.11
PING 192.168.1.11 (192.168.1.11) 56(84) bytes of data.
伯纳德

使用以下内容创建 docker-compose.yml 文件:

version: "3.4"

services:

  app_1:
    image: alpine:3.7
    container_name: app_1_con
    ports:
      - "5011:80"
    networks:
      net_1:
        ipv4_address: "192.168.1.11"
      net_2:
        ipv4_address: "192.168.2.11"
    command: ping 192.168.2.22

  app_2:
    image: alpine:3.7
    container_name: app_2_con
    ports:
      - "5022:80"
    networks:
      net_2:
        ipv4_address: "192.168.2.22"
    command: tail -f /dev/null # this keeps the container running

networks:

  net_1:
    driver: bridge
    ipam:
      driver: default
      config:
      - subnet: 192.168.1.0/24

  net_2:
    driver: bridge
    ipam:
      driver: default
      config:
      - subnet: 192.168.2.0/24

然后使用:运行示例docker-compose up并使用Ctrl-C停止容器。

细节:

当事情不是微不足道的时候,首先开始使用 docker compose。它使维护和理解变得更加容易。

如您所见,您需要让一个容器与另一个容器属于同一网络。这是添加网络安全的一种非常常见的模式。例如:

  -----> nginx  --------> app server  -------> db
       pub + priv           priv                priv
       networks             network             network

只有您的 Web 代理需要位于​​公共网络(由ports属性公开的网络)。您的应用服务器和数据库可以位于无法从外部访问的专用网络中。Nginx 是唯一需要成为两个网络一部分的容器。

另外,Docker 守护进程有自己的 DNS 解析器,所以你不需要通过它们的 IP 来引用容器。只需使用他们的service名字。例如,而不是

command: ping 192.168.2.22

简单地使用

command: ping app_2

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章