目录

一. 网络命名空间隔离

1. PID Namespace(进程隔离)

2. Network Namespace(网络隔离)

3. Mount Namespace(文件系统隔离)

4. UTS Namespace(主机名隔离)

5. IPC Namespace(进程间通信隔离)

6. User Namespace(用户权限隔离)

二. 虚拟网桥(docker0)

1、 宿主机

2、容器测

三. 设置端口映射(-p 参数)

核心机制

1、 iptables NAT 规则

 2、用户态代理(docker-proxy)不常用

四. 流量转发流程

五. 网络模式与映射差异


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 端口为例:

  1. 外部请求到达宿主机 8080 端口。

  2. iptables 的 PREROUTING 链匹配到 DNAT 规则,将目标地址改为容器的 IP 和端口(如 172.17.0.2:80)。

  3. 流量通过 docker0 网桥转发到容器的 veth(此处为eth0) 设备。

  4. 容器处理请求后,返回流量通过 MASQUERADE 规则将源 IP 改为宿主机 IP。

五. 网络模式与映射差异

Docker 支持多种网络模式,不同模式下端口映射行为不同:

  • bridge(默认):需显式映射端口(-p)。

  • host:容器直接使用宿主机网络,无需端口映射。

  • overlay:用于跨主机的 Swarm 服务,通过 VXLAN 隧道通信。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐