改完 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。先看这个容器有没有在跑定时任务,重启一次可能中断十几分钟的业务。能滚动更新的就滚动更新,别图快。