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

时间:2017-12-02 21:47:00

标签: docker

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

enter image description here

$ 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.

3 个答案:

答案 0 :(得分:1)

使用以下内容创建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

答案 1 :(得分:0)

因为net_1和net_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_1 --ip 192.168.1.10 --name=app_2_con app_2_img

我通常会在同一网络中放置容器,这些容器应该相互通信

示例:

1)第一次申请(App1):

backend_app1_net

component1_app1 backend_app1_net

component2_app1

2)第二次申请(App2):

backend_app2_net

component1_app2 backend_app2_net

component2_app2

3)注意:

如果我希望 component1_app1 app2 的所有组件进行通信,我还会将他连接到 backend_app2_net

如果我希望 component1_app1 仅与 component2_app2 进行通信,我会创建一个新网络,我将连接 component1_app1 component2_app2 到它。

答案 2 :(得分:0)

运行两个容器时,可以使用默认桥接网络。或者使用docker network create创建一个网络。然后两个容器使用网络。