docker网络核心是网络命名空间隔离与虚拟设备协同,通过veth pair、网桥、iptables和netns实现容器互通、上网及被访问。

linux Docker 的网络机制核心在于 网络命名空间隔离 和 虚拟网络设备协同。它不依赖外部网络硬件,而是通过内核级虚拟化(如 veth pair、网桥、iptables、netns)构建出灵活、可复用的容器网络环境。理解这一点,就能看懂为什么容器能互通、能上网、也能被访问。
bridge 模式:默认隔离通信的基础
这是 Docker 启动容器时自动使用的模式,底层依赖 docker0 虚拟网桥:
- 每个容器启动时,Docker 创建一对 veth pair:一端接入容器(命名为
eth0),另一端挂到docker0上(如vethabc123) -
docker0自带 IP(如172.17.0.1/16),作为所有 bridge 容器的默认网关 - 容器间可直接用
172.17.x.x地址互 ping;但外部无法直连容器 IP,必须靠-p端口映射 +iptables DNAT转发 - 宿主机可通过
docker0访问容器,容器也可通过docker0访问宿主机和外网(经 SNAT)
host 模式:零开销但需谨慎使用
容器直接复用宿主机的网络栈,不创建独立 netns:
- 容器内
ip a显示的是宿主机所有网卡(ens33、lo等),没有eth0或veth - 无需端口映射,容器监听
0.0.0.0:80就等同于宿主机暴露 80 端口 - 性能最高,适合对延迟敏感或需绑定特权端口(如
22、80)的服务 - 缺点明显:端口冲突风险高、网络无隔离、容器可调用主机网络接口(如重启网卡),建议仅用于监控代理、日志采集等可信工具容器
自定义 bridge 网络:推荐生产使用的升级方案
比默认 bridge 更安全、更可控,支持内建 dns 和子网划分:
- 创建命令示例:
docker network create --subnet 10.10.0.0/24 --gateway 10.10.0.1 mynet - 同一自定义网络中的容器,可直接用 容器名 互相访问(Docker 内置 DNS 自动解析)
- 不同自定义网络默认隔离,避免服务误连;如需互通,可用
docker network connect手动添加第二张网卡 - 支持静态 IP 分配:
docker run --network mynet --ip 10.10.0.10 nginx
容器间通信与外部访问的关键逻辑
搞清“谁访问谁”是配置成败的前提:
- 容器访问外网:靠宿主机 SNAT(由 Docker 自动配置 iptables)
- 宿主机访问容器:走
docker0网桥(如ping 172.17.0.2)或映射端口(如curl localhost:8080) - 外部机器访问容器:只能通过宿主机 IP + 映射端口(如
http://192.168.1.100:8080),前提是宿主机防火墙放行该端口 - 容器访问宿主机服务:在 Linux 上用
host.docker.internal(Docker 20.10+ 默认启用)或宿主机真实 IP(非127.0.0.1)
基本上就这些。不复杂但容易忽略——比如以为容器 IP 能被局域网直接访问,其实它只是 docker0 内部地址;又比如用了 host 模式却忘了检查端口占用。理清命名空间、veth、网桥、NAT 这四层关系,Docker 网络配置就稳了一大半。