容器网络学习笔记:一、Docker网络的实现

345 阅读6分钟

Docker中的网络

主要包括以下几种类型:

1、桥接网络(Bridge NetWork)

Docker 默认创建的网络类型,使用 Linux 的 bridge 实现。容器连接到桥接网络后,会被分配一个 IP 地址,并可以通过其他容器或主机上的端口访问。在同一桥接网络内的容器可以相互通信。

什么是桥接网络?

桥接网络(Bridge Network)是 Docker 的一种默认网络类型,它使用 Linux 的 bridge 实现。在桥接网络中,Docker 会自动创建一个虚拟的网桥,并将容器连接到该网桥上,从而实现容器之间的通信和与主机之间的通信。

当容器启动时,Docker 会自动为其分配一个 IP 地址,并将其添加到相应的网桥中。如果多个容器连接到同一个网桥上,则它们可以直接相互通信,就像位于同一局域网内的计算机一样。

桥接网络可以通过命令行或 Docker Compose 等工具进行配置和管理。用户可以指定容器所在的网桥、IP 地址范围、DNS 设置等参数,以满足不同的需求。

需要注意的是,桥接网络可能存在一些安全问题,如 ARP 欺骗攻击和 DHCP 中毒攻击等。

网桥作用在oci几层?

网桥(Bridge)是一种网络设备,通常用于连接两个或多个网络,将它们组成一个逻辑上的单一网络。在 Open Container Initiative(OCI)中,网桥主要用于容器网络的实现。

网桥作用在 OSI 七层模型的第二层(数据链路层),即在 MAC 层进行工作。当容器连接到网桥时,可以通过网桥的 MAC 地址表进行转发和过滤,使得容器之间可以相互通信,并且只有经过授权的数据包才能被转发。

除了桥接网络,OCI 还支持其他网络类型,如 Host 网络、Overlay 网络等。不同的网络类型采用不同的技术,但都需要使用网桥来实现容器之间的通信。例如,Overlay 网络使用 VXLAN 协议封装容器数据包,并通过网桥进行转发和解封装。

总之,网桥作为一种网络设备,在 OCI 中被广泛应用于容器网络的实现,为容器提供了高效、可靠和安全的通信机制。它可以直接转发数据包,而不需要使用路由器等设备进行处理。

桥接网络通过将不同网络的数据链路层连接在一起来实现。当一个数据包到达一个端口时,桥接器会查看该数据包的目的MAC地址,并将其转发到适当的端口,以便达到目标设备。如果不知道目标设备的位置,那么它会广播数据包以寻找目标设备。这样,目标设备的位置就被桥接器学习到了,从而提高了数据包转发的效率。

下面是一个简单的图示来说明桥接网络的实现方式:

        Network A                           Network B
     +---------------+                 +---------------+
     |  Device A1    |                 |   Device B1   |
     +---------------+                 +---------------+
             |                                    |
             +------------------+-----------------+
                                |
                        Bridge Device
                                |
             +------------------+-----------------+
             |                                    |
     +---------------+                 +---------------+
     |  Device A2    |                 |   Device B2   |
     +---------------+                 +---------------+

在以上示例中,桥接设备(Bridge Device)将Network A和Network B连接在一起,使得设备A1、A2和设备B1、B2之间可以直接通信。

具体地,当设备A1想要与设备B2通信时,它会将数据包发送到桥接设备上,桥接设备会查看该数据包的目标MAC地址,并将其转发给Network B中的设备B2。同样地,设备B2也能够向设备A1发送数据包。这样,通过桥接设备的连接,两个网络之间实现了直接通信。

需要注意的是,为了避免数据包的循环转发,桥接设备会学习每个设备的MAC地址并记录在桥接表中,从而判断应该将数据包转发到哪个端口上。如果桥接设备无法找到目标设备的MAC地址,则会广播数据包到所有的端口上,以便寻找目标设备。

在计算机网络中,广播(Broadcast)指的是将数据包从一个节点发送到所有连接的节点的操作。这意味着每个接收器都会收到相同的数据包,而不管它是否是目标接收器。播通常用于网络中需要向多个设备发送相同信息的场景。例如,当一个网络设备想要查找另一个设备时,它可以广播一个查询消息,以便所有连接的设备都能够收到并响应。在局域网中,广播通常通过发送到特定的MAC地址(FF:FF:FF:FF:FF:FF)来实现。这个MAC地址被称为广播地址,表示数据包应该被发送到所有连接的设备。广播还可以通过IPv4或IPv6协议中定义的特殊IP地址来实现,例如IPv4中的255.255.255.255地址和IPv6中的ff02::1地址。

2、主机网络(Host NetWork)

容器直接使用宿主机的网络栈和 IP 地址,与宿主机共享网络命名空间。这意味着容器的网络性能与宿主机相同,但可能会存在端口冲突等问题。

当使用主机网络模式时,Docker会启动一个新的进程(Docker-proxy),它会监听容器内部的网络请求,并将这些请求转发到宿主机上。同时,容器与宿主机之间的数据通信不需要经过Docker虚拟网桥或者NAT等额外的网络转换,因此可以获得更高的网络性能和更低的延迟。

3、None网络 (None NetWork)

容器不隶属于任何网络,没有网络接口和 IP 地址。这种网络类型适用于某些特殊场景,如只需要执行一次命令的容器。

4、Overlay网络 (Overlay NetWork)

用于跨主机容器之间的通信,这种网络类型适用于分布式应用程序和集群环境。Docker的overlay网络是一种软件定义网络技术,允许在多个Docker主机之间创建和管理跨主机容器的网络。它使用 VXLAN 或 IPSec 等协议进行封装和加密传输,将容器数据包从一个主机传输到另一个主机,并提供了透明的网络通信,使得跨主机的容器可以像在同一主机上运行一样通信。Overlay网络还支持动态路由协议和服务发现,以便更好地管理跨主机容器的通信。

除了以上四种网络类型,Docker 还支持用户自定义的网络类型,允许用户灵活地配置网络规则、安全策略等。用户自定义的网络类型可以使用 Docker 提供的网络驱动程序 API 进行实现。