Docker容器网络资源通过内核的Network Namespace机制实现隔离,不同的Network Namespace有的各自的网络设备、协议栈、路由表、防火墙规则等,反之,统一Network Namespace下的进程共享同一网络视图。通过对Network Namespace的灵活操作,Docker提供了五种容器网络模式:
- none:不为容器配置任何网络配置
docker run --net=none -it ubuntu ip addr show
- container:与另一个运行中的容器共享Network Namespace,共享相同的网络视图
docker run --net=container:d258... -it ubuntu /bin/bash
- host:与主机共享Root Network Namespace,容器有完整的权限可以操纵主机的协议栈、路由表和防火墙,所以这种方式是不安全的。
docker run --net=host -it ubuntu /bin/bash
- bridge:Docker设计的NAT网络模型。
这种方式是Docker 默认的运行方式,Docker daemon启动时会在主机创建一个linux网桥(默认为docker0),容器启动时,Docker会创建一对veth pair设备,该设备是成对出现的,相当于一个网线的两个接口,一端接在容器的Network Namespace,另一端接在docker0网桥上,从而可以实现容器的网络通信。
网桥模式下,Docker容器和Internet的通信,以及不同容器之间的通信,都是通过iptables规则控制的。总之,docker网络的初始化动作包括:创建docker0网桥,为docker0网桥新建子网以及路由、创建相应的iptables规则等。默认子网网段为172.17.0.0/16。 - overlay:Docker原生的跨主机多子网模型。
这种方式比较复杂,不想学了。