Docker容器网络互通配置:从零开始完整教程
为什么你需要手动配置容器网络互通
默认情况下,Docker 会为每个容器分配独立的网络空间,容器之间互相隔离。
但很多场景——比如让 Web 容器访问数据库容器——就需要打通它们的网络。
Docker 提供了多种网络模式,对新手最友好、最可控的方式是使用 自定义 bridge 网络。
本文围绕 Docker 容器网络互通配置,带你一步步操作,并附上常见报错和避坑提示。
准备工作:确认 Docker 环境
在开始之前,确保你已经安装了 Docker,并且能正常执行 docker 命令。
如果你是用宝塔面板集成的 Docker,同样适用。
打开终端(或宝塔终端),输入以下命令查看版本:
docker --version
如果显示版本号(例如 Docker version 24.0.6)说明环境就绪。
另外,建议先查看一下当前的网络列表,了解默认状态:
docker network ls
你会看到至少三个默认网络:bridge、host、none。
我们的目标是在 bridge 之外创建一个新网络,让容器加入它。
第一步:创建自定义网络
使用 docker network create 命令创建一个名称为 my-net 的 bridge 网络(名字可以换成你喜欢的):
docker network create my-net
创建成功后,再用 docker network ls 就能看到新增了 my-net。
这个网络默认使用 bridge 驱动,它提供独立的 IP 网段和 DNS 解析能力。
扩展说明:如果你需要指定网段或限制 IP 范围,可以加 --subnet 参数,比如 --subnet=172.20.0.0/16,新手通常用默认值就够了。
第二步:启动容器并连接到该网络
运行两个容器来演示互通。
先启动一个 Nginx 容器(作为 Web)并加入 my-net:
docker run -d --name web --net my-net nginx:alpine
再启动一个 Alpine 容器(作为客户端)也加入同一网络:
docker run -it --name client --net my-net alpine sh
alpine 的 shell 会直接打开。
此时 client 和 web 都在 my-net 中。
第三步:在容器内测试网络连通性
在 client 容器的 shell 中,先更新包管理器并安装 curl:
apk update && apk add curl
然后尝试通过容器名访问 web 的默认页面:
curl http://web
如果返回一段 HTML 页面,说明容器间已经成功互通!自定义 bridge 网络会自动用容器名作为 DNS 主机名,所以直接用容器名就能解析到对应 IP。
这是最方便的验证方式。
你也可以用 IP 来测试,先获取 web 的 IP:
docker inspect web | grep IPAddress
在 client 里 ping 那个 IP 或者 curl http:// 同样能通。
避坑指南:新手最容易踩的四个坑
1. 容器不在同一网络
默认两个容器都连接到默认 bridge 网络时,只能通过 IP 互通,不能通过容器名。新手经常发现 ping 容器名 不通。解决方式就是统一使用自定义网络。
2. 容器重启后 IP 可能变化
自定义网络下,容器重启有可能重分配 IP。建议始终用容器名通信,而不是硬编码 IP。
3. 注意端口冲突
网络互通只解决容器间通信,不影响宿主机端口映射。如果两个容器都需要宿主机的 80 端口,需要做端口转发映射到不同宿主机端口。
4. 连接已有容器到新网络
如果容器已经运行在默认 bridge 上,可以动态将它连接到新网络:
docker network connect my-net 容器名
这样容器就同时加入两个网络了(多网卡)。
断开用 docker network disconnect。
效果验证与清理
完成测试后,输入 exit 退出 client 容器(会停止),然后可以删除容器和网络以保持环境整洁:
docker rm -f web client
docker network rm my-net
如果你在操作中遇到 network not found 或 container cannot be connected 等错误,
先检查网络是否存在(docker network ls)和容器是否处于运行状态。
总结
Docker 容器网络互通配置并不复杂,核心就是创建自定义 bridge 网络,并将需要通信的容器加入该网络。
记住两点:自定义网络支持容器名 DNS 解析,比默认 bridge 更方便;
容器间通信优先使用容器名而不是 IP。
按照本文的步骤,十分钟就能搞定。
如果你正在处理类似需求,建议先按流程完整跑一遍,再根据实际环境微调网络参数。
遇到异常时优先检查网络列表和容器连接状态,大部分问题都能快速定位。