Docker网络管理
Docker容器网络模型
Dokcer网络架构,容器的网络被抽离成单独的Docker网络库,也称为linenetwork,libnetwork提供统提供统一的网络接口。Docker damon通过调用libnetwork对外提供AIP完成网络创建和管理等功能,libnetwork中使用CNM(具体实现)来完成网络功能的提供。
CNM,CNM主要有sandbox、endpoint、network三个组件,libnetwork内置5种驱动提供不同类型的网络服务。
sndbox,sndbox包含了容器网络栈信息,可以实现mnetwork namespaces,sandbox可以有多个endpoint和network。
endpoint,endpoint可以加入一个sandbox和network。endpoint的实现如veth-pair设备,这种设备成对出现,一个设备收到协议栈的数据发送请求后,会将数据发送到另一个设备上去,一个endpoint只能属于一个sandbox和一个network。
network,network是提供让多个endpoint互相访问的endpoint,实现是Linux bridge等
libnetwork内置驱动
1.bridge,bridge驱动是Docker的默认驱动,安装后Docker会自动创建Docker网桥,新建的容器会自动连接到Docker网桥
2.hsot,host驱动libnetwork不为容器创建独立的network namespace,与宿主机共享同一个network namespace,仅仅是网络共享其他资源隔离,可能会引起端口资源冲突
3.overlay,overlay覆盖网络可以实现跨节点通信,不过需要注册中心配置路由,可以使用etcd或者consul来注册容器对应的IP
4.remote,需要根据libnetwork的标准自行实现接口
5.null,不提供网络配置
bridge驱动
bridge宿主机网桥,安装Docker后可以通过ip a看到多了一块网络设备docker0,IP为172.17.0.1/16。route -n看到多了一条静态路由(表示所有目的IP为172.17.0.0的数据包都从docker0发出),docker0就充当交换机
bridge连接容器,启动一个容器,宿主机内会创建一个网卡,与容器内的网卡eth0是一对veth pair,实现两个network namespace之间的通信
iptables实现容器访问外网,Docker安装完成后会自动创建iptables规则:-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE ,表示从docker0发出的源地址为172.17.0.0/16的ip,转换为对应网卡的流量。让容器有了可以网文外网流量
iptables实现容器端口映射供外网访问,docker run -d -p 8081:80 nginx,启动一个nginx将容器的端口映射到宿主机的8081,查看iptables,将访问宿主机的8081端口的数据DNAT到了容器的endpoint上
hostname与hosts与resolv,在容器中通过mount命令可以查看到三个文件通过挂载的方式,因为镜像不会存储这写数据。hostname就是容器ID,resolv配置的解析与宿主机一致,hosts只解析容器ID。(修改宿主机resolv时必须重启容器才能实现同步)
参考
《Docker容器与容器云第二版》