4 18
Docker网络部分知识点归纳

网络工具

  • iptables

  • ip addr

  • brctl-util

Docker虚拟网络

(1) docker网络虚拟化是基于Linux下的网络命名空间实现的。

使用 ip netns 命令我们同样可以创建自己的虚拟网络环境

例子:通过ip netns 创建一个名为net0的虚拟网络

$ ip netns add net0
$ ip netns list
$ net0

使用ip netns exec 可以为net0网络空间中的网络设备eth0部署ip

$ ip netns exec net0 ip addr add 172.17.42.99/16 dev eth0

(2) 网络设备虚拟化

网卡(网络接口):一台主机通过ip与其它主机通讯

网络设备:把各个主机连接在一起。

这里的设备可以是虚拟设备(网桥、路由器、交换机等)

例如linux的lo回环接口,就是用于快速高效地发送和接收回环数据包。

(3) Docker就是利用特殊的虚拟网络接口来连接容器和主机的。

(4) 当我们在主机上启动Docker服务时,Docker引擎会在操作系统内核创建一个docker0的虚拟以太网桥,这个虚拟网桥会把容器组织成一个虚拟子网。

(5) docker0创建虚拟以太网docker0后,会被分配一个主机没有使用的私有化ip和子网掩码

(6) 我们可以使用ip addr 查看wlan0和docker0的信息

(7) Docker容器的网络互联正是依赖linux底层的veth机制,veth总是成对出现的

创建一对veth设备:

$ ip link A type veth peer name B

(8) Docker引擎会在主机上创建一个虚拟的以太网卡接口,并且会将这个veth接口一端放在主机的网络空间,并且连接到docker网桥,另外一端 放在docker容器的网络空间中

容器退出时,虚拟网卡也会被销毁,下次启动将创建一个新的网络接口与docker0重新连接

可以通过ip addr 查看, 然后通过brctl show来验证veth*的设备是否连接在docker0网络上。

(9) 网络结构

index

(10) Docker支持自定义容器的主机名和DNS配置

 指定DNS服务器  -- dns=IP_ADDRESS 

(11) 容器的访问控制主要通过Linux的iptables防火墙管理和实现的

检查转发是否打开

$ sudo sysctl net.ipv4.ip_forward

$ net.ipv4.ip_forward = 1

如果为0,要手动打开

(12) 容器启动时, 使用 --link=CONTAINER_NAME:ALAIS选项,docker会在iptables为两个互联的容器添加 一条ACCEPT规则, 允许互相开发端口

(13) 除了默认的docker0网桥,用户也可以自定义网桥来连接各个容器

删除旧的网桥

$ sudo service docker stop

$ sudo ip link set dev docker0 down

$ sudo brctl delbr docker0

创建新的网桥

$ sudo brctl addbr docker0

$ sudo ip addr add 192.168.5.1/24 dev docker0

$ sudo ip link set dev docker0 up

查看网桥

$ ip addr show bridge0

配置服务,默认连接到新的网桥上

$ echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker

$ sudo service docker restart

(14) 容器允许的四种网络模式

  • --net=bridge

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

  • --net=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=CONTAINER:NAME_OR_ID

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

  • --net=none

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

(15) Linux主机名保存在 /etc/hostname文件中,域名解析服务器IP保存在 /etc/resolv.conf中,host保存在 /etc/host中

(16) DNS配置

 使用 --dns=IP_ADDRESS可以为新启动的容器配置一个或多个域名配置服务器, 底层会修改 /etc/resolv.conf

(17) 容器与容器之间能否进行通信,主要下面2个因素决定

1.需要通信的容器的网络接口是否处于同一网络拓扑结构中

2.iptables配置是否允许2个容器之间创建连接

(18) 当我们启动容器时,Docker引擎会在主机iptables中创建一条转发链。

如果我们配置了 --ice=true, 这条转发链会使用ACCEPT策略进行配置, 使用--ice=false, 转发链使用DROP策略进行配置。