如下图所示,有两个容器,每个容器包含一个容器。我试图让这两个容器相互通信但到目前为止未能完成它。
$ 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.
答案 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_netcomponent1_app1 backend_app1_net
component2_app1
2)第二次申请(App2):
backend_app2_netcomponent1_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创建一个网络。然后两个容器使用网络。