Docker 网络详解:从默认桥接到自定义网络互通

举报
yd_248750836 发表于 2026/11/08 15:08:10 2026/11/08
【摘要】 容器网络是最容易让人困惑的部分。镜像、数据卷都能靠直觉理解,唯独网络,两个容器明明都在跑,互相就是 ping 不通,或者通了又突然断,问题往往出在没用对网络模式。把 Docker 的几种网络模式梳理清楚,绝大多数连通性问题都能自己定位。一、五种网络模式,先分清各自的用途bridge 是最常用的默认模式。容器启动后,Docker 会在宿主机上建一个虚拟网桥 docker0,给容器分配一个内网 ...

容器网络是最容易让人困惑的部分。镜像、数据卷都能靠直觉理解,唯独网络,两个容器明明都在跑,互相就是 ping 不通,或者通了又突然断,问题往往出在没用对网络模式。把 Docker 的几种网络模式梳理清楚,绝大多数连通性问题都能自己定位。

一、五种网络模式,先分清各自的用途

bridge 是最常用的默认模式。容器启动后,Docker 会在宿主机上建一个虚拟网桥 docker0,给容器分配一个内网 IP(一般是 172.17.0.0/16 段),再通过 NAT 让容器访问外网。它的特点是容器有独立 IP、可以对外暴露端口,但所有容器挤在同一个默认桥里,只能靠 IP 互访,没有名字解析。

host 模式让容器直接使用宿主机的网络栈,容器里的进程看到的网卡和端口就是宿主机的。好处是性能最高,没有 NAT 转换开销,适合对网络延迟敏感或需要处理大量连接的服务。代价是端口冲突——容器占用的端口就是宿主机端口,一个端口只能被一个容器用,隔离性也基本没了。

none 模式给容器一个完全封闭的网络环境,只有 lo 回环接口。适合不需要网络的批处理任务,或者要求自己手工配置网络的高级场景。

container 模式让新容器复用另一个已存在容器的网络命名空间,两者共享同一套 IP 和端口。典型用途是让网络调试工具、VPN 客户端与主业务容器共享网络,直接看到主容器的流量。

overlay 用于跨主机通信,让不同物理机上的容器像在同一个局域网里,单机用不到,Swarm 或 Kubernetes 集群里才会涉及。

二、自定义网络才是正解,别再往默认桥里塞容器

新手最常见的坑,是把所有容器都放在默认 bridge 里,然后用 docker inspect 查 IP,把 IP 写进配置文件。容器一重建,IP 变了,配置全废。

正确做法是给每个业务创建自定义 bridge 网络:

docker network create app-net  
docker run -d --name db --network app-net mysql  
docker run -d --name web --network app-net nginx

自定义网络有两个默认桥没有的关键能力。第一是自动 DNS 解析:同一个网络内的容器可以直接用容器名互相访问,web 容器里连 db 就是写 db 这个主机名,不用管 IP 是多少。第二是内嵌 DNS 服务端,容器重启换 IP 对使用者无感。这也是为什么 compose 里服务之间能直接用服务名互访——compose 会自动建一个自定义网络。

如果不想让两个业务网络互相看见,就分别建网络、分别接入,网络之间默认是隔离的。需要互通时,把容器同时接入多个网络即可,一个容器可以挂多块"网卡"。

三、端口映射与访问控制的细节

容器端口要对外提供服务,用 -p 映射:-p 8080:80 表示宿主 8080 转发到容器 80。这里有两个容易忽略的点。

一是绑定地址。默认 -p 8080:80 会监听 0.0.0.0,也就是所有网卡,公网上能直接访问。如果只想本机访问,要显式写 -p 127.0.0.1:8080:80。生产环境上把数据库端口映射到 0.0.0.0 是极其危险的配置,等于把数据库直接暴露在公网。

二是容器之间不需要端口映射。同一网络内的容器互访走的是容器内部端口,映射只是给"容器外部"用的。所以 web 连 db 用的是 db:3306,而不是 db:3307 这种宿主映射端口。这一点搞反了,会浪费大量时间排查。

四、排查网络问题的顺序

遇到连不通,按这个顺序查基本不会绕远路。

先看容器在不在同一个网络:docker network inspect 网络名,看 Containers 列表里有没有目标容器。不在同一网络,名字解析必然失败。

再看服务有没有监听对端口:docker exec 进容器,用 ss -lntp 看端口开着没、监听的是 0.0.0.0 还是 127.0.0.1。很多应用默认只监听 127.0.0.1,容器外自然连不上。

然后在容器内部 ping 或 curl 目标,区分是"网络不通"还是"应用不应答"。名字不通但 IP 通是 DNS 问题;IP 也不通是接入问题;通了但端口连不上,是服务或防火墙问题。

最后检查宿主机防火墙。iptables 或 firewalld 可能拦掉了 docker0 的转发,也可能是 Docker 写入的规则被其他规则覆盖。

五、安全上的一条底线

Docker 的网络隔离不是安全边界。同一个网络里的容器可以互相访问任意端口,能拿到容器 IP 就等于拿到了一个内网入口。所以不要用 host 模式跑不可信的镜像,不要把数据库和对外服务放进同一个网络,更不要为了"图方便"给容器 --network host 又给 --privileged。分层建网络、按职责隔离,比事后加固有效得多。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。