由于Docker的容器彼此之间是逻辑隔离的,所以,在安装Docker时会为在容器创建隔离的网络环境。在该隔离的网络模式环境下,运行在宿主机上的各个容器具有完全独立的网络栈,并且Docker容器的网络环境与宿主机相互隔离。通过配置使用Docker的不同网络模式,可以使容器共享宿主机的网络命名空间,也可以实现容器间的相互访问。
视频讲解如下:
Docker一共提供了4种网络模式:bridge、container、host和none。下表对比了这4种通信模式的特点。
在使用host模式时,容器与宿主机将共享同一个网络命名空间,容器的IP地址与宿主机的IP地址相同。如果宿主机具有公网的IP地址,则容器也拥有这个公网的IP地址。即这时容器可以直接使用宿主机的IP地址与外界进行通信,且容器内服务的端口也可以直接使用宿主机的端口,不需要进行任何的转换。由于host模式不再需要宿主机的转发,因此其极大提高了性能。下图说明了host模式的工作机制。
下面的命令将使用host模式来创建容器。
docker run -it --network=host busybox /bin/sh
对比一下容器内的网络信息和宿主机的网络信息,如下图所示,可以发现,容器与宿主机共享了同一个网络命名空间,即容器使用了宿主机的网络配置信息。
尽管使用host模式可以很方便地通过localhost或者127.0.0.1实现容器与宿主机的访问,并且性能也比较好。但是这种网络模式也存在一定问题,主要体现在以下两个方面:
- 由于容器使用了宿主机的网络环境,因此网络环境的隔离性功能被减弱,从而造成宿主机和容器会争用网络资源的使用。容器本身也不再拥有所有的网络资源,而是与宿主机共享网络资源。
- 在host模式下,宿主机和容器使用了相同的IP地址信息,这不利于网络的配置和管理。