持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
Docker容器的网络
独立容器的常见三种网络模式
生产环境经常使用独立容器部署数据库、中间件等第三方应用,独立容器的网络一般有三种模式:none、host和bridge。
none:一个独立的网络命名空间,只有回环设备,不能与外部通信
host:容器与主机共用一个网络命名空间,即网络没有隔离,pxc实例一般使用该模式。
bridge:docker默认模式,最常用。
bridge网络模式工作原理
网络拓扑图:
docker bridge网络模式要用到linux的bridge和veth两种虚拟网络设备,以及forward和nat功能。
linux虚拟网络设备由内核的网络设备管理子系统管理,对Linux内核来说,虚拟设备和物理设备没有区别,都是网络设备,从网络设备来的数据,都会转发给协议栈,协议栈过来的数据,也会交由网络设备(设备驱动实现)发送出去,所以说虚拟网络设备的一端也是协议栈,而另一端是什么取决于虚拟网络设备的驱动实现。veth有以下三个特点:
- veth和其它的网络设备都一样,一端连接的是内核协议栈。
- veth设备是成对出现的,另一端两个设备彼此相连
- 一个设备收到协议栈的数据发送请求后,会将数据发送到另一个设备上去。
bridge相当于虚拟交换机,一端接入host的网络协议栈,其他端接veth的一个设备,veth的另一个设备接到docker容器所在的网络命名空间的协议栈,由此连通主机网络命名空间和容器网络命名空间。
容器1设备和路由:
Host设备和路由:
数据从容器中外发流程解析: 容器中配置网关为172.18.0.1,发出去的数据包先经过veth到达br-b9,然后交给host的协议栈,由于目的IP是外网IP,且host开启了IP forward功能,于是数据包会通过ens32发送出去,由于172.18.0.1是内网IP,所以一般发出去之前会先做NAT转换(如下图NAT转换和IP forward功能都需要自己配置)。
外部访问容器网络流程解析: 要让外部主机访问容器服务172.18.0.2:80,在容器创建时,将80端口映射到host的某个端口(此处为30080,docker run -p 30080:80),外部访问10.20.33.100:30080,匹配到DNAT规则,经由br-b9交换至对应veth设备端口,veth穿透网络命名空间至容器内部网口,由容器内部上层协议栈接收处理。
容器网络相关的常用命令工具
查看容器网络信息
docker inspect nt|grep -A 100 NetworkSettings
进入到容器所在的网络命名空间
docker exec -ti <ctr_name> bash #直接进入容器查看
docker inspect nt|grep -i pid # 通过nsenter进入容器所在命名空间
nsenter -n -t 2759