改完 daemon.json 想让它生效,敲了 docker restart,结果配置一点没变。restart 重启的是容器,守护进程本身没动,白折腾一场。

三种重启分清楚

重启容器用 docker restart 加容器名。容器里的进程会收到停止信号再被拉起来,挂载的目录还在,临时写在容器层里的东西会丢。

重启 Docker 服务,Linux 上是 systemctl restart docker,老一点的发行版用 service docker restart。这一步才会重新读 daemon.json、重挂目录、重建默认网络。Windows 和 macOS 装的是 Docker Desktop,最稳的是托盘图标右键选重启,或者在设置里点一下,手改配置文件容易被它覆盖。

用 compose 起的项目,在项目目录里执行 docker compose restart,只重启服务,不动网络和卷。

改完配置为什么没生效

最常见是文件放错位置。Linux 上应该在 etc 下的 docker 目录里,改完先执行 docker info 看一眼,镜像仓库地址、存储驱动这些信息对不上,说明根本没读到文件。

还有一种情况:容器设了自动重启策略,服务重启后它自己又起来了,看着像没重启过。用 docker ps 看启动时间,比猜靠谱。

重启后要确认的三件事

  • 原有容器是否都回来了,开机自启的有没有漏
  • 自定义网络和端口映射还在不在
  • 挂载目录的权限有没有变,日志里有没有报错

日志用 docker logs 加参数看最近两百行,比一次性刷屏好找问题。

容器起不来,先看状态。docker ps 默认只列运行中的,加 -a 才能看到已经退出的,状态栏里 Exit 后面那个数字是退出码,含义各不相同,对照文档查比乱试快。

生产机器上别随手 restart。先看这个容器有没有在跑定时任务,重启一次可能中断十几分钟的业务。能滚动更新的就滚动更新,别图快。