玖叶教程网

前端编程开发入门

Docker 网络详解

Docker 网络详解

  • Bridge contauner 桥接式网络模式
  • Host(open) container 开放式网络模式
  • Container(join) container 联合挂载式网络模式,是host网络模式的延伸
  • None(Close) container 封闭式网络模式

Bridge(桥接式网络模式)

1. 介绍

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机启动的Docker容器会连接到这个虚拟网桥上,默认分配网段为172.17.0.0/16,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机,附加在其上的任何网卡之间都能自动转发数据包。

从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机创建一对虚拟网卡veth pair 设备,Docker将veth pair 设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主句中,以vethxxx这样的名字命名,并将这个网络设备加入到docker0网桥中。

veth 是 Virtual ETHernet 的缩写,是一种虚拟网络设备。它的特点是:当它被创建以后,总是以两张虚拟网卡(Veth peer)形式成对出现,并且在一个网卡上的数据包可直接转发给另一个与之对应的网卡上,即使这两个网卡不在同一个namespace中。

2. 容器与容器间的通信

容器1(172.17.0.2)ping 容器2(172.17.0.3);

根据路由规则,数据包从容器1(172.17.0.2)的eth0转发至与之对应的veth上,该veth桥接在了docker0上,此时数据包到达了docker0,docker0扮演交换机的角色,并广播ARP请求寻找容器2(172.17.0.3)的mac地址,而此时容器2的另一个veth 设备桥接在了docker0,并收到ARP请求,发现自己是172.17.0.3 ,故将其mac地址回复给容器1,此时容器1和容器2就可以进行通信了,并且在容器1可以查看到缓存的容器2的mac地址。

3. 容器与外部网络通讯

同理,如果容器ping另一个主机,它发出去的数据包经过docker0网桥流向宿主机的eth0网卡,eth0再将数据包转发给与之相通的主机,于是,容器便可以跟其它主机通信了。(主要宿主机eth0能到达,容器都可以与之通信)

4. 宿主机与容器通讯

当宿主机访问容器时,数据包从docker0流入到与容器的eth0对应的veth设备,veth与容器的eth0相通信。

5. 外部访问容器

默认情况,其他外部网络(宿主机以外)无法访问到容器内的端口,通常的做法是使用-p或者-P选项,来暴露容器中的端口到宿主机上,外部网络通过访问宿主机的端口从而访问到容器端口。本质上来说,该方式是通过iptables规则转发实现的。

6. 自定义网桥

除了使用默认docker0作网桥以为还可以使用docker network 相关命令自定义网桥,以下将创建一个br1的网络,子网是172.30.0.0/16,网关为172.30.0.1。


#创建br1网桥
docker network create -d bridge --subnet '172.30.0.0/16' --gateway '172.30.0.1' br1

#查看docker网络 docker network ls
 NETWORK ID NAME DRIVER SCOPE
 b9c01f82c16b br1 bridge local
 
#自定义网桥的使用 
docker run -it --network br1 镜像名称 bash

Host(开放式网络模式)

Host模式使用是在容器启动时候指明--network host,此时容器共享宿主机的Network Namespace,容器内启动的端口直接是宿主机的端口,并且容器不会创建网卡和IP,直接使用宿主机的网卡和IP,但是容器内的其他资源是隔离的,如文件系统、用户和用户组。这种模式的好处就是效率高,因为不需要额外的网络开始,直接使用宿主机网络。

docker run -d --name nginx --network host nginx:latest

Container(联合挂载式网络模式)

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo回环 通信。同样,kubernetes中的pod的话,pod内的网络也是靠这样的共享方式来实现的。

None(封闭式网络模式)

使用--network none选项指定其网络模式,在该模式下虽然容器有着自己的Network Namespace,但是容器内没有网卡、IP、路由信息,只有一个lo回环接口。如果需要网络配置则需要用户手动进行配置网卡、ip以及路由信息,通常这样的容器用于承担某些无需网络介入的工作,如离线任务、备份等。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言