Docker主机之间容器通信

之前的章节中,所有有关数据通信的部分,都是在单一宿主机上,如果不同的容器部署在不同的宿主机,他们之间该如何通信呢?

本节中,我们介绍以下几种方式:

  • 桥接网络;

  • 端口映射;

  • Docker网络驱动: 1. Overlay,2. Macvlan。

Tips:还有一些第三方的解决方案,如 Weave,OpenvSwitch 等,有兴趣可以自行查看相关文档。

1. 桥接网络模式与端口映射模式

Tips:桥接宿主机网络与 端口映射模式的设定参考 Docker 网络 部分内容。

桥接模式,多个宿主机位于同一个局域网,将每一个宿主机上的容器网络桥接到宿主机网络中,容器和宿主机同在一个局域网中互相通信。每台宿主机上的容器都直接从局域网中获取IP地址,容易导致IP地址冲突。

端口映射模式,是将容器的服务所运行的端口映射到宿主机的某一个端口,然后其他的容器通过宿主机的对应端口进行访问。只要宿主机间能互相通信,容器之间就能通过宿主机的指定端口进行通信。但是这种方式需要对每一个容器都映射端口,而且宿主机的端口也有限。

2. Docker 网络驱动

2.1 Overlay 网络

Overlay网络依赖额外的服务和配置,配置较为复杂,我们在后续容器云平台一节会再次提到它的应用。

2.2 Macvlan 网络

macvlan 是 Linux 的内核模块,是一种网卡虚拟化技术,功能是允许在同一个物理网卡上虚拟出多个网卡,通过不同的MAC地址在数据链路层进行网络数据的转发,一块网卡上配置多个 MAC 地址,每个interface 可以配置自己的 IP。

Docker 的 macvlan 网络使用了 macvlan 驱动。 在物理网络拓扑结构上看,每张虚拟网卡都是一个单独的网口。

我们需要两台装好 Docker 服务的 Linux 虚拟机,并且虚拟机的网络要互通。

  1. 创建 macvlan 网络,在两个节点上都进行此操作:
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth1 -o macvlan_mode=bridge macvlan_net 
  • macvlan 是 kernel 的模块名;
  • 192.168.2.0/24是宿主机所在网络的网段;
  • 192.168.2.1是网关;
  • eth1 是 Docker 宿主机(两台虚拟机)接入192.168.1.0/24 的物理网口。
  1. 创建容器并指定 IP:

容器b1:

docker run -it -d --net macvlan_net --ip=192.168.1.101 --name b1 busybox

容器b2:

docker run -it -d --net macvlan_net --ip=192.168.1.102 --name b2 busybox
  1. 测试容器通信

容器b1:

docker exec -it b1 ping 192.168.1.102

容器b2:

docker exec -it b2 ping 192.168.1.101

3. 小结

Docker 的容器跨主机通信功能是比较薄弱的,如果有需要,将上面的方案大致了解一下即可。在实际生产中,跨宿主机节点的 Docker 容器通信都依托在容器编排平台(如 k8s)网络配置,大家学完 Docker 之后一定有机会去深入了解的。