如下图所示,有两个容器,每个容器包含一个容器。我试图让这两个容器相互通信,但到目前为止未能完成。
$ 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] 删除。
我来说两句