1.四种网络模式
bridge
--net=bridge
默认网络,docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。
也可以自定义网络,相比默认的具备内部DNS发现,可以通过容器名容器之间网络通信
host
--net=host
容器不会获得一个独立的network namespace,而是与宿主机共用一个。这意味着容器不会有自己的网卡信息,而是使用宿主机的。容器除了网络,其他都是隔离的。
none
--net=none
获取独立的network namespace,但不为容器进行任何网络配置,需要我们手动配置
container
--net=container:Name/ID
与指定的容器使用同一个network namespace,具有同样的网络配置信息,两个容器除了网络,其他都还是隔离的。
自定义网桥:
docker network ls 查看网络
docker network create test
docker network inspect 网桥id
应用场景:
bridge 默认网络
host 希望使用宿主机的网络,除了网络其他都是隔离
none 手动配置容器网络,对接公司IP池
container 希望容器与另一个容器再一个网络命名空间,lnmp
2.docker网络模型
veth pair:成对出现的一种虚拟网络设备,数据从一端进,从另一端出/用于解决网络命名空间之间隔离。
docker0:网桥是一个二层网络设备,通过网桥可以将linux支持的不同的端口连接起来,并实现类似交换机那样的多对多的通信。
3.容器网络访问原理
外部访问容器:
在浏览器输入地址时,数据包先到达宿主机的网络协议栈,经过DNAT机制,做了网络地址转换,转换给docke0,docker0关联veth的另一端,从另一端进另一端流出,进入容器里面
容器访问外部:curl 网址,数据包从容器里网卡eth0出去,到达宿主机,从veth进流出到docker0,根据本地iptables做了个SNAT规则,然后通过宿主机eth0,访问外部信息
4.容器网络实现核心技术:iptables
INPUT链:接收的数据包是本机(入站)时,应用此链中的规则
OUTPUT链:本机向外发送数据包(出站)时,
FORWARD链:需要通过防火墙中转发送给其他地址的数据包(转发)
ROREOUTING:在对数据包做路由选择之前 DSNAT
POSTROUTING:在对数据包做路由选择之后 SNAT
MASQUERADE 动态源地址转换
SNAT 固定IP
所有数据包源IP来自172.17.0.0/16这个网段都要做源地址转换
-A POSTOUTING -s 172.17.0.0.16/16 ! -o docker0 -j MASQUERADE
5.跨主机网络:实现docker主机容器通信
Flannel是CoreOS维护的一个网络组件,在每个主机上运行守护进程负责维护本地路由转发,Flannel使用ETCD来存储容器网络与主机之前的关系。
其他主流容器跨主机网络方案:
Weave
Calico
OpenvSwitch
原文:https://www.cnblogs.com/zhaichao93/p/13626370.html