Docker-Compose近期无法暴露80端口,run命令端口映射失效求助
问题描述
我负责的一个小型本地开发项目使用如下docker-compose.yml配置文件:
version: '3.8' services: php: image: php:8.2.4-apache ports: - 80:80 volumes: - ./src:/var/www/html/ composer: image: composer:2.5.4 volumes: - ./src:/app
近期使用docker-compose run --rm php启动主容器时,80端口未成功映射,docker-compose ps显示无端口映射记录;通过docker ps查看也发现该容器未进行端口映射。而直接使用Docker命令运行相同配置时,一切正常。该配置此前已正常运行数月,且容器日志与正常启动的容器完全一致。请问是否是Docker-Compose的新特性导致端口映射失效?
解答
这不是Docker Compose的新特性问题,而是docker-compose run命令的默认行为——它本来就不会继承docker-compose.yml里定义的ports端口映射配置。
原因
docker-compose run是用来临时启动容器执行一次性任务的(比如调试、跑脚本),不是用来启动长期运行的服务。为了避免和已经用docker-compose up启动的同服务端口冲突,它默认会跳过端口映射、端口暴露这类配置。
解决办法
如果用docker-compose run时需要端口映射,有两种可选方案:
- 执行命令时加上
--service-ports参数,强制加载服务定义里的端口配置:docker-compose run --rm --service-ports php - 要是你本来就是要长期运行这个服务,建议直接用
docker-compose up启动:docker-compose up -d php
你说之前配置正常运行了数月,应该是之前用的是docker-compose up命令启动服务,而非docker-compose run。
内容的提问来源于stack exchange,提问作者Menachem Hornbacher
相关产品推荐
相关产品推荐

