Docker网络
概述
本文档旨在详细介绍Docker网络的核心原理、常用网络模式、配置方法及常见问题排查,为开发、运维人员提供Docker网络相关的操作指南和技术参考,帮助快速掌握Docker网络的使用与调优技巧。
核心作用
Docker网络是Docker容器与外部(宿主机、其他容器、互联网)进行通信的基础,其核心作用包括:
-
实现容器与容器之间的互联互通,支持多容器协作部署(如前端容器与后端容器通信);
-
实现容器与宿主机之间的网络交互,支持容器访问宿主机服务或宿主机访问容器服务;
-
实现容器与外部网络(互联网)的通信,支持容器对外提供服务或访问外部资源;
-
隔离网络环境,通过网络策略控制容器的访问权限,保障容器运行的安全性。
核心概念
-
网络命名空间(Network Namespace):Linux内核提供的网络隔离技术,每个Docker容器默认拥有独立的网络命名空间,包含独立的网卡、IP地址、路由表、端口等网络资源,实现容器网络环境的隔离;
-
网桥(Bridge):Docker默认的网络设备,用于连接同一宿主机上的多个容器,实现容器之间的二层通信,类似物理网络中的交换机;
-
端口映射(Port Mapping):将宿主机的端口映射到容器的端口,实现外部网络通过宿主机端口访问容器内部服务;
-
IP地址分配:Docker会为每个容器自动分配IP地址(默认从私有网段中分配),也支持手动指定固定IP;
-
网络驱动(Network Driver):Docker网络的核心组件,不同的驱动对应不同的网络模式,实现不同的通信场景(如桥接、Host、Overlay等)。
bridge模式(默认模式)
原理
bridge模式是Docker容器默认使用的网络模式,宿主机会创建一个名为docker0的虚拟网桥,所有使用bridge模式的容器都会连接到该网桥上,容器通过网桥实现与其他容器、宿主机及外部网络的通信。
容器启动时,Docker会为容器分配一个独立的虚拟网卡(veth pair),一端连接容器的网络命名空间,另一端连接docker0网桥,同时为容器分配一个来自私有网段(默认172.17.0.0/16)的IP地址,网关指向docker0网桥的IP(默认172.17.0.1)。
特点
-
容器拥有独立的网络命名空间,网络环境隔离;
-
同一宿主机上的容器可通过
docker0网桥直接通信,无需端口映射; -
容器访问外部网络需通过宿主机的NAT转换(宿主机将容器IP转换为自身公网/内网IP);
-
外部网络访问容器需配置端口映射。
使用方式
默认情况下,容器启动时自动使用bridge模式,无需额外配置:
# 启动容器,默认使用bridge模式
docker run -it --name test-container nginx手动指定bridge模式(与默认效果一致):
docker run -it --name test-container --network bridge nginxhost模式
原理
host模式下,容器不会创建独立的网络命名空间,而是直接共享宿主机的网络命名空间,容器的网卡、IP地址、路由表、端口等网络资源与宿主机完全一致。
容器启动后,其内部监听的端口会直接占用宿主机的对应端口,外部网络可通过宿主机IP+端口直接访问容器服务,无需配置端口映射。
特点
-
容器不占用额外的IP地址,共享宿主机网络资源;
-
网络性能最优,无NAT转换和网桥转发的开销;
-
端口冲突风险高(容器与宿主机、其他host模式容器的端口不能重复);
-
网络环境无隔离,容器可直接访问宿主机的所有网络资源。
使用方式
通过--network host参数指定host模式:
# 启动容器,使用host模式,容器内80端口直接对应宿主机80端口
docker run -it --name test-host-container --network host nginxnone模式
原理
none模式下,Docker会为容器创建独立的网络命名空间,但不会为容器配置任何网络资源(无网卡、无IP地址、无路由表),容器处于完全隔离的网络环境中,无法与外部(包括宿主机、其他容器)进行通信。
特点
-
网络隔离性最强,容器无法与任何外部网络通信;
-
无网络资源开销,适用于无需网络通信的场景(如离线数据处理);
-
可手动为容器配置网卡、IP等网络资源,实现自定义网络隔离。
使用方式
通过--network none参数指定none模式:
# 启动容器,使用none模式,容器无网络连接
docker run -it --name test-none-container --network none nginxDocker自定义网络
# 基本创建(默认自动分配网段)
docker network create my-bridge-network
# 自定义网段、网关创建(推荐)
docker network create --driver bridge --subnet 172.20.0.0/16 --gateway 172.20.0.1 my-bridge-network参数说明:
-
--driver bridge:指定网络驱动为bridge; -
--subnet:指定自定义网段(如172.20.0.0/16); -
--gateway:指定网关IP(需在subnet网段内); -
my-bridge-network:自定义网络名称。
容器加入自定义网络
# 方式1:启动容器时加入
docker run -it --name test-container1 --network my-bridge-network nginx
# 方式2:为运行中的容器加入(需重启容器生效)
docker network connect my-bridge-network test-container2为容器分配固定IP
# 启动容器时指定固定IP(IP需在自定义网络的subnet网段内)
docker run -it --name test-fixed-ip --network my-bridge-network --ip 172.20.0.10 nginx端口映射配置
当容器需要对外提供服务(如web服务、数据库服务)时,需配置端口映射,将宿主机的端口映射到容器的端口,外部网络通过宿主机IP+映射端口访问容器服务。
指定端口
docker run -it -p 8080:80 --name test-port-container nginx绑定指定IP的端口映射
# 绑定宿主机192.168.1.100的8080端口到容器80端口
docker run -it -p 192.168.1.100:8080:80 nginx
# 绑定宿主机本地回环IP(127.0.0.1),仅允许宿主机内部访问容器
docker run -it -p 127.0.0.1:8080:80 nginx容器DNS配置
Docker容器默认继承宿主机的DNS配置(/etc/resolv.conf),也可手动指定容器的DNS服务器,解决容器无法解析域名的问题:
# 启动容器时指定DNS服务器
docker run -it --name test-dns --dns 8.8.8.8 --dns 114.114.114.114 nginx
# 查看容器的DNS配置
docker exec test-dns cat /etc/resolv.conf