docker网络模式
docker的五大网络传输示意图
第一种:closed container
只有宿主机可以访问容器,其他主机访问不了容器
第二种:bridge container A
private interface是私有网卡(ens33),容器私有网卡与docker bridge通过容器虚拟接口相互连接,这个docker bridge名称就是docker 0,网桥通过本地主机接口打开数据报文转发发送至物理网卡,物理网卡通过互联网进行数据转发
网络名称与网桥名称的区分
网络名称
启动容器时指定的是网络名称,不指定默认使用bridge网络
在该模式中,每个容器的网卡名为默认eth0,而对docker 0来说是以veth开头的网卡,
修改docker 0网段
该模型默认会创建一个docker 0网桥作为docker主机中所有容器的网关,地址默认为172.17.0.1,容器从该网段随机获取一个地址,如果要修改容器默认网桥信息,可以通过修改daemon.json配置文件,下面是官方示例
{
"bip": "192.168.1.5/24", #网桥网段
"fixed-cidr":"192.168.1.5/24" #网桥掩码位数
"fixed-cidr-v6": "2001:db8::/64" #IPv6地址
"mtu": 1500, #最大传输单元
"default-gateway": "10.210.1.1", #默认网关
"default-gateway-v6": "2001:db8:abcd::89", #默认网关IPv6地址
"dns": ["10.20.1.2","10.20.1.3"] #dns服务器地址
}
网桥名称
其实是网卡名称,ifconfig显示的网卡名,docker 0就是docker默认使用的网桥
第三种:joined container
与open container类似,不同的是容器之间共享三大命名空间 ,不必借助宿主机进行通信,直接通过共享命名空间通信
第四种:open container
容器与本地回环网卡和私有网卡直接连接,容器与宿主机直接共享三大命名空间:ipc、uts、network
相互隔离的三大命名空间:mount、pid、user
pid 命名空间
不同用户的进程就是通过pid命名空间隔离开的,且不同命名空间中可以有相同pid。在同一个Namespace中只能看到当前命名空间的进程。所有的LXC进程在Docker中的父进程为Docker进程,每个LXC进程具有不同的命名空间。同时由于允许嵌套,因此可以很方便的实现嵌套的Docker容器。
net 命名空间
有了pid命名空间, 每个命名空间中的pid能够相互隔离,但是网络端口还是共享host的端口。网络隔离是通过net命名空间实现的,每个net命名空间有独立的网络设备, IP地址, 路由表, /proc/net目录。这样每个容器的网络就能隔离开来。Docker默认采用veth的方式,将容器中的虚拟网卡同host上的Docker网桥docker0连接在一起。
ipc 命名空间
容器中进程交互还是采用了Linux常见的进程间交互方法(interprocess communication – IPC),包括信号量、消息队列和共享内存等。然而跟VM不同的是,容器的进程间交互实际上还是host上具有相同pid命名空间中的进程间交互,因此需要在 IPC 资源申请时加入命名空间信息,每个 IPC资源有一个唯一的32位id。
mnt 命名空间
类似chroot,将一个进程放到一个特定的目录执行。mnt命名空间允许不同命名空间的进程看到的文件结构不同,这样每个命名空间中的进程所看到的文件目录就被隔离开了。同chroot不同,每个命名空间中的容器在/proc/mounts的信息只包含所在命名空间的mount point。
uts 命名空间
UTS(“UNIX Time-sharing System”) 命名空间允许每个容器拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非 主机上的一个进程。
浙公网安备 33010602011771号