通过 docker network ls
命令来查看本地 docker 服务支持的网络类型。
host 网络类型
Docker 使用了 Linux 的 Namespaces 技术来进行资源隔离,如 PID Namespace 隔离进程,Mount Namespace 隔离文件系统,Network Namespace 隔离网络等。一个 Network Namespace 提供了一份独立的网络环境,包括网卡、路由、Iptable 规则等都与其他的 Network Namespace 隔离。
我们可以使用 --net=host 指定 Docker 容器处于 host 类型的网络中。host 模式类似于 Vmware的桥接模式,与宿主机在同一个网络中,但没有独立 IP 地址。一个 Docker 容器一般会分配一个独立的 Network Namespace。但如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。
如下图所示:容器与主机在相同的网络命名空间下面,使用相同的网络协议栈,容器可以直接使用主机的所有网络接口。
# 注:官方的nginx镜像里面不包含ip addr和vim命令,这里是基于官方nginx镜像安装了iproute2
#和vim重新commit了一个guianjun/mynginx:v2.0基础镜像,便于实验
docker run -itd --name my_nginx --net=host -p 80:80 guianjun/mynginx:v2.0 /bin/bash
#在容器中执行ip addr命令,查看网络
docker exec -it my_nginx ip addr
可以看到容器 my_nginx 的网络配置与宿主机 hosts 的网络配置完全一样,在容器中可以看到 host 的所有网卡,并且连 hostname 也是跟宿主机一样的。从网络层面来看,host 模式下的容器只是宿主机上的一个端口,比如这里的 my_nginx 容器映射的是宿主机上的80端口,那么可以根据宿主机 ip+映射端口来实现对容器的访问。
host 模式的特点和应用场景:host 模式简单并且网络传输性能高,host 模式下面的网络模型是最简单和最低延迟的模式,容器进程直接与主机网络接口通信,与物理机性能一致,host 不利于网络自定配置和管理,并且所有主机的容器使用相同的 IP。也不利于主机资源的利用,需要考虑端口冲突问题,缺乏灵活性,如果是对网络性能要求比较高的情况下可以使用该模式,否则应该使用其他模式。