容器之间可通过IP、Docker DNS Server或joined三种方式进行通信,今天我们来详细学习一下。

一、IP通信

IP通信很简单,前一篇中已经有所涉及了,只要容器使用相同网络,那么就可以使用IP进行访问,本节不做赘述。

二、Docker DNS Server

使用IP通信存在一个最大的问题就是容器的IP地址一般是随机的不固定的,所以导致这种方式不够灵活,对于这个问题,可以通过Docker自带的DNS服务器解决。这种方式使用也很简单,即启动容器时通过--name参数即可指定其域名。我们使用前面创建的test_net1,启动两个nginx容器:

sudo docker run -d --network=test_net1 --name=ng1 nginx

sudo docker run -d --network=test_net1 --name=ng2 nginx

接着我们进入ng1,然后尝试ping一下ng2:

# ping ng2
PING ng2 (172.18.0.3) 56(84) bytes of data.
64 bytes from ng2.test_net1 (172.18.0.3): icmp_seq=1 ttl=64 time=0.094 ms
64 bytes from ng2.test_net1 (172.18.0.3): icmp_seq=2 ttl=64 time=0.101 ms
64 bytes from ng2.test_net1 (172.18.0.3): icmp_seq=3 ttl=64 time=0.097 ms
64 bytes from ng2.test_net1 (172.18.0.3): icmp_seq=4 ttl=64 time=0.086 ms
^C
--- ng2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 59ms
rtt min/avg/max/mdev = 0.086/0.094/0.101/0.011 ms

PS:默认Nginx容器里面没有ping命令,需要手动安装一下:

apt-get update
apt-get install iputils-ping

这里要注意,使用Docker DNS有个限制:只能在用户自定义网络中使用。也就是说默认的Bridge网络是无法使用的。

$ sudo docker run -d  --name ng3 nginx
53fd36e0e778bc0b29ae70ac3b5c5d76c74b4a8d987b23290a868f7f0f02d435
$ sudo docker run -d --name ng4 nginx
c91d26a3b948089a1b19db08b6a719c101e5bef4007c9d727662c2363a3c6d9f
$ sudo docker exec -it 53fd36e0e778bc0b29ae70ac3b5c5d76c74b4a8d987b23290a868f7f0f02d435 /bin/sh
# apt-get update
此处省略更新apt的输出
# apt-get install iputils-ping
此处省略安装ping命令的输出
# ping ng4
ping: ng4: Name or service not known

三、joined容器

joined容器是另一种实现容器间通信的方式,这种方式非常特别,它可以使多个容器共享同一个网络栈,共享网卡和配置信息,下面举例说明:

我们首先启动一个nginx容器:

$ sudo docker run -d -it --name ng nginx
128be82cc38adb2bc56ee4e8aa2a7e7026601c6cd056af6848539f5e27b6210d

接着启动redis容器,并通过--network参数join到nginx容器网络中,我们进入容器看下其网络配置:

 sudo docker run -it -d --network=container:ng redis
344d10125f1693d96bea471c94a13c36f8c868b203dbe234cbb8863fec24f775
$ sudo docker exec -it 344d10125f1693d96bea471c94a13c36f8c868b203dbe234cbb8863fec24f775 /bin/sh
注意此处请大家先自行安装iproute2工具
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
43: eth0@if44: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever

接着,我们在进入nginx容器中看下它的网络配置:

$ sudo docker exec -it 128be82cc38a /bin/sh
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
43: eth0@if44: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever

看到没?这两个容器网络配置一样的,它们共享相同的网络栈,这样redis容器可以直接通过127.0.0.1访问nginx:

# curl 127.0.0.1:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p> <p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p>
</body>
</html>

joined容器方式非常适合以下场景:

  • 不同容器中的程序希望通过loopback高效快速通信,比如Web Server和App Server;

  • 安装在独立容器中的监控服务对其它容器中应用进行监控。

最新文章

  1. mysql NOW,CURRENT_TIMESTAMP,SYSDATE 之间的区别
  2. CPU 和内存虚拟化原理 - 每天5分钟玩转 OpenStack(6)
  3. [OpenCV] Samples 11: image sequence
  4. asp.net mvc Post上传文件大小限制
  5. 终于解决SQL Server 2008 64位系统无法导入Access/Excel的问题 2012/08/01
  6. 【python cookbook】【字符串与文本】11.从字符串中去掉不需要的字符
  7. NGUI-制作位图字体以及图文混排
  8. &lt;转&gt;十分钟学会javascript
  9. Spring @Aspect切面参数传递
  10. HDU1166(分块)
  11. HDU4508--完全背包
  12. 2016 安全圈玩起了直播,“学霸”带你玩转CTF_i春秋学院
  13. linux磁盘空间占满问题快速定位并解决
  14. (转)X-Frame-Options响应头缺失漏洞
  15. SQL SERVER中LIKE使用变量类型输出结果不同
  16. scala 资料集结
  17. angularjs component
  18. Android各版本代号、版本号、API/NDK级别、发布时间及市场份额
  19. [Windows Azure] .NET Multi-Tier Application Using Storage Tables, Queues, and Blobs - 1 of 5
  20. 在Asp.Net Core中使用Session

热门文章

  1. Java项目发现==顺手改成equals之后,会发生什么?
  2. org.apache.hadoop.hive.ql.metadata.HiveException: Internal Error: cannot generate all output rows for a Partition解决
  3. 容器之分类与各种测试(四)——set
  4. Gradle—Android配置详解
  5. Docker学习(三)——Docker镜像使用
  6. KMP算法中的next函数
  7. Android 高级UI组件(三)
  8. d3动态坐标轴
  9. DOM解析xml学习笔记
  10. sql优化的8种方式 (下)