Docker 容器网络入门:从桥接到自定义网络
前言
容器跑起来了,但应用之间、容器与外部如何通信?这就是容器网络要解决的问题。Docker 提供了多种网络模式,理解它们的区别能帮你避免"容器内能 ping 通,宿主机访问不了"的坑。
Docker 默认网络
安装 Docker 后会自动创建三个网络:
docker network ls
NETWORK ID NAME DRIVER SCOPE
bridge bridge bridge local
host host host local
none none null local
bridge(桥接网络):默认模式。容器连接到虚拟网桥 docker0,通过 NAT 与外部通信。容器之间可通过 IP 通信,默认无法通过容器名互访。
host(主机模式):容器直接使用宿主机网络,不隔离。性能最好,但端口冲突风险高。
none(无网络):容器没有网络接口,完全隔离。适合处理敏感数据。
桥接网络详解
宿主机: docker0 (172.17.0.1/16)
│
┌──────┼──────┐
│ │ │
容器A: 容器B: 容器C:
172.17.0.2 172.17.0.3 172.17.0.4
容器访问外部:容器 → docker0 → iptables NAT → 宿主机 IP → 外部
外部访问容器:需 -p 宿主机端口:容器端口 做端口映射
# 运行容器并映射端口
docker run -d -p 8080:80 nginx
# 查看端口映射
docker port nginx
# 80/tcp -> 0.0.0.0:8080
用户自定义网络
bridge 网络无法通过容器名互访,自定义网络可以:
# 创建自定义桥接网络
docker network create app-net
# 运行容器并加入网络
docker run -d --name db --network app-net postgres
docker run -d --name api --network app-net my-api
# api 容器内可直接用 db 名连接数据库
# psql -h db -U postgres
自定义网络底层是 DNS 服务,Docker 内嵌 DNS 解析器负责将容器名映射到 IP。
网络模式对比
| 模式 | 隔离性 | 性能 | 端口冲突 | 适用场景 |
|---|---|---|---|---|
| bridge | 中 | 中 | 无 | 通用场景 |
| host | 无 | 最高 | 有 | 高性能、低延迟 |
| none | 完全 | - | - | 无网络需求 |
| overlay | 跨主机 | 中 | 无 | 集群/分布式 |
容器间通信
同用户网络:直接用容器名互访,DNS 自动解析。
不同网络:容器可加入多个网络:
# 将已有容器加入新网络
docker network connect app-net nginx
# 断开网络
docker network disconnect app-net nginx
跨容器通信(不建网络):用 --link(已废弃,不推荐)。
实战:前后端分离
# 创建前后端网络
docker network create web-net
# 启动后端 API
docker run -d --name api --network web-net -p 3000:3000 my-api
# 启动前端 Nginx
docker run -d --name web --network web-net -p 80:80 nginx
# web 容器内可访问 http://api:3000
前端通过容器名 api 访问后端,无需写死 IP。
常见问题
1. 容器内无法访问宿主机服务
容器通过 bridge 网络访问宿主机,默认用宿主机 IP(172.17.0.1 是 docker0 网关)。如果宿主机服务绑定在 127.0.0.1,容器无法访问——改绑 0.0.0.0 即可。
2. 外部无法访问容器服务
检查端口映射 -p 宿主机端口:容器端口,确认防火墙未拦截。
3. 容器间无法用名称互访
未使用自定义网络。bridge 网络默认无 DNS,需用 IP 或创建自定义网络。
4. 端口冲突
host 模式下容器直接用宿主机端口,同一端口只能被一个容器占用。
小结
- bridge 是默认网络,通过 NAT 与外部通信
- 自定义网络支持容器名 DNS 解析,推荐用于多容器应用
- host 模式性能最好但无隔离,适合单容器高性能场景
- 容器可加入多个网络,实现灵活的通信拓扑
- 宿主机服务绑
0.0.0.0才能被容器访问
容器网络是微服务架构的基础,理解这些模式就够应对 90% 的日常场景了。
- 点赞
- 收藏
- 关注作者
评论(0)