Docker容器后台运行必须有前台进程,否则会立即退出;-d参数仅实现分离模式,真正维持运行依赖PID=1进程持续存在,如redis、nginx最新镜像默认前台启动,而bash等短命命令会导致容器秒退。
直接用 docker run -d 就能创建后台运行的容器,但光加 -d 不够——容器得有前台进程撑着,否则秒退。
必须让主进程在前台持续运行
Docker 把容器里 PID=1 的进程当作“命脉”,它一停,容器立刻退出。比如 redis、nginx 最新镜像默认就以前台模式启动(redis-server 本身不 daemonize,nginx -g "daemon off;"),所以 docker run -d redis 或 docker run -d nginx 能稳住。但如果你强行指定 bash 或 sleep 10 这类短命命令,容器启动即退出。
基础创建命令示例
docker run -d --name my-redis -p 6379:6379 redis:7-alpine
这行命令做了四件事:
-d:后台运行--name my-redis:起个名字,方便后续操作-p 6379:6379:把宿主机 6379 端口映射到容器redis:7-alpine:用指定镜像启动关键配套项建议一起加上
--restart=always:宿主机重启或容器崩溃后自动拉起-v /data/redis:/data:挂载数据目录,避免重启丢数据--memory=256m --cpus=0.5:限制资源,防止单个容器吃垮整机--log-opt max-size=10m --log-opt max-file=3:控制日志体积,不占满磁盘启动后马上验证
docker ps 看容器是否显示 Up 状态docker logs my-redis 检查有没有报错(比如端口被占、配置加载失败)docker exec -it my-redis redis-cli ping 测试服务是否真在响应别依赖 Ctrl+P Ctrl+Q 或 docker attach 来“救活”一个本该后台跑却退出的容器——根本问题在启动命令没设对,得从镜像行为或 CMD 入手调整。