最后更新:2022-08-02 13:00:13 手机定位技术交流文章
Docker 使用 Linux bridge 技术,当 Docker server 启动时,在主机上创建一个名为docker0的虚拟网络桥,在这个主机上启动的多克容器将与这个虚拟网络桥连接。虚拟网络桥梁的工作方法与物理交换器相似,这意味着所有主机上的容器通过开关连接到两个层次的网络。
下一步是将IP分配给容器,多克将使用RFC 1918中定义的私人IP段,选择与分配给docker0的主机不同的IP地址(Container-IP)和子网(每个容器的默认关口),与docker0连接的容器从这个子网中选择未使用IP使用。
如一般 Docker 会使用 172.17.0.0/16 这个网段,并将 172.17.0.1/16 分配给 docker0 网桥(在主机上使用 ifconfig 命令是可以看到 docker0 的,它可以被视为网络桥的管理接口,用作主机上的虚拟网络卡.
因为同一主机的容器连接到同一网络桥上,这样容器之间就能够通过容器的 Container-IP 直接通信。多克网络桥是一个虚拟化的主机,这不是真正的网络设备。无法定位外部网络,这意味着外部网络不能直接通过Container-IP访问容器。
如果容器要外部访问,您可以将容器端口映射到主机(端口映射),即 docker run 创建容器的时候通过-p 或-P 参数来启用,通过[主机IP]访问容器:访问容器时使用[容器端口]。
随机映射端口(从32768开始)docker run -d --name test1 -P alpine
指定映射端口docker run -d --name test2 -p 88:80 alpine
看下面的截图,我们发现这个容器带来的网卡都是一对一对的,这就是 evth-pair(virtual Ethernet pair)技术,就是一对的虚拟设备接口,它们都是成对出现的,一段连接着协议,一段彼此相连。正因为有这个特性,evth-pair 充当一个桥梁,来连接各种虚拟网络设备。

在这里插入图片描述
在安装Docker时,它将自动创建三个网络桥(创建一个容器默认连接到这个网络),没有,和主机。您可以使用以下的docker network ls或docker network list命令来列出这些网络
使用 docker run 创建 docker 容器时,可以用 **--net**或**--network**选项指定容器主机模式的网络模式:使用**--net=host**不指定任何模式:使用**--net=none**指定的容器模式:使用**--net=container:${NAME/ID}**指定的桥梁模式:使用**--net=bridge**指定的默认设置,可以省略
主机模式:使用--net=host指定
它相当于VMware的桥梁模式,其中主机位于同一网络,但没有独立的IP地址,并且使用主机的IP地址直接与外部世界通信,无需额外的转换。
当端口启动时,指定 either -network=host 或 -net=host,其中端口不受 -p 映射的影响,而端口号主要是 host 端口号,在重复时被乘数。
Docker 使用了 Linux 的 Namespace 技术来进行资源隔离,例如,PID Namespace隔离过程,Mount Namespace 隔离文件系统,Network Namespace 隔离网络等。一个 Network Namespace 提供了一份独立的网络环境,包括网卡,路由,iptable 规则等都与其他 Network Namespace 隔离。一个 Docker 容器一般会分配一个独立的 Network Namespace。
但是如果你使用主机模式启动容器,那么这个容器将不会获得一个独立的 Network Namespace ,而是和宿主机共用一个 Network Namespace 。容器不会虚拟化自己的网络卡,配置自己的IP,等等。相反,使用主机的IP和端口范围。容器不再具有孤立的独立网络堆栈,不拥有端口资源。
容器的网络使用主机的网络,但容器的其他方面,如文件系统、进程列表等,仍然与主机分开。
使用 none 模式,Docker 容器拥有自己的 Network Namespace ,但是,并不为 Docker 容器进行任何网络配置。
也就是说,这个 Docker 容器没有网卡、IP、路由等信息。这种网络模式下容器只有 lo 回环网络,没有其他网卡。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

在这里插入图片描述
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace (网络命名空间),而不是和宿主机共享。
新创建的容器不会创建自己的网络卡,配置自己的 IP,相反, 与指定的容器共享IP 、 端口范围等.同样,除了网络方面,还有两个容器,其他, 如文件系统, 进程列表等, 仍处于孤立状态.两个容器的过程可以通过网络卡设备进行通信.

在这里插入图片描述
bridge 模式是 docker 的默认网络模式,不用--net参数是桥梁模式。
相当于VMware中的nat模式,容器使用独立 network Namespace ,并连接到Docker0虚拟网络卡.通过docker0网络桥和iptables nat表配置与主机的通信,此模式会为每一个容器分配 Network Namespace、设置 IP 等,连接一个主机上的Docker容器到一个虚拟网络桥上。
当多克进程启动时,在主机上创建一个名为docker0的虚拟网络桥,在这个主机上启动的多克容器将与这个虚拟网络桥连接。虚拟网络桥梁的工作方法与物理交换器相似,这意味着所有主机上的容器通过开关连接到两个层次的网络。
从docker0子网向使用容器分配IP,并设置docker0的IP地址为容器的默认端口。在主机上创建一个虚拟网络卡对设备.静脉装置总是在两对出现,它们构成了一个数据渠道,从一个设备输入数据,它将来自另一个设备。因此,静脉设备通常用于连接两个网络设备.

在这里插入图片描述
Docker 将 veth pair 设备的一端放在新创建的容器中,并命名为 eth0(容器的网卡),另一端放在主机中,以类似的名称命名,如 veth*,将此网络设备添加到docker0网络桥上。可以通过brctl show命令查看。
yum install bridge-utils -y

当使用dockerrun-p时,docker实际上是一个由iptables创建的DNAT规则,用于实现端口传输函数。iptables -t nat -nL查看。

在这里插入图片描述
新建自定义网络:docker network create ${network-name}

在这里插入图片描述
以我们新建的网络启动两个 alpine 容器,进入任意一个容器,ping 另外一个容器的名字,yeah,ping 通了~

在这里插入图片描述
本文由 在线网速测试 整理编辑,转载请注明出处。