应下载官方二进制文件安装docker-compose,避免pip安装导致依赖错误;配置文件必须命名为docker-compose.yml或docker-compose.yaml且位于当前目录;网络需正确配置ports映射,修改配置后需down再up或使用--force-recreate确保生效。

直接装 docker-compose 命令行工具就行,别碰 pip install docker-compose
Linux 上最稳妥的方式是下载官方二进制文件,不是用 pip 装。pip 安装的版本常缺 docker-compose 依赖(比如 docker-py 版本不匹配),运行时会报 ImportError: cannot import name 'DockerClient' 或直接命令不存在。官方二进制是静态链接、开箱即用的。
- 执行:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.7/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose - 加执行权限:
sudo chmod +x /usr/local/bin/docker-compose - 验证:
docker-compose --version(输出应为Docker Compose version v2.24.7) - 注意路径必须是
/usr/local/bin/,不能放/usr/bin/(某些发行版里该目录受 snap 或包管理器保护)
docker-compose.yml 文件位置和命名不能错
docker-compose 默认只认当前目录下的 docker-compose.yml(或 docker-compose.yaml)。名字写成 compose.yml、docker-compose.yaml.bak 或放在子目录里,都会提示 ERROR: No such file or directory: docker-compose.yml。
- 必须用小写
yml或yaml后缀,大小写敏感(YML不行) - 如果文件不在当前目录,得用
-f指定:docker-compose -f ./prod/docker-compose.yml up -d - 多个文件叠加?用多次
-f:docker-compose -f base.yml -f override.yml up
容器启动后连不上?检查 network_mode 和端口映射
常见现象:服务明明 up -d 成功了,但 curl localhost:8080 没响应,或者容器间 ping 不通。大概率是网络配置没对上。
- 默认使用
bridge网络,容器间可通过服务名通信(如redis),但宿主机访问必须靠ports:显式暴露 - 别乱设
network_mode: host—— 它会让容器共享宿主机网络栈,ports:失效,且不同 compose 文件之间端口容易冲突 - 端口映射格式必须是
"8080:80"(宿主:容器),写成8080:80/tcp也行,但8080单数字会被当成容器端口,宿主端口随机分配 - 若用
docker network inspect查不到对应网络,说明up没成功或被--remove-orphans清掉了旧网络
改了 docker-compose.yml 为什么 up 不生效?
docker-compose 默认复用已有容器,只重启变化的部分。你改了环境变量、卷挂载或镜像标签,但没触发重建,旧容器还在跑老配置。
- 强制重建所有容器:
docker-compose up --build --force-recreate - 更干净的做法:
docker-compose down && docker-compose up -d(注意down会删掉容器、网络,但默认保留卷) - 想保留数据卷但清掉配置残留?加
--volumes参数要谨慎:docker-compose down --volumes会删掉所有关联卷,包括数据库数据 - 镜像更新了但本地没拉新版本?先
docker-compose pull,再up
真正卡住的地方往往不是语法,而是 compose 自动复用机制、卷生命周期、以及宿主与容器网络边界的模糊地带。改完配置多敲一遍 docker-compose config,它会把最终解析出的结构打印出来,比猜靠谱得多。










