无法获得两个容器(在两个不同的networking中)相互交谈

如下图所示,有两个容器,每个容器包含一个容器。 我试图让这两个容器相互交谈,但迄今尚未完成。

在这里输入图像说明

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

这是我迄今为止所做的。

1.创build两个networking。

 $ 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 

检查细节

  • 网_1
  • 网_2

2.创build容器。

 $ 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 

检查细节

  • app_1_con
  • app_2_con

testing

这两个命令都会挂起并死亡。

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

使用以下命令创build一个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写作,当事情是微不足道的。 这使得维护和理解变得更容易。

正如您应该看到的,您需要将一个容器作为另一个容器的一部分。 这是增加networking安全的一个非常普遍的模式。 例如:

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

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

还有一点,Docker守护进程有自己的DNSparsing器,所以你不需要通过IP来引用容器。 只需使用他们的service名称。 例如,而不是

 command: ping 192.168.2.22 

简单地使用

 command: ping app_2 

运行两个容器时可以使用默认网桥。 或者用docker network create创build一个networking。 然后这两个容器使用networking。

这是因为net_1和net_2之间没有路由

一种select是把它们放在同一个networking中,像这样:

 $ 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 

我通常把容器放在同一个networking中 互相通信

例:

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通信,我会创build一个新的networking,我将连接到component1_app1component2_app2