容器基础(03):Docker 容器网络——bridge/host/none、端口映射、CNM 模型
更新时间:2026-09-01。本文是
cloud/docker/Docker 基础第 03 篇,接 Docker 镜像存储。Docker 网络把容器和宿主机、容器和容器连接起来。理解 bridge、host、none 三种默认网络,就能解决大部分网络问题。
本文要回答的问题
- Docker 三种默认网络(bridge/host/none)有什么区别?什么时候用?
- 端口映射
-p 80:80背后做了什么? - CNM(Container Network Model)是什么?
- 容器间怎么互联?
一、三种默认网络
bash
# 查看所有网络
docker network ls
# 三种默认网络:
# 1. bridge ← 默认网络,容器独立命名空间,NAT
# 2. host ← 共享宿主机网络命名空间
# 3. none ← 无网络,只有 lo1. bridge 网络(默认)
text
默认 bridge 网络:
┌─────────────────────────────────────────────┐
│ 宿主机 │
│ ┌─────────┐ docker0 (172.17.0.1/16) │
│ │ 容器 1 │ eth0 → 172.17.0.2 │
│ │ 容器 2 │ eth0 → 172.17.0.3 │
│ └─────────┘ │
└─────────────────────────────────────────────┘
# NAT 转换:容器访问外网,源地址换成宿主机 IP
# 端口映射:外网访问容器,把宿主机端口转发到容器端口特点:
- 容器独立网络命名空间
- 通过 NAT 和宿主机通信
- 默认容器之间可以通过 IP 互通
- 端口映射暴露端口给外网
适用场景: 大多数场景,单个宿主机多个容器
2. host 网络
bash
# --net=host
docker run --net=host nginx
# 特点:容器和宿主机共享网络命名空间
# 容器直接用宿主机的网络接口
# 不需要 NAT,性能接近原生网络
# 不需要端口映射,直接绑定宿主机端口特点:
- 共享网络命名空间,没有额外 NAT 开销
- 端口直接绑定到宿主机,不能多个容器绑定同一个端口
- 容器可以直接修改宿主机网络配置,有安全风险
适用场景: 高性能场景(负载均衡器、网关),端口不冲突
3. none 网络
bash
# --net=none
docker run --net=none busybox
# 只有 lo 接口,没有外部网络
# 需要自定义网络配置适用场景: 不需要网络的容器,或者自定义网络
二、端口映射 -p
bash
# 格式:host_port:container_port
docker run -p 80:80 nginx
# 绑定特定地址:127.0.0.1:80:80
docker run -p 127.0.0.1:80:80 nginx
# 随机端口:宿主机随机端口 → 容器 80
docker run -p 80 nginx
docker port my-nginx # 查看端口映射
# 多个端口映射
docker run -p 80:80 -p 443:443 nginx端口映射原理:
- Docker 在 iptables 添加 DNAT 规则
- 外网访问宿主机 80 端口 → DNAT 转发到容器 80 端口
- 回复包经过 SNAT → 源地址换成宿主机 IP
检查 iptables:
bash
# 查看 NAT 规则
iptables -t nat -n -L DOCKER三、容器互联
bash
# 自定义桥接网络,容器可以通过名字互通
# 1. 创建自定义网络
docker network create my-net
# 2. 容器加入网络
docker run -d --name web --network my-net nginx
docker run -d --name app --network my-net my-app
# 3. app 容器可以通过容器名 "web" ping 通 web 容器
# Docker 内嵌 DNS 服务器解析容器名到 IP
ping web → 解析到 web 的 IP要点:
- 默认 bridge 网络不支持 DNS 解析容器名
- 自定义 bridge 网络支持 DNS 解析,容器可以通过名字互通
- 推荐服务发现用自定义网络
四、CNM(Container Network Model)
text
Docker 网络模型:CNM = Container Network Model
三个核心对象:
1. Sandbox:容器网络命名空间,包含容器接口、路由、DNS
一个容器一个 Sandbox
2. Endpoint:沙箱和网络之间的接口,连接容器到网络
一个容器可以有多个 Endpoint → 连接多个网络
3. Network:可以互联的一组 Endpoint
同一个网络内的 Endpoint 可以互通CNM 好处: 支持第三方网络插件(Calico、Flannel、Weave),插件实现 Network 接口即可。
五、常见问题排查
bash
# 1. 容器不能上网
docker exec my-container ping 8.8.8.8
# 2. 查看 iptables 规则
iptables -t nat -L -n
# 3. 重启 docker 网络服务
systemctl restart docker
# 4. 查看容器网络配置
docker inspect my-container | jq '.[].NetworkSettings'六、常见坑对照
| 坑 | 现象 | 对策 |
|---|---|---|
| host 网络端口冲突 | 多个容器不能绑定同一个端口 | 每个容器不同端口,或者用 bridge |
| iptables 规则丢包 | 容器不能访问外网 | 检查 FORWARD 链,打开 forwarding |
| 容器之间不能互通 | 不同网络 → 不通 | 容器都加入同一个自定义网络 |
| DNS 不解析容器名 | 默认 bridge 不支持 | 用自定义网络 |
相关与延伸
Docker 基础 3 篇完成。下一篇:Kubernetes 核心概念——Pod/Node/Controller/API Server/etcd/kubelet;Docker 镜像存储,见 Docker 镜像存储。
一句话总结
Docker 容器网络:三种默认网络:bridge(默认,隔离,NAT,端口映射)、host(共享网络命名空间,高性能)、none(无网络,自定义);端口映射 -p 80:80 通过 iptables DNAT 转发;自定义网络支持 DNS 解析容器名,容器之间可以通过名字互通;CNM 模型:Sandbox(命名空间)+ Endpoint(接口)+ Network(互通组),支持第三方网络插件;大多数场景用 bridge 网络,高性能网关用 host 网络。