第20章 高级网络功能
20.1 启动与配置参数
1.网络启动过程
docker服务启动时会首先在主机上自动创建一个docker0虚拟网桥,实际上是一个linux网桥。网桥可以理解为软件交换机,负责挂在其上的
接口之间进行包转发。
同时,docker随机分配一个本地未占用的私有网段中的一个地址给docker0接口。此后启动的容器内的网口也会自动分配一个该网段的地址。
当创建一个docker容器的时候,同时会创建一个veth pair互联接口。当向其中一个接口发送包时,另外一个接口自动收到相同的包。互联
接口的一端位于容器内,即eth0;另外一端在本地并被挂在到docker0网桥,名称也以veth开头。通过这种方式,主机可以与容器通信,容器之间
也可以互相通信。如此一来,docker就创建了在主机和所有容器之间一个虚拟共享网络。
20.2 配置容器DNS和主机名
docker服务启动后会默认启用一个内嵌的dns服务,来自动解析同一个网络中的容器主机名和地址。
容器运行时,可以在运行中的容器直接编辑/etc/hosts、/etc/hostname和/etc/resolve.conf文件,但修改是临时的。
20.3 容器访问控制
1.容器访问外部网络
容器默认指定了网关为docker0网桥上的docker0内部接口。docker0内部接口同时也是宿主机的一个本地接口。因此,容器默认情况下可以
访问到宿主机本地网络。如果容器想要通过宿主机访问到外部网络,则需要宿主机进行辅助转发。
2.容器之间的访问
容器之间相互访问需要两方面的支持:
1.网络拓扑是否已经连通。默认情况下,所有容器都会连接到docker0网桥上,这意味着默认情况下拓扑是互通的;
2.本地系统的防火墙软件iptables是否允许访问通过。这取决于防火墙的默认规则是允许(大部分情况下)还是禁止。
20.4 映射容器端口到宿主主机的实现
默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。
1.容器访问外部实现
2.外部访问容器实现
容器允许外部访问,可以在docker run 的时候通过-p或者-P参数来启用。不管哪种办法,其实也是在本地的iptables的nat表中
添加相应的规则,将访问外部ip地址段的包进行目标地址DNAT,将目标地址改为容器的ip地址。
20.5 配置容器网桥
除了默认的docker0网桥,用户也可以指定其他网桥来连接各个容器。在启动docker服务的时候,可以使用-b或者--bridge=BRIDGE来指定
使用的网桥。
20.6 自定义网桥
docker默认使用的是linux自带的网桥实现,可以替换为使用功能更强大的OpenvSwitch虚拟交换机实现。
20.7 使用OpenvSwitch网桥
20.8 创建一个点到点连接
在默认情况下,docker会将所有容器连接到docker0提供的虚拟网络中。用户有时候需要两个容器之间可以直接通信,而不用通过主机网桥进行桥接。
解决办法很简单:创建一对peer接口,分别放到两个容器中,配置成点到点链路类型即可。