docker中的网络原理还是有必要了解的,因为很多时候可能都需要处理容器之间或者容器与主机的网络通信问题

1.启动与配置参数

1.1 网络启动过程

网络启动过程Docker服务启动时会首先在主机上自动创建一个docker0虚拟网桥,实际上是一个Linux网桥。网桥可以理解为一个软件交换机,负责挂载其上的接口之间进行包转发。

同时,Docker随机分配一个本地未占用的私有网段(在RFC1918中定义)中的一个地址给docker0接口。比如典型的172.17.0.0/16网段,掩码为255.255.0.0。此后启动的容器内的网口也会自动分配一个该网段的地址。

当创建一个Docker容器的时候,同时会创建了一对veth pair互联接口。当向任一个接口发送包时,另外一个接口自动收到相同的包。互联接口的一端位于容器内,即eth0;另一端在本地并被挂载到docker0网桥,名称以veth开头(例如vethAQI2QT)。通过这种方式,主机可以与容器通信,容器之间也可以相互通信。如此一来,Docker就创建了在主机和所有容器之间一个虚拟共享网络


10、Docker的网络功能-容器与外部/容器与容器之间访问_访问控制

1.2网络相关参数

10、Docker的网络功能-容器与外部/容器与容器之间访问_docker_02

10、Docker的网络功能-容器与外部/容器与容器之间访问_访问控制_03
10、Docker的网络功能-容器与外部/容器与容器之间访问_其他_04

10、Docker的网络功能-容器与外部/容器与容器之间访问_主机名_05
2.配置容器DNS和主机名

Docker服务启动后会默认启用一个内嵌的DNS服务,来自动解析同一个网络中的容器主机名和地址,如果无法解析,则通过容器内的DNS相关配置进行解析。用户可以通过命令选项自定义容器的主机名和DNS配置,下面分别介绍。

2.1 相关配置文件

容器中主机名和DNS配置信息可以通过三个系统配置文件来管理:/etc/resolv.conf、/etc/hostname和/etc/hosts。启动一个容器,在容器中使用mount命令可以看到这三个文件挂载信息:

10、Docker的网络功能-容器与外部/容器与容器之间访问_其他_06

10、Docker的网络功能-容器与外部/容器与容器之间访问_docker_07

2.2 容器内修改配置文件

容器运行时,可以在运行中的容器里直接编辑/etc/hosts、/etc/hostname和/etc/resolve. conf文件。但是这些修改是临时的,只在运行的容器中保留,容器终止或重启后并不会被保存下来,也不会被docker commit提交。

2.3 通过参数指定

10、Docker的网络功能-容器与外部/容器与容器之间访问_其他_08
3.容器访问控制

容器的访问控制主要通过Linux上的iptables防火墙软件来进行管理和实现。iptables是Linux系统流行的防火墙软件,在大部分发行版中都自带。

3.1容器访问外部网络

10、Docker的网络功能-容器与外部/容器与容器之间访问_其他_09

3.2容器之间访问

10、Docker的网络功能-容器与外部/容器与容器之间访问_主机名_10
10、Docker的网络功能-容器与外部/容器与容器之间访问_主机名_11
10、Docker的网络功能-容器与外部/容器与容器之间访问_docker_12

3.3容器访问控制

容器的访问控制主要通过Linux上的iptables防火墙软件来进行管理和实现。iptables是Linux系统流行的防火墙软件,在大部分发行版中都自带。

10、Docker的网络功能-容器与外部/容器与容器之间访问_主机名_13
image.png

3.4容器之间的访问

10、Docker的网络功能-容器与外部/容器与容器之间访问_其他_14

10、Docker的网络功能-容器与外部/容器与容器之间访问_其他_15
10、Docker的网络功能-容器与外部/容器与容器之间访问_访问控制_16
4. 映射容器端口到宿主主机的实现

默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。


10、Docker的网络功能-容器与外部/容器与容器之间访问_其他_17
10、Docker的网络功能-容器与外部/容器与容器之间访问_主机名_18
10、Docker的网络功能-容器与外部/容器与容器之间访问_docker_19
10、Docker的网络功能-容器与外部/容器与容器之间访问_其他_20

10、Docker的网络功能-容器与外部/容器与容器之间访问_docker_21