Docker 网络详解
Docker 网络全景:bridge/host/none/overlay/macvlan 五大驱动、容器发现(内置 DNS)、端口发布、Compose 网络、网络安全与排障命令。一篇建立完整心智模型。
直接回答:Docker 网络的核心模型——容器接入虚拟网络(默认 bridge),用户自定义 bridge 内可按容器名互访(默认 bridge 不提供此自动 DNS),对外经端口发布(-p)暴露。单机用 bridge、跨主机用 overlay(Swarm)、要宿主机网络性能用 host、禁用外部网络接口可用 none。排障三板斧:docker network inspect、docker exec ... ping、端口映射检查。
网络驱动速查
| 驱动 | 用途 |
|---|---|
| bridge | 默认单机网络,容器间隔离通信 |
| host | 直接用宿主机网络栈(不隔离网络命名空间,性能需按负载验证) |
| none | 仅保留 loopback,不等于文件、进程或内核安全隔离 |
| overlay | Swarm 跨主机通信 |
| macvlan | 容器直接拿物理网络 IP(遗留系统整合) |
常用命令
docker network create appnet
docker run -d --name web --network appnet nginx
# 先安全设置 POSTGRES_PASSWORD,本例仅用于本地学习
docker run -d --name db --network appnet -e POSTGRES_PASSWORD postgres:16
# 可用 docker exec web getent hosts db 检查 DNS;镜像未必安装 ping
docker network inspect appnet
docker network connect appnet another-container # 运行中追加网络
端口发布
docker run -p 8080:80 nginx # 宿主 8080 → 容器 80
docker run -p 127.0.0.1:8080:80 nginx # 只绑本地回环(安全姿势)
注意:未指定宿主 IP 时,-p 默认发布到所有接口。Docker 转发规则可能绕过 UFW 入站限制;本地开发绑定 127.0.0.1,生产结合安全组和实际防火墙后端配置。DOCKER-USER 适用于 iptables 后端,不能照搬到原生 nftables 后端。Engine 28.0.0 以前存在同二层网络可访问回环发布端口的问题,应更新并验证外部可达性。
Compose 网络与安全
Compose 项目自动建独立网络,服务名即主机名。安全原则:数据库服务只进内部网络、不发布端口到宿主机;前端网络与后端网络分离,按需 connect。
排障
容器互访不通按序查:同网络否 → DNS 解析否(getent hosts db)→ 服务监听地址是否 0.0.0.0 → 端口映射对不对。
常见问题(FAQ)
Q:容器重启后 IP 变了怎么办?
A:不要用 IP 通信——同一自定义网络内用容器名/服务名,DNS 自动跟随。固定 IP 是反模式。
Q:host 网络模式有什么坑?
A:端口冲突(容器与宿主机抢端口)、无网络隔离(容器可见宿主机全部接口)。性能敏感且可信的场景才用。
Q:跨主机的容器怎么通?
A:Swarm overlay 网络是官方方案;第三方 CNI(Calico/Flannel)是 K8s 生态答案;裸 Docker 跨机需 overlay 或 macvlan。
官方参考
本文依据官方文档整理,示例未在本文中进行运行验证。生产部署需按所用版本、权限和实际负载验证。