Docker网络

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 nginx

host模式

原理

host模式下,容器不会创建独立的网络命名空间,而是直接共享宿主机的网络命名空间,容器的网卡、IP地址、路由表、端口等网络资源与宿主机完全一致。

容器启动后,其内部监听的端口会直接占用宿主机的对应端口,外部网络可通过宿主机IP+端口直接访问容器服务,无需配置端口映射。

特点

  • 容器不占用额外的IP地址,共享宿主机网络资源;

  • 网络性能最优,无NAT转换和网桥转发的开销;

  • 端口冲突风险高(容器与宿主机、其他host模式容器的端口不能重复);

  • 网络环境无隔离,容器可直接访问宿主机的所有网络资源。

使用方式

通过--network host参数指定host模式:

# 启动容器,使用host模式,容器内80端口直接对应宿主机80端口
docker run -it --name test-host-container --network host nginx

none模式

原理

none模式下,Docker会为容器创建独立的网络命名空间,但不会为容器配置任何网络资源(无网卡、无IP地址、无路由表),容器处于完全隔离的网络环境中,无法与外部(包括宿主机、其他容器)进行通信。

特点

  • 网络隔离性最强,容器无法与任何外部网络通信;

  • 无网络资源开销,适用于无需网络通信的场景(如离线数据处理);

  • 可手动为容器配置网卡、IP等网络资源,实现自定义网络隔离。

使用方式

通过--network none参数指定none模式:

# 启动容器,使用none模式,容器无网络连接
docker run -it --name test-none-container --network none nginx

Docker自定义网络

# 基本创建(默认自动分配网段)
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