容器间通信的⽅式
容器之间可通过 IP,Docker DNS Server 或 joined 容器三种⽅式通信。
1. IP 通信
两个容器要能通信,必须要有属于同⼀个⽹络的⽹卡。满⾜这个条件后,容器就可以通过 IP 交互了。具体做法是在容器创建时通过 --network 指定相应的⽹络,或者通过 docker network connect 将现有容器加⼊到指定⽹络。
2. Docker DNS Server
通过 IP 访问容器虽然满⾜了通信的需求,但还是不够灵活。因为我们在部署应⽤之前可能⽆法确定 IP,部署之后再指定要访问的 IP 会⽐较⿇烦。对于这个问题,可以通过 docker ⾃带的 DNS 服务解决。
从 Docker 1.10 版本开始,docker daemon 实现了⼀个内嵌的 DNS server,使容器可以直接通过“容器名”通信。⽅法很简单,只要在启动时⽤ --name 为容器命名就可以了。
下⾯启动两个容器 bbox1 和 bbox2:
docker run -it --network=my_net2 --name=bbox1 busybox
docker run -it --network=my_net2 --name=bbox2 busybox
然后,bbox2 就可以直接 ping 到 bbox1 了:
使⽤ docker DNS 有个限制:只能在 user-defined ⽹络中使⽤。也就是说,默认的 bridge ⽹络是⽆法使⽤ DNS 的。下⾯验证⼀下:
container容器用法创建 bbox3 和 bbox4,均连接到 bridge ⽹络。
docker run -it --name=bbox3 busybox
docker run -it --name=bbox4 busybox
bbox4 ⽆法 ping 到 bbox3。
3. joined 容器
joined 容器是另⼀种实现容器间通信的⽅式。
joined 容器⾮常特别,它可以使两个或多个容器共享⼀个⽹络栈,共享⽹卡和配置信息,joined 容器之间可以通过 127.0.0.1 直接通信。请看下⾯的例⼦:
先创建⼀个 httpd 容器,名字为 web1。
docker run -d -it --name=web1 httpd
然后创建 busybox 容器并通过 --network=container:web1 指定 jointed 容器为 web1:
请注意 busybox 容器中的⽹络配置信息,下⾯我们查看⼀下 web1 的⽹络:
看!busybox 和 web1 的⽹卡 mac 地址与 IP 完全⼀样,它们共享了相同的⽹络栈。busybox 可以直接⽤ 127.0.0.1 访问 web1 的 http 服务。
joined 容器⾮常适合以下场景:
不同容器中的程序希望通过 loopback ⾼效快速地通信,⽐如 web server 与 app server。
希望监控其他容器的⽹络流量,⽐如运⾏在独⽴容器中的⽹络监控程序。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论