site logo

Marico's space

如何在 Linux 上安全地重启 Docker Daemon

前端技术 2026-09-28 20:55:52 4

线上服务器跑 Docker 时,偶尔会遇到需要重启 Daemon(守护进程)的情况。这篇把操作方法和几个坑说清楚。

在基于 systemd 的 Linux 服务器上,重启 Docker Engine 服务的命令是:

sudo systemctl restart docker

重启完成后验证一下是否正常:

sudo systemctl status docker
docker info

这里要先搞清楚一个概念:重启 Docker Daemon 和重启容器是两码事。Daemon 是主机上的 dockerd 进程,负责管理容器、镜像、网络和存储卷。容器是跑在 Daemon 之上的实例。

如何重启 Docker Daemon

主流的 Ubuntu、Debian 等现代 Linux 发行版都用 systemd(系统和服务管理器),直接用这个命令:

sudo systemctl restart docker

命令执行成功默认不输出任何内容。接下来检查服务状态,确认 Docker 客户端能正常连接 Daemon:

sudo systemctl is-active docker
sudo systemctl --no-pager --full status docker
docker info

如果是比较老的系统,或者用的是传统的 service 管理器,可能会遇到这种方式:

sudo service docker restart

根据你服务器实际用的服务管理器选择就行,没必要两个都跑一遍。

重启 Daemon 和重启容器的区别

命令 作用范围
sudo systemctl restart docker 重启主机上的 Docker Engine 守护进程
docker restart web 只重启名为 web 的单个容器
docker compose restart 重启当前 Compose 项目中的所有服务

如果只是某个业务容器卡住了,动 Daemon 就属于杀鸡用牛刀,直接 docker restart CONTAINER 更合适。只有 Docker 服务本身出问题,或者需要让 Daemon 级别的配置生效时,才需要重启 Daemon。

重启 Daemon 会停掉容器吗?

默认情况下会。Docker 官方文档明确说了:Daemon 终止时会关闭正在运行的容器。所以生产环境重启 Daemon 前,最好先评估一下对业务的影响。

Docker 提供了 live-restore(实时恢复)功能,可以让独立容器在 Daemon 不可用期间继续运行。在普通 rootful(以 root 权限运行的)安装方式下,编辑 /etc/docker/daemon.json 开启:

{ "live-restore": true
}

对于支持热加载的配置项,systemd 用户可以用 reload 而非 restart:

sudo systemctl reload docker

live-restore 也有一些限制。它只作用于独立容器,而且某些 Daemon 级别的配置变更后,Docker 可能无法恢复与容器的连接。生产环境操作前务必确认影响范围。

修改 daemon.json 后重启

很多 Docker Engine 的配置项都写在 /etc/docker/daemon.json 里,有些改动必须重启 Daemon 才能生效。比如官方文档明确要求修改代理配置后要重启 Docker:

sudo systemctl restart docker

重启后验证服务和容器状态:

sudo systemctl status docker
docker info
docker ps

什么时候需要运行 systemctl daemon-reload

systemctl daemon-reload 是用来重新加载 systemd 单元配置文件的,它本身不会重启 Docker。如果你修改了 Docker 的 systemd 单元文件或 drop-in 配置,需要先执行这个:

sudo systemctl daemon-reload
sudo systemctl restart docker

注意,单独修改 daemon.json 不涉及 systemd 单元文件,不需要跑 daemon-reload。

重启 Rootless Docker

Rootless Docker(无 root 权限运行的 Docker)使用用户级别的 systemd 服务,不需要 sudo:

systemctl --user restart docker

检查状态:

systemctl --user status docker
docker info

如果修改了 rootless 的 systemd 用户单元或 drop-in 配置:

systemctl --user daemon-reload
systemctl --user restart docker

Docker 重启后起不来怎么办

先看服务状态,然后查 Docker 服务日志:

sudo systemctl --no-pager --full status docker
sudo journalctl -u docker.service -n 100 --no-pager

排查时实时跟踪日志:

sudo journalctl -u docker.service -f

常见原因包括:配置文件格式有误、配置项互相冲突、配置里引用的文件不存在、存储驱动问题,或者改了 systemd 单元文件但没有 reload。

检查 daemon.json 语法

如果问题是在编辑 /etc/docker/daemon.json 之后出现的,可以用 jq 验证 JSON 格式:

sudo jq empty /etc/docker/daemon.json

没有任何输出说明 JSON 解析正常。但这只能验证格式,不能保证每个配置项的值都合法,最终还是要看服务日志。

Cannot connect to the Docker daemon 报错

先检查服务是否真的在跑:

sudo systemctl is-active docker
sudo systemctl status docker

如果服务是 failed 或 inactive 状态,先解决 Daemon 启动问题。如果服务正常运行,那问题可能出在 Docker context 或 socket 配置上。

快速命令参考

操作 命令
重启 Daemon sudo systemctl restart docker
查看服务状态 sudo systemctl status docker
通过 CLI 检查 Daemon docker info
查看最近日志 sudo journalctl -u docker.service -n 100
实时跟踪日志 sudo journalctl -u docker.service -f
重新加载 systemd 单元 sudo systemctl daemon-reload
热加载 Docker 配置 sudo systemctl reload docker
重启 Rootless Docker systemctl --user restart docker
重启单个容器 docker restart CONTAINER

总结

在基于 systemd 的 Linux 服务器上,sudo systemctl restart docker 是重启 Docker Daemon 的标准操作。完成后用 systemctl status docker 和 docker info 验证一下。记住,重启 Daemon 的影响范围比重启单个容器大得多。

生产环境操作前一定要先评估对运行中容器的影响。默认情况下 Daemon 终止会关闭所有容器;如果有需要保持运行的独立容器,提前开启 live-restore。