Docker 网络详解
一、Docker 网络概述
Docker 网络是容器间通信的基础,它允许容器之间进行隔离和互联。Docker 提供了多种网络模式,用于满足不同的容器通信需求。通过合理的网络配置,可以实现容器之间的安全通信、服务发现以及与外部网络的交互。
二、Docker 网络模式
(一)默认网络模式
-
桥接网络(Bridge Network)
-
原理:Docker 默认会创建一个名为
docker0
的虚拟以太网桥。每个容器启动时,Docker 会从一个预定义的 IP 池中分配一个 IP 地址给容器,并将容器连接到docker0
桥接网络上。 -
特点:
-
容器之间可以通过 IP 地址进行通信。
-
容器对外部网络不可见,需要通过端口映射(
-p
参数)才能暴露服务。 -
适用于需要隔离但又需要通信的容器场景。
-
-
-
配置示例:
# 创建一个名为 my_bridge 的桥接网络 docker network create my_bridge # 启动容器并连接到 my_bridge 网络 docker run --network my_bridge -d nginx
-
-
主机网络(Host Network)
-
原理:容器直接使用宿主机的网络栈,与宿主机共享网络命名空间。容器的网络接口与宿主机的网络接口直接相连。
-
特点:
-
容器与宿主机共享 IP 地址和端口,没有网络隔离。
-
性能高,因为没有额外的网络封装和转发。
-
不适用于需要隔离的场景,但适合对性能要求极高的场景。
-
-
-
配置示例:
docker run --network host -d nginx
-
-
无网络(None Network)
-
原理:容器不配置任何网络接口,仅保留回环接口(
lo
)。 -
特点:
-
容器完全隔离,无法与其他容器或外部网络通信。
-
适用于不需要网络功能的容器,例如离线计算任务。
-
-
配置示例:
docker run --network none -d busybox
-
(二)自定义网络模式
-
用户定义的桥接网络(User-Defined Bridge Network)
-
原理:用户可以自定义桥接网络,与默认的
docker0
网络相比,用户定义的桥接网络提供了更好的隔离性和高级功能,例如自定义子网、DNS 解析等。 -
特点:
-
容器之间可以通过容器名称进行通信(通过内置 DNS 解析)。
-
支持自定义子网和 IP 范围。
-
适用于多容器应用的内部通信。
-
-
配置示例:
# 创建自定义桥接网络 docker network create --subnet=192.168.1.0/24 my_custom_bridge # 启动容器并连接到自定义桥接网络 docker run --network my_custom_bridge -d nginx
-
-
覆盖网络(Overlay Network)
-
原理:覆盖网络用于跨多个 Docker 守护进程的容器通信,适用于 Docker Swarm 模式。它通过封装数据包,实现跨主机的容器通信。
-
特点:
-
支持多主机通信。
-
容器可以通过服务名称进行通信。
-
适用于分布式应用和微服务架构。
-
-
配置示例:
# 初始化 Docker Swarm docker swarm init # 创建覆盖网络 docker network create --driver overlay my_overlay # 在 Swarm 中启动服务并连接到覆盖网络 docker service create --network my_overlay --replicas 3 nginx
-
-
Macvlan 网络
-
原理:Macvlan 网络允许容器直接连接到物理网络,每个容器获得一个独立的 MAC 地址,就像物理设备一样直接接入网络。
-
特点:
-
容器可以直接与外部网络通信,无需通过宿主机转发。
-
适用于需要直接接入物理网络的场景,例如网络设备模拟。
-
-
配置示例:
# 创建 Macvlan 网络 docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 my_macvlan # 启动容器并连接到 Macvlan 网络 docker run --network my_macvlan -d nginx
-
三、Docker 网络管理
(一)查看网络
-
命令:
docker network ls
-
功能:列出所有 Docker 网络,包括默认网络和用户自定义网络。
(二)检查网络详情
-
命令:
docker network inspect <network_name>
-
功能:查看指定网络的详细配置信息,包括子网、网关、容器列表等。
(三)删除网络
-
命令:
docker network rm <network_name>
-
功能:删除指定的用户自定义网络。默认网络(如
bridge
、host
、none
)不能被删除。
(四)连接和断开容器
-
连接容器:
docker network connect <network_name> <container_name>
-
断开容器:
docker network disconnect <network_name> <container_name>
-
功能:动态地将容器连接到或断开指定网络。
四、Docker 网络高级特性
(一)DNS 解析
-
Docker 自定义网络(如用户定义的桥接网络和覆盖网络)支持内置 DNS 解析。容器可以通过容器名称或服务名称相互解析和通信。
-
示例:
-
在同一个自定义桥接网络中,容器 A 可以通过
ping container_b
来解析容器 B 的 IP 地址。
-
(二)端口映射
-
原理:通过
-p
参数将宿主机的端口映射到容器的端口,使容器服务可以被外部访问。 -
格式:
-
docker run -p <宿主机端口>:<容器端口> <image>
-
-
示例:
docker run -p 80:80 -d nginx
-
宿主机的 80 端口被映射到容器的 80 端口,外部可以通过宿主机的 IP 地址访问容器中的 Nginx 服务。
-
(三)网络插件
-
Docker 支持第三方网络插件,例如 Calico、Weave 等,这些插件可以扩展 Docker 的网络功能,提供更复杂的网络配置和安全策略。
五、Docker 网络安全
(一)网络隔离
-
通过使用不同的网络模式和自定义网络,可以实现容器之间的网络隔离,防止未经授权的通信。
(二)防火墙规则
-
可以在宿主机上配置防火墙规则,限制容器的网络访问权限,例如仅允许特定端口或 IP 地址的通信。
(三)安全组
-
在某些 Docker 网络插件(如 Calico)中,可以使用安全组功能,定义容器之间的访问规则,增强网络安全性。