Docker 网络详解:从默认桥接到自定义网络互通
容器网络是最容易让人困惑的部分。镜像、数据卷都能靠直觉理解,唯独网络,两个容器明明都在跑,互相就是 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。分层建网络、按职责隔离,比事后加固有效得多。
- 点赞
- 收藏
- 关注作者
评论(0)