高手的存在,就是让服务10亿人的时候,你感觉只是为你一个人服务......

docker网络学习

目录
  1. 1. Docker的4种网络模式
  2. 2. bridge模式-默认模式
    1. 2.1. bridge模式拓扑
  3. 3. host模式
  4. 4. container模式
  5. 5. none模式

docker发展到现在,依然后很多不完善的地方,其中网络方面就是比较薄弱的部分。最近在学习docker网络方面的知识,在此整理一下。

Docker的4种网络模式

我们在使用docker run创建Docker容器时,可以用–net选项指定容器的网络模式,Docker有以下4种网络模式:

host模式,使用–net=host指定。
container模式,使用–net=container:NAME_or_ID指定。
none模式,使用–net=none指定。
bridge模式,使用–net=bridge指定,默认设置。

研究docker网络之前先看一下docker宿主机的网络情况:
输入ifconfig
Alt text
可以看到,安装了docker后,docker会虚拟出一个名字叫docker0的网桥(其上有一个 docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。


基于centos:5.11版本我自己做了一个镜像focustech/centos:5.11,就用这个镜像来实验。

bridge模式-默认模式

bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。
启动一个容器看一下:

1
docker run -ti --rm focustech/centos:5.11 /bin/bash

Alt text

bridge模式拓扑

上面也提到了,docker server启动的时候,会创建名叫docker0的虚拟网桥,在此宿主机上启动的docker容器都会连接到这个网桥上来进行通信,有点类似于交换机。
容器的ip分配会从RFC1918所定义的私有ip网段中取,一般会使用172.17.0.0/16这个网段

Alt text
Docker完成以上网络配置的过程大致是这样的:

在主机上创建一对虚拟网卡veth
pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。

Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以veth65f9这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctl show命令查看。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。

host模式

Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

使用–net=host来启动容器看一下:

1
docker run -ti --net=host --rm focustech/centos:5.11 /bin/bash

输入ifconfig,会看到它的网络情况和宿主机器的一模一样。

container模式

这个模式指定新创建的容器和已经存在的容器共享一个network namespace。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

none模式

在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

1
docker run -ti --net=none --rm focustech/centos:5.11 /bin/bash

Alt text