
线上服务器跑 Docker 时,偶尔会遇到需要重启 Daemon(守护进程)的情况。这篇把操作方法和几个坑说清楚。
在基于 systemd 的 Linux 服务器上,重启 Docker Engine 服务的命令是:
sudo systemctl restart docker
重启完成后验证一下是否正常:
sudo systemctl status docker
docker info
这里要先搞清楚一个概念:重启 Docker Daemon 和重启容器是两码事。Daemon 是主机上的 dockerd 进程,负责管理容器、镜像、网络和存储卷。容器是跑在 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
根据你服务器实际用的服务管理器选择就行,没必要两个都跑一遍。
| 命令 | 作用范围 |
|---|---|
| sudo systemctl restart docker | 重启主机上的 Docker Engine 守护进程 |
| docker restart web | 只重启名为 web 的单个容器 |
| docker compose restart | 重启当前 Compose 项目中的所有服务 |
如果只是某个业务容器卡住了,动 Daemon 就属于杀鸡用牛刀,直接 docker restart CONTAINER 更合适。只有 Docker 服务本身出问题,或者需要让 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 可能无法恢复与容器的连接。生产环境操作前务必确认影响范围。
很多 Docker Engine 的配置项都写在 /etc/docker/daemon.json 里,有些改动必须重启 Daemon 才能生效。比如官方文档明确要求修改代理配置后要重启 Docker:
sudo systemctl restart docker
重启后验证服务和容器状态:
sudo systemctl status docker
docker info
docker ps
systemctl daemon-reload 是用来重新加载 systemd 单元配置文件的,它本身不会重启 Docker。如果你修改了 Docker 的 systemd 单元文件或 drop-in 配置,需要先执行这个:
sudo systemctl daemon-reload
sudo systemctl restart docker
注意,单独修改 daemon.json 不涉及 systemd 单元文件,不需要跑 daemon-reload。
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 服务日志:
sudo systemctl --no-pager --full status docker
sudo journalctl -u docker.service -n 100 --no-pager
排查时实时跟踪日志:
sudo journalctl -u docker.service -f
常见原因包括:配置文件格式有误、配置项互相冲突、配置里引用的文件不存在、存储驱动问题,或者改了 systemd 单元文件但没有 reload。
如果问题是在编辑 /etc/docker/daemon.json 之后出现的,可以用 jq 验证 JSON 格式:
sudo jq empty /etc/docker/daemon.json
没有任何输出说明 JSON 解析正常。但这只能验证格式,不能保证每个配置项的值都合法,最终还是要看服务日志。
先检查服务是否真的在跑:
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。