前言

业内普遍认可的云时代互联网技术的三大基础架构:云计算、云网络、云存储。作为云平台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命令查看。

docker -network dockernetwork ls_IP

bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。bridge模式如下图所示:

docker -network dockernetwork ls_docker_02

如下,可以通过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和端口。但是容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。如下所示:

docker -network dockernetwork ls_IP_03

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启动容器时指定网络,如下:

docker -network dockernetwork ls_Docker_04