unless-stopped 在手动执行 docker stop 后不重启,因其会标记容器为“已手动停止”,宿主机或 docker daemon 重启时均不再自动拉起;该状态持久有效,无需额外配置。
要让 unless-stopped 策略在手动执行 docker stop 后真正“不重启”,关键不是改策略本身,而是理解它的行为逻辑并正确使用。
unless-stopped 的生效前提
这个策略的本意是:容器只要没被你主动 stop 过,系统重启或 Docker daemon 重启时就自动拉起;一旦你执行过 docker stop 容器名,Docker 就会标记该容器为“已手动停止”,之后无论宿主机重启还是 Docker 服务重启,它都不会自动启动——这正是你要的效果。
- 它依赖 Docker 内部状态记录,无需额外配置
- 只要没重建容器或用
docker update改过策略,手动停止后的“不重启”状态会一直保持 - 验证方式:运行
docker inspect 容器名 | grep -A 5 RestartPolicy,确认Name字段显示unless-stopped
避免意外触发重启的常见操作
有些操作看似“停止”,其实并不触发 unless-stopped 的保护机制,需特别注意:
-
docker kill不等于docker stop:kill 是强制终止,Docker 不视其为“用户明确停止”,下次 daemon 启动时仍可能重启 -
docker-compose stop✅ 有效:它等价于对每个容器执行docker stop,能正确标记“手动停止”状态 -
docker restart不影响策略:只是临时重启,原策略和停止状态不变 - 别用
docker update --restart always误覆盖:一旦改成 always,即使停过也会重启,需再切回 unless-stopped 并重新 stop 一次才恢复保护
已运行容器补设策略的方法
如果容器已经创建但没设自启,可以直接更新,不用删重建:
- 设为 unless-stopped:
docker update --restart unless-stopped myapp - 确认生效后,执行一次
docker stop myapp,此后它就进入“手动停止锁定”状态 - 如后续想恢复自动启动,只需
docker start myapp,无需改策略
Compose 中的等效写法
在 docker-compose.yml 里直接声明即可,行为与命令行完全一致:
version: '3.8'
services:
web:
image: nginx
restart: unless-stopped
ports:
- "80:80"
- 首次
docker-compose up -d后,容器随 daemon 启动而自启 - 执行
docker-compose stop web后,该容器不会再因系统重启而自动起来 - 再次
docker-compose start web才能手动唤醒











