无法获得两个容器(在两个不同的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_app1和component2_app2 。