一文看懂docker网络映射机制
目录
Docker 的网络映射主要通过 Linux 网络命名空间、虚拟网桥、iptables/NAT 规则 以及 用户态代理(如 docker-proxy) 实现。
一. 网络命名空间隔离
每个 docker 容器启动时,会创建一个独立的 网络命名空间(Network Namespace),隔离其网络栈(包括 IP 地址、端口、路由表等)。容器默认通过虚拟网桥与宿主机或其他容器通信。
1. PID Namespace(进程隔离)
-
作用:隔离进程 ID,容器内进程的 PID 独立于宿主机。
-
示例:容器内的 PID 1 进程(如
nginx)在宿主机可能对应 PID 1000。 -
效果:容器内无法看到宿主机或其他容器的进程
2. Network Namespace(网络隔离)
-
作用:为容器提供独立的网络栈(IP、端口、路由表等)。
-
示例:容器可绑定到 80 端口,而其他容器或宿主机同样可使用 80 端口,互不冲突。
-
实现:通过虚拟网卡(如
veth pair)和桥接(如docker0)连接容器与外部网络。
3. Mount Namespace(文件系统隔离)
-
作用:隔离文件系统挂载点,容器拥有独立的根目录(
/)。 -
示例:容器使用镜像的分层文件系统,修改仅作用于容器层,不影响镜像或宿主机。
-
技术:联合文件系统(如 OverlayFS)支持分层挂载。
4. UTS Namespace(主机名隔离)
-
作用:允许容器自定义主机名(
hostname)和域名(domainname)。 -
示例:容器内
hostname可设为my-container,与宿主机无关。
5. IPC Namespace(进程间通信隔离)
-
作用:隔离共享内存、信号量等进程间通信(IPC)资源。
-
示例:两个容器无法通过共享内存交换数据,除非显式配置。
6. User Namespace(用户权限隔离)
-
作用:映射容器内外的用户 UID/GID,提升安全性。
-
示例:容器内
root(UID 0)可能映射到宿主机非特权用户(如 UID 1000)。 -
优势:即使容器进程以 root 运行,权限仍受宿主机限制。
二. 虚拟网桥(docker0)
默认情况下,Docker 会创建一个名为 docker0 的 虚拟网桥,所有容器通过 veth pair(虚拟以太网设备对)连接到该网桥:
-
容器侧:
veth的一端在容器的网络命名空间中,命名为eth0,分配私有 IP(如172.17.0.2)。 -
宿主机侧:
veth的另一端连接到docker0网桥,宿主机通过该网桥与容器通信。
1、 宿主机

2、容器测
容器内部的网络互通
docker inspect nacos

进入容器内部可以看到eth0

三. 设置端口映射(-p 参数)
当使用 docker run -p <宿主机端口>:<容器端口> <镜像名> 时,Docker 会将宿主机的端口映射到容器的端口,实现外部访问。
docker run -p 8080:80 nginx
核心机制
1、 iptables NAT 规则
Docker 通过修改宿主机的 iptables 规则实现 NAT(网络地址转换):
-
DNAT(目标地址转换):将访问宿主机 IP 和端口的流量转发到容器的 IP 和端口。
-
MASQUERADE(源地址转换):容器发出的流量会被伪装成宿主机的 IP。
示例规则:
# 查看 NAT 表规则
iptables -t nat -L -n
# 输出示例:
Chain DOCKER (2 references)
RETURN all -- 0.0.0.0/0 0.0.0.0/0
MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt:8848
DNAT tcp -- anywhere anywhere tcp dpt:8848 to:172.17.0.2:8848
2、用户态代理(docker-proxy)不常用
在某些场景下(如 IPv6 或特定内核版本),Docker 会启动一个用户态代理 docker-proxy,监听宿主机的端口并将流量转发到容器。
# 查看 docker-proxy 进程
ps aux | grep docker-proxy
四. 流量转发流程
以外部访问 宿主机IP:8080 → 容器 80 端口为例:
-
外部请求到达宿主机
8080端口。 -
iptables 的
PREROUTING链匹配到 DNAT 规则,将目标地址改为容器的 IP 和端口(如172.17.0.2:80)。 -
流量通过
docker0网桥转发到容器的veth(此处为eth0)设备。 -
容器处理请求后,返回流量通过
MASQUERADE规则将源 IP 改为宿主机 IP。
五. 网络模式与映射差异
Docker 支持多种网络模式,不同模式下端口映射行为不同:
-
bridge(默认):需显式映射端口(
-p)。 -
host:容器直接使用宿主机网络,无需端口映射。
-
overlay:用于跨主机的 Swarm 服务,通过 VXLAN 隧道通信。
更多推荐
所有评论(0)