遇到 Docker Compose 启动报 network not found,通常是容器依赖的自定义网络丢失或未创建,最直接的恢复方式是清理残留资源后重新构建网络。
先说结论:该错误多因网络资源缺失或配置不一致导致,优先通过重建网络或强制 recreate 容器解决。
- 先确认:使用 docker network ls 检查目标网络是否存在
- 先处理:执行 docker-compose down 清理残留后重新 up(注意数据卷备份)
- 再验证:通过 docker ps 确认容器启动且网络连通
命令速用版
如果希望快速尝试恢复,可按顺序执行以下命令:
# 1. 查看当前网络列表
docker network ls
# 2. 清理并重新创建容器和网络
# 注意:down 命令会移除匿名卷,如有重要数据请确保已挂载持久化卷
docker-compose down
docker-compose up -d
# 3. 如果仍报错,尝试强制重建
docker-compose up `--force-recreate` -dcompose.yml 网络配置检查
排查前请核对 docker-compose.yml 文件,确保 networks 定义正确。以下是常见配置示例:
version: '3'
services:
web:
image: nginx
networks:
- mynet
networks:
mynet:
driver: bridge
# 如果是外部网络,需取消下面注释并确保网络已存在
# external: true
# name: existing-network-name若配置了 external: true,Compose 不会自动创建网络,必须手动创建或确保网络已存在。
分步处理与风险预警
1. 检查网络是否存在
运行 docker network ls 查看输出中是否包含 compose 文件里定义的网络名称。如果缺失,说明网络未被创建或已丢失。
2. 清理并重建(推荐)
很多时候网络资源处于“僵尸”状态。执行 docker-compose down 会移除容器和网络。
注意:该命令会删除未挂载持久化卷的匿名卷数据。如有数据库等重要数据,请确保已配置 volumes 挂载到宿主机,或先备份数据。
随后再次运行 docker-compose up -d 会让 Compose 重新创建所需的网络资源。
3. 强制重建容器
如果网络存在但容器仍报错,可能是容器缓存了旧的网络 ID。使用 docker-compose up `--force-recreate` 可以忽略现有容器配置,重新创建并连接网络。
4. 手动创建外部网络
若 compose 文件引用了外部网络(external: true),需手动创建:
docker network create 网络名称5. 重启 Docker 服务(慎用)
作为最后手段,重启守护进程可能修复元数据读取问题:
sudo systemctl restart docker警告:此操作会中断宿主机上所有正在运行的 Docker 容器,生产环境请在维护窗口执行。
怎么验证是否生效
执行 docker ps 确认容器状态为 Up。接着使用 docker inspect <容器 ID> 查看 NetworkSettings 部分,确认 IPAddress 和 NetworkID 已正确分配且不为空。
也可在容器内 ping 同网络下的其他服务名称,验证 DNS 解析与连通性。
常见坑
1. 特定系统重启丢失网络
部分用户反馈在华为 OpenEuler 22.03LTS 等系统中,宿主机重启可能导致 Docker 自定义网络丢失,这可能是系统层面的数据清理策略导致。建议重要环境配置网络持久化或使用外部网络。
2. 网络名称拼写
Compose 文件中定义的网络名称与命令行创建的名称必须完全一致,包括大小写。
3. 外部网络依赖
如果配置了 external 网络,确保该网络在运行 compose 前已存在,Compose 不会自动创建外部网络。
参考建议
遇到复杂网络问题,建议查阅 Docker 官方文档关于 Networking 的说明,或使用 docker-compose config 检查最终渲染的配置是否符合预期。