关键是要确保容器内有长期存活的前台进程,否则即使加-d也会立即退出;正确做法是使用自带服务进程的镜像(如nginx),或手动指定sleep infinity等长时命令,并避免--rm、-it与-d混用。

让 Docker 容器常驻后台运行,关键不是单纯加 -d,而是确保容器内有长期存活的前台进程。否则即使加了 -d,容器启动后立刻退出,状态变成 Exited。
用 docker run -d 启动并保持后台运行
绝大多数场景下,直接使用 docker run -d 即可。但必须满足两个前提:
- 镜像本身定义了能长期运行的
CMD或ENTRYPOINT(比如 Nginx、Redis、PostgreSQL 等服务类镜像) - 不额外覆盖成短命命令(例如避免写成
docker run -d nginx bash或docker run -d ubuntu echo hello)
正确示例:
docker run -d --name my-nginx -p 80:80 nginx
错误示例(容器秒退):
docker run -d --name bad-test ubuntu sleep 1
没有默认前台进程时,手动指定长时命令
如果基础镜像没自带服务进程(如 ubuntu、alpine),需显式提供不退出的命令:
-
sleep infinity(推荐,轻量且语义清晰) -
tail -f /dev/null(兼容性好,几乎所有 Linux 镜像都支持) -
sh -c "while :; do sleep 10; done"(自定义循环)
示例:
docker run -d --name dev-box ubuntu:22.04 tail -f /dev/null
之后可用 docker exec -it dev-box sh 进入交互操作。
避免常见配置陷阱
这些细节容易导致“加了 -d 却不运行”:
-
删掉
--rm:该参数会让容器退出后自动删除,无法反复查看或重启 -
别混用
-it和-d:虽然docker run -itd语法合法,但-i和-t对后台容器无实际作用,纯属冗余 -
确认主进程没被信号终止:某些程序收到
SIGTERM会直接退出,需检查其是否支持优雅关闭,或用--init加 init 进程接管子进程
补充:让已退出容器恢复常驻
如果容器已处于 Exited 状态,不能靠 docker start 恢复为常驻——它只会按原配置再跑一次,大概率又退出。正确做法是:
- 先
docker rm删除旧容器 - 再用带
-d和合适命令的新docker run重建 - 或者改用
docker commit保存当前状态,再基于新镜像运行(不推荐,违背不可变基础设施原则)
真正需要长期托管多个服务时,建议直接上 docker-compose.yml,在 command: 或 entrypoint: 中明确声明前台行为。


















