前言
业内普遍认可的云时代互联网技术的三大基础架构:云计算、云网络、云存储。作为云平台PasS旗舰产品的docker提供丰富的网络功能,本文将简要介绍docker的网络模式。
docker的网络管理主要通过docker network XXX命令进行,如docker network ls可以查看所有的网络。
[root@t24app1sg ~]<20181112 16:14:36># docker network ls
NETWORK ID NAME DRIVER SCOPE
67f70fe49310 bridge bridge local
36698f242a1e host host local
5e0b09ca2801 none null local
docker的网络模式
bridge网络(默认)
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。
bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。bridge模式如下图所示:
如下,可以通过pifconfig命令查看容器网卡信息:
[root@t24app1sg ~]<20181112 15:59:37># docker exec -ti f5e759dcaca0 /bin/bash
[root@f5e759dcaca0 /]#
[root@f5e759dcaca0 /]# pifconfig
lo
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING
eth0 HWaddr 02:42:ac:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST
host模式
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace(网络),而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。如下所示:
none模式
使用none模式,Docker容器拥有自己的Network Namespace,但是并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。如下,查询none模式启动的容器网卡信息:
[root@t24app1sg shellscript]<20181112 16:12:07># docker run -ti -P --net=none --name testnone bcf5a43bc86a /bin/bash
[root@114d542e89be /]#
[root@114d542e89be /]# pifconfig
lo
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING
[root@114d542e89be /]#
自定义模式
dockre提供命令创建自定义的网络,如:
[root@t24app1sg ~]<20181112 16:17:06># docker network create --driver bridge my_net
[root@t24app1sg ~]<20181112 16:17:06># docker network ls
NETWORK ID NAME DRIVER SCOPE
67f70fe49310 bridge bridge local
36698f242a1e host host local
41c08d5542ea my_net bridge local
5e0b09ca2801 none null local
[root@t24app1sg ~]<20181112 16:17:11>#
若容器需要是用自定义的网络,需要在docker run启动容器时指定网络,如下: