由于Docker的容器彼此之间是逻辑隔离的,所以,在安装Docker时会为在容器创建隔离的网络环境。在该隔离的网络模式环境下,运行在宿主机上的各个容器具有完全独立的网络栈,并且Docker容器的网络环境与宿主机相互隔离。通过配置使用Docker的不同网络模式,可以使容器共享宿主机的网络命名空间,也可以实现容器间的相互访问。
视频讲解如下:
Docker一共提供了4种网络模式:bridge、container、host和none。下表对比了这4种通信模式的特点。
在container模式下,容器之间会共享网络环境。即一个容器会使用另一个容器的网络命名空间。因此,在这种模式下,容器之间可以通过localhost或者127.0.0.1进行相互间的访问,从而提高传输的效率。
提示:由于容器共享了网络环境,因此这种网络模式节约了网络的资源。但是运行在这种网络模式下的容器,不存在网络的隔离。它的网络隔离性会处于bridge模式与host之间。
container模式在一些特殊的场景中非常有用。例如:在Kubernetes中创建的Pod时,会首先创建Pod的基础容器;而Pod中的其他容器则采用的是container模式与基础容器进行通信。Pod中的各个容器采用localhost或者127.0.0.1进行通信,从而构造一个Pod整体。container模式的工作机制如下图所示。
下面通过具体示例来演示如何使用container模式。
(1)使用busybox镜像创建一个容器A,并查看容器的网络信息,如下图所示。
docker run -it busybox /bin/sh ifconfig
(2)开启一个新的命令行仓库查看容器A的ID。通过下图可以确定容器A的ID号是d71751ade532。
(3)开启一个新的命令行窗口,并使用container模式创建一个新的容器B。
docker run -it --network=container:d71751ade532 busybox /bin/sh
其中,参数—network用于指定新容器需要使用哪一个容器的网络信息,这里使用的是容器A。
(4)查看容器B的网络信息,如下图所示。
(5)通过对比会发现,容器A和容器B使用了相同的网络命名空间。这是因为在创建容器B时使用了container模式,使得容器B不再创建自己的网络命名空间,而直接使用容器A的网络命名空间。