Docker 使用网络来允许容器之间以及容器与外部世界之间的通信。Docker 的网络原理涉及以下几个关键概念:
Docker 网络驱动
Docker 网络基于网络驱动来创建和管理。以下是 Docker 支持的几种网络驱动:
- 桥接网络(bridge):这是 Docker 的默认网络模式。在这种模式下,Docker 守护进程创建一个名为
docker0
的虚拟网桥,容器通过这个网桥连接到 Docker 主机网络。 - 主机网络(host):容器共享 Docker 主机的网络命名空间,使得容器可以直接访问主机的网络接口。
- 覆盖网络(overlay):用于跨多个 Docker 主机的容器网络通信。
- MACVLAN:允许容器拥有一个唯一的 MAC 地址,使其在网络中表现得像物理设备一样。
- 网络插件:允许使用第三方网络解决方案。
Docker 网络关键组件
- 网络命名空间:Linux 网络命名空间为容器提供了一个隔离的网络环境,包括网络接口、路由表、IP 地址等。
- 虚拟网络接口:容器内的虚拟网络接口与 Docker 主机上的虚拟网桥
docker0
相连。 - 虚拟网桥:Docker 默认创建的
docker0
网桥允许容器之间以及容器与 Docker 主机之间的通信。 - IP 地址管理:Docker 负责为容器分配 IP 地址,通常是通过 DHCP 方式。
Docker 网络工作原理
以下是一个简化的 Docker 网络工作流程:
-
创建网络:当你创建一个新的 Docker 网络,D�始化网络驱动,并为网络创建一个网络命名空间。
-
容器连接:当你启动一个容器时,你可以将其连接到一个或多个网络。Docker 为容器创建一对虚拟网络接口(veth pair),一端放在容器的网络命名空间内,另一端连接到虚拟网桥或主机网络命名空间。
-
IP 分配:Docker 为每个容器分配一个 IP 地址,并设置网络掩码、网关等。
-
容器通信:
- 同一主机上的容器:通过虚拟网桥
docker0
通信。 - 跨主机容器通信:通过覆盖网络或第三方网络插件实现。
- 同一主机上的容器:通过虚拟网桥
-
端口映射:Docker 允许将容器的端口映射到宿主机的端口,这样外部网络就可以访问容器内的服务。
示例:桥接网络
假设你启动了一个新的 Docker 容器:
bash
docker run -d --name myweb nginx
以下是桥接网络的工作流程:
- Docker 创建一对虚拟网络接口(veth pair)。
- 一端(如
veth1234
)放在容器的网络命名空间内,另一端(如vethec56
)连接到docker0
网桥。 - Docker 分配一个 IP 地址(如
172.17.0.2
)给容器内的网络接口。 - 容器可以通过这个 IP 地址与同一桥接网络上的其他容器通信。
- 如果需要,Docker 会在宿主机上设置端口映射,允许外部访问容器内的服务。
Docker 网络是容器化的核心组成部分,理解其工作原理对于有效管理和故障排除容器化应用程序至关重要。