小菜鸟自己做笔记 --> docker网络
docker网络架构是基于CNM的一种开源方案 Libnetwork是对CNM的一种具体实现,代码落地,实现了CNM方案的核心功能,控制和管理的功能
Libnetwork还需要接入驱动,驱动有很多种,主要实现网络联通和隔离性 CNM --> Libnetwork --> 网络驱动 首先记一些不常用但是很有用的网络命令 docker默认网络就是bridge模式,这种模式基于linux网桥技术+Linux veth pair实现
那就得先了解一下linux网桥,网桥要实现的功能类似交换机,但又不完全一样,交换机是单纯运行在数据链路层的设备,但是linux网桥需要用的TCP/IP进行数据转发。
网桥的工作原理大概是这样的
1、创建一个网桥设备配置ip端口,然后再这个网桥设备上添加网卡(相当于在交换机上插电脑的网线)。
这样的话只有网桥是工作在TCP/IP协议上,插到网桥上的网卡就不需要配置ip地址了,他们的数据是由网桥通过二层协议转发的。
可以通过手动设置网桥练习,从而更好的理解docker bridge模式
以下是创建网桥的命令
ip命令建桥
ip link add br2 type bridge # 创建网桥
ip link set dev eth0 master br2 # 为网桥添加物理接口
ip link del br2 type bridge # 删除网桥
ip link set dev eth0 nomaster # 删除网桥接口
ip addr show type bridge # 显示网桥列表信息
ip addr show type bridge br2 # 显示网桥br2的信息
网桥了解完了下一个就是Linux veth pair,
veth pair是成对出现的一种虚拟网络设备接口,一端连着网络协议栈,一端彼此相连
主要作用就是将两个的隔离netns连接起来,netns就是网络名称空间(就是ip端口啥的,在网络的世界上每个netns就是一个单独的主机)
这种方式是用veth pair的两个设备直接吧两个隔离的名称空间连起来了相当于用一根网线吧两台PC连接起来
但是这样的网络拓扑存在一个弊端,随着网络设备的增多,网络连线的复杂度将成倍增长。 如果连接四个netns时,网络连线就成了下图的样子,怎么解决这个问题?linux bridge就派上用场了。
下面开始学习docker bridge网络,
学习docker网络时就可以吧容器理解成隔离起来的netns(用一台主机有两个隔离出来的netns),我们有了linux bridge和veth pair,怎么用这两个技术解决多个netns之间的通讯问题
我们建立了一个网桥,三个netns,三对veth pair,分别一端在netns中,另一端连接在网桥上,这样就解决了veth pair直连的弊端。将br0换成docker0就是docker bridge网络大概的样子了。
docker安装后会生成docker0网卡供容器使用
创建容器后会生成veth pair虚拟设备,一端名称为eth0@"编号" 连接在容器内部的netns里,分配和docker0 网桥一样网段的ip,docker0网桥ip相当于容器的网管,流量都走docker0出去。另一端名称为veth** 这个网卡连接在docker0网桥上,而且这个网卡不需要ip,通过二层的mac地址作为唯一标识这样docker0就知道数据包过来应该走那个网卡,和交换机的原理差不多。
docker 的bridge模式就讲完了,但是现在还有一个问题,容器间只能在同一个宿主机上通讯,跨主机就不行了
现在的情况宿主机之前的网络可以理解成公网,docker网络可以理解为内网,公网不能直接访问内网的ip
让公网可以访问到内网服务器的一种技术叫做nat
所以docker -p 命令作用就是把宿主机当做nat服务器用iptables命令设置一条转换规则,流量进入宿主机的某个端口,这个端口通过iptables规则转换到容器网络。(nat模式我也不太熟,还得再学习学习)