Docker容器网络隔离由守护进程自动完成,基于Linux net namespace,默认bridge模式为每个容器创建独立网络命名空间,含独立设备、IP、路由、端口空间;支持host、container、none等网络模式共享或禁用netns。

在 Docker 中,进程的网络命名空间隔离不是手动通过 Namespace 实现的,而是由 Docker 守护进程在创建容器时自动完成的。Docker 底层确实依赖 Linux 的 net namespace(网络命名空间),但用户通常不直接操作它——而是通过标准 Docker 命令和配置间接启用和控制。
网络命名空间是 Docker 网络隔离的基础
Docker 容器默认使用 bridge 网络模式,每个容器启动时都会获得一个独立的网络命名空间,包含:
- 独立的网络设备(如
lo、eth0) - 独立的 IP 地址、路由表、iptables 规则
- 独立的端口空间(不同容器可同时监听 8080 端口而互不冲突)
这个隔离由内核的 CLONE_NEWNET 标志触发,在 clone() 或 unshare() 系统调用中启用。Docker 在调用 runc(容器运行时)时自动设置该标志,无需用户干预。
验证容器是否拥有独立 netns
可在宿主机上检查容器进程的网络命名空间绑定:
- 查出容器主进程 PID:
docker inspect -f '{{.State.Pid}}' <container_name></container_name> - 查看其 netns 文件:
ls -l /proc/<pid>/ns/net</pid>,输出类似net:[4026532519] - 对比两个容器的 netns 编号:若不同,说明网络完全隔离
- 也可用
ip netns list(需手动挂载)或nsenter -t <pid> -n ip addr</pid>进入该 netns 查看内部网络配置
手动模拟 netns 隔离(仅用于理解原理)
虽然不推荐在生产中绕过 Docker 直接操作,但可通过以下步骤体会底层机制:
- 创建新 netns:
unshare --net --fork --pid /bin/bash - 此时 shell 进程已处于独立 netns,
ip link只能看到 lo - 添加虚拟网卡并配 IP(需 root 权限):
ip link add veth0 type veth peer name veth1,再将 veth1 加入宿主机网桥 - 执行
exec ip netns exec <ns_name> bash</ns_name>可进入该 netns 操作
这正是 Docker 启动容器时自动化完成的一系列动作的简化版。
影响网络命名空间行为的关键选项
Docker 提供了多种网络模式来控制 netns 的复用或共享:
-
--network=bridge(默认):为容器分配全新 netns -
--network=host:不创建新 netns,直接复用宿主机网络栈 -
--network=container:<name_or_id></name_or_id>:与指定容器共享同一 netns(即共用 IP、端口、路由等) -
--network=none:创建 netns,但不配置任何网络设备(仅含 lo)
这些选项最终都映射为 runc 配置中的 linux.namespaces 字段,决定是否启用 net 类型 namespace 及其挂载方式。
不需要手动调用 unshare 或编写 C 程序就能实现网络隔离——正确使用 Docker 的网络参数,就等于在安全、可控的前提下调用了内核的 netns 机制。

















