docker0网桥

docker0 网桥是 Docker 默认创建的虚拟网络接口,用于容器之间的网络通信。它是 Docker 在宿主机上创建的一个 Linux 桥接网络,允许容器通过这个桥接网络互相通信以及与宿主机进行通信。以下是关于 docker0 网桥的详细解释及其原理。

1. 什么是 docker0 网桥?

  • 定义docker0 是 Docker 在宿主机上创建的一个虚拟网桥接口。它的作用是将所有在 Docker 中运行的容器连接到同一个网络,使得这些容器可以通过 IP 地址相互通信。
  • 默认行为:当你启动一个 Docker 容器时,Docker 会将该容器连接到 docker0 网桥,并为其分配一个私有 IP 地址。所有连接到 docker0 网桥的容器都可以通过这个桥接网络进行通信。

2. 原理

2.1 Linux 网桥

  • 网桥的工作原理:Linux 网桥是一种网络设备,它可以连接多个网络接口,并根据 MAC 地址转发数据包。网桥工作在数据链路层(OSI 模型的第二层),它会学习连接到它的设备的 MAC 地址,并根据这些地址决定如何转发数据包。
  • 数据包转发:当一个容器发送数据包时,网桥会检查数据包的目标 MAC 地址,并将其转发到相应的接口。如果目标地址是连接到同一网桥的其他容器,数据包会被直接转发;如果目标地址不在网桥的学习表中,数据包会被广播到所有接口。

2.2 Docker 网络模型

  • 网络命名空间:Docker 使用 Linux 的网络命名空间来隔离容器的网络环境。每个容器都有自己的网络命名空间,容器内的网络接口和 IP 地址与宿主机和其他容器是隔离的。
  • **连接到 docker0**:当容器启动时,Docker 会将其网络接口连接到 docker0 网桥。容器通过这个网桥与其他容器和宿主机进行通信。
  • IP 地址分配:Docker 会为每个容器分配一个私有 IP 地址,通常是 172.17.0.0/16 网段。这个地址是从 Docker 的默认网络池中分配的。

2.3 创建 docker0 网桥

  • 启动 Docker 服务:当 Docker 服务启动时,它会自动创建一个名为 docker0 的虚拟网桥。可以通过以下命令查看网桥信息:
    1
    ip addr show docker0
  • 网桥配置docker0 网桥的默认 IP 地址通常是 172.17.0.1,子网掩码为 255.255.0.0。这个地址用于宿主机与容器之间的通信。

2.4 容器连接到 docker0

  • 容器启动:当启动一个新的容器时,Docker 会为该容器分配一个私有 IP 地址(通常在 172.17.0.0/16 网段内),并将其网络接口连接到 docker0 网桥。
  • 网络接口:每个容器都有一个虚拟网络接口(如 veth),这个接口的一端连接到容器的网络命名空间,另一端连接到 docker0 网桥。

2.5 IP 地址分配

  • IP 地址池:Docker 使用内置的 IP 地址池为容器分配 IP 地址。默认情况下,Docker 使用 172.17.0.0/16 网段。
  • 分配机制:当容器启动时,Docker 会从可用的 IP 地址池中选择一个地址,并将其分配给容器。可以通过以下命令查看容器的 IP 地址:
    1
    docker inspect <container_id> | grep "IPAddress"

2.6 数据包转发

  • 数据包转发机制:当一个容器发送数据包时,数据包会通过 veth 接口发送到 docker0 网桥。网桥会检查数据包的目标 MAC 地址,并根据学习到的地址转发数据包。
  • 学习 MAC 地址docker0 网桥会学习连接到它的容器的 MAC 地址,并将这些地址存储在一个转发表中。这样,当数据包到达网桥时,网桥可以快速决定将数据包转发到哪个接口。

2.7 容器与宿主机的通信

  • 宿主机访问容器:宿主机可以通过 docker0 网桥的 IP 地址访问容器。例如,如果容器的 IP 地址是 172.17.0.2,宿主机可以直接通过这个地址访问容器。
  • 端口映射:如果需要从宿主机访问容器中的服务,可以使用 Docker 的端口映射功能,将容器的端口映射到宿主机的端口。例如:
    1
    docker run -d -p 8080:80 nginx
    这将把宿主机的 8080 端口映射到容器的 80 端口。

2.8 网络隔离

  • 网络命名空间的隔离:每个容器运行在自己的网络命名空间中,这意味着容器之间的网络是隔离的。容器只能通过 docker0 网桥与其他容器或宿主机进行通信。
  • 安全性:这种隔离机制增强了安全性,因为容器之间不能直接访问彼此的网络接口。

2.9 容器与宿主机的通信

  • 宿主机访问容器:宿主机可以通过 docker0 网桥访问容器的 IP 地址。容器之间也可以通过各自的 IP 地址进行通信。
  • 端口映射:如果需要从宿主机访问容器中的服务,可以使用 Docker 的端口映射功能,将容器的端口映射到宿主机的端口。

docker0网桥
https://hawli.cn/2023/01/20/docker0网桥/
作者
krli
发布于
2023年1月20日
许可协议