Docker的四种网络模式
一、简介
Docker 有 bridge、none、host、container 四种网络模式,提供网络隔离、端口映射、容器间互通网络等各种支持,下面开门见山地直接介绍这四种网络模式。
这四种网络模式可以通过启动容器的时候指定,其命令或参数个数如下:
[root@docker-one mydocker]# docker network ls
NETWORK ID NAME DRIVER SCOPE
2c68216dae63 bridge bridge local
eb37b1fe073a host host local
330ad044d698 none null local
[root@docker-one mydocker]#
网络模式 | 参数 | 说明 |
---|---|---|
host模式 | -–net=host | 容器和宿主机共享 Network namespace。 |
container模式 | –-net={id} | 容器和另外一个容器共享 Network namespace。 kubernetes 中的pod就是多个容器共享一个 Network namespace。 |
none模式 | –-net=none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,配置IP等。 |
bridge模式 | -–net=bridge | 默认为该模式,通过 -p 指定端口映射。 |
这四种模式可以理解成 Docker 怎么虚拟化容器的网络,隔离程度和共享程度。
二、bridge模式(默认模式)
当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
当创建一个 Docker 容器的时候,同时会创建了一对 veth pair接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
[root@docker-one mydocker]# docker inspect xiaowei-nginx-1
三、Host模式
相当于Vmware中的NAT模式,与宿主机在同一个网络中,但没有独立IP地址。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。可以通过 --net=host 指定使用 host 网络。
[root@docker-one mydocker]# docker run --name xiaowei-nginx-4 --net=host -p 8888:80 nginx
WARNING: Published ports are discarded when using host network mode
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
[root@docker-one mydocker]# docker inspect xiaowei-nginx-4
"Networks": {
"host": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "eb37b1fe073a5ddd6c163212ceda9d7caa5598e456250a804a61fd58e4dd1c63",
"EndpointID": "09d333ed7def33e1330ffd6de2d9c268fd9fd06733306119465f2d14bf43f8c7",
"Gateway": "",
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "",
"DriverOpts": null
}
}
}
}
]
对比一下宿主机/etc/hosts,一模一样
[root@docker-one mydocker]# docker exec -it xiaowei-nginx-4 cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 [root@docker-one mydocker]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 [root@docker-one mydocker]#
四、Container模式
Docker网络container模式是指定其和已经存在的某个容器共享一个 Network Namespace,此时这两个容器共同使用同一网卡、主机名、IP 地址,容器间通讯可直接通过本地回环 lo 接口通讯。但这两个容器在其他的资源上,如文件系统、进程列表等还是隔离的。
五、None模式
使用none模式,Docker容器拥有自己的Network Namespace,但是, 并不为Docker容器进行任何网络配置 。也就是说,这个Docker容器没有网卡、IP、路由等信息,只有lo 网络接口。需要我们自己为Docker容器添加网卡、配置IP等。
不参与网络通信,运行于此类容器中的进程仅能访问本地回环接口;仅适用于进程无须网络通信的场景中,例如:备份进程诊断及各种离线任务等。
使用 none 网络模式启动一个 nginx2 容器
[root@docker-one mydocker]# docker run -itd --name nginx2 --net=none nginx
ef8c2bcc0a1bd5937781c00b655b46fc5a70e41c24255272f61d82301f02eb03
[root@docker-one mydocker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ef8c2bcc0a1b nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds nginx2
#查看该容器的网络模式
[root@docker-one mydocker]# docker inspect nginx2| grep -i network
"NetworkMode": "none",
"NetworkSettings": {
"Networks": {
"NetworkID": "330ad044d6988669b2d767a2cd9c8d19fed12c5af78166b97d58d17231d40d72",
#查看该容器的ip地址
[root@docker-one mydocker]# docker exec -it nginx2 hostname -I
#IP为空
[root@docker-one mydocker]#
测试 nginx2 与宿主机的连通性
#无法通信
[root@docker-one mydocker]# docker exec -it nginx2 ping 192.168.17.143
connect: Network is unreachable