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 的端口映射功能,将容器的端口映射到宿主机的端口。例如:这将把宿主机的 8080 端口映射到容器的 80 端口。
1
docker run -d -p 8080:80 nginx
2.8 网络隔离
- 网络命名空间的隔离:每个容器运行在自己的网络命名空间中,这意味着容器之间的网络是隔离的。容器只能通过
docker0网桥与其他容器或宿主机进行通信。 - 安全性:这种隔离机制增强了安全性,因为容器之间不能直接访问彼此的网络接口。
2.9 容器与宿主机的通信
- 宿主机访问容器:宿主机可以通过
docker0网桥访问容器的 IP 地址。容器之间也可以通过各自的 IP 地址进行通信。 - 端口映射:如果需要从宿主机访问容器中的服务,可以使用 Docker 的端口映射功能,将容器的端口映射到宿主机的端口。
docker0网桥
https://hawli.cn/2023/01/20/docker0网桥/