Docker 网络入门:bridge / host / none 三种模式怎么选
Docker 网络入门:bridge / host / none 三种模式怎么选
容器能跑起来,不代表网络就通了。很多人第一次遇到「容器内服务访问不了」「端口映射不上」的问题,根源都在网络模式没选对。这篇文章把 Docker 的三种基础网络模式讲清楚,并给出实际选择建议。
一、为什么容器要单独考虑网络
容器默认是隔离的:有自己的网卡、IP、路由表和 iptables 规则。这种隔离带来安全性,也带来「外部怎么访问进来」「容器之间怎么通信」两个问题。Docker 的网络模式,本质上就是在决定这两点。
二、三种基础网络模式
1. bridge(默认)
最常用。Docker 创建一个虚拟网桥 docker0,每个容器接入一个独立的 veth 网卡,分配 172.17.0.x 网段的 IP。
特点: - 容器之间可以互相访问(同桥接网络内)。 - 外部不能直接访问容器端口,需要 -p 宿主机端口:容器端口 做端口映射。 - 映射本质是 iptables 的 DNAT 规则,不是真正的「端口转发进程」。
典型用法:docker run -p 8080:80 nginx
2. host
容器直接使用宿主机的网络栈,没有自己的网卡,也没有端口映射的概念。
特点: - 性能最好(少了一层 NAT)。 - 端口直接占用宿主机,适合需要低延迟、或依赖宿主机特定端口的服务。 - 代价是隔离性最差,容器能看到宿主机全部端口。
典型用法:docker run --network host redis
3. none
容器只有 lo 回环接口,完全断网。
特点: - 适合纯计算任务、批处理、或对安全要求极高、只靠共享卷传数据的场景。 - 调试时很不方便,需要手动 docker exec 进去配置。
典型用法:docker run --network none <image>
三、实际怎么选
| 场景 | 推荐模式 | 理由 |
|---|---|---|
| Web 服务、需要对外暴露 | bridge + -p |
隔离好,端口可控 |
| 内部微服务互调 | bridge(自定义网络) | 用容器名做 DNS,避免 IP 硬编码 |
| 高性能、低延迟服务 | host | 省掉 NAT 开销 |
| 离线计算、安全隔离 | none | 网络完全不可达 |
一个容易被忽略的点:自定义 bridge 网络比默认 bridge 更值得用。默认网络下容器只能用 IP 互相访问,而 docker network create app 创建的网络支持按容器名解析,扩容时不用改配置。
四、常用排查命令
docker network ls:看有哪些网络。docker network inspect bridge:看网段、接入的容器。docker inspect <容器>:看容器实际用的网络模式和 IP。- 容器内:
ip addr、ip route、cat /etc/resolv.conf。
常见现象:容器能 Ping 通网关但 Ping 不通外网,多半是宿主机防火墙(ufw/firewalld)拦了 docker0 的流量,加规则放行即可。
五、实用技巧与注意事项
- 需要容器间通信时,务必把它们放在同一个自定义网络上,别依赖默认网络。
- 端口映射不要用
80:80这种宿主机特权端口的写法去抢系统已占用的端口,会直接启动失败。 - 生产环境慎用 host 模式:一旦容器被入侵,等于宿主机网络被接管。
- 改网络模式要重建容器(
docker rm后重新run),docker network connect只能事后挂接。 - 排查「连不上」时,先看
docker inspect确认模式,再看安全组和防火墙,最后才怀疑应用本身。
选对网络模式,容器相关的连接问题能少一大半。建议在写 docker-compose 之前就把每个服务需要暴露的端口和网络想清楚,比事后救火省力得多。
- 点赞
- 收藏
- 关注作者
评论(0)