最直接有效的取消容器开机自启方式是执行 docker update --restart=no 容器名或id,该命令将容器重启策略设为 no 并持久生效,批量操作可使用 docker update --restart=no $(docker ps -aq)。

docker update --restart=no 是最直接有效的取消方式
容器是否开机自启,只取决于它的 RestartPolicy.Name 字段值,不是靠“是否运行中”或“是否被 stop 过”来判断。只要策略是 always 或 unless-stopped,Docker daemon 启动后就会拉起它。所以取消自启的本质就是把重启策略改回 no。
对已有容器执行:
-
docker update --restart=no <container_name_or_id></container_name_or_id>—— 立即生效,无需重启 Docker 服务 - 支持批量操作:
docker update --restart=no $(docker ps -aq)(作用于所有容器)或docker update --restart=no container1 container2 - 该命令修改的是容器的 HostConfig,会持久写入容器元数据,系统重启后依然有效
为什么 docker stop 不等于取消开机自启
很多人误以为“停掉容器就等于关了自启”,这是常见误区。执行 docker stop 只是终止当前运行状态,--restart=always 策略仍存在。下次 Docker daemon 启动(比如系统 reboot 后),它会立刻尝试重启这个容器——哪怕你刚手动 stop 过它。
验证方式很直接:
- 查当前策略:
docker inspect --format='{{.HostConfig.RestartPolicy.Name}}' <container></container>,返回always就说明还没取消 - 看重启计数:
docker ps --format '{{.Names}} {{.RestartCount}}',非零值说明 Docker 已按策略自动重启过它
docker-compose 中 restart: "no" 要显式声明
如果你用 docker-compose.yml 管理容器,默认不写 restart 字段时,底层实际等价于 restart: "no"。但一旦你之前设过 restart: "always",就必须显式改回去,否则 docker-compose up -d 会沿用旧配置。
正确写法示例:
services:
nginx:
image: nginx
restart: "no"
注意:"no" 必须加引号,否则 YAML 解析可能出错;更新后需重新部署:docker-compose up -d --force-recreate,否则旧容器不会被重置策略。
容易忽略的坑:docker.socket 激活导致“关不干净”
在某些 systemd 配置下(尤其是较新发行版),即使你 systemctl disable docker.service,Docker 仍可能被 docker.socket 激活——只要有人调用 docker ps 或其他 CLI 命令,socket 就会拉起 daemon,进而触发所有 always 容器启动。
若目标是彻底阻止容器自启,必须连带处理:
systemctl disable docker.socketsystemctl stop docker.socket- 再确认
systemctl list-unit-files | grep docker输出中两项都为disabled
否则,你以为关掉了,其实只是“等一个命令就复活”。











