我用 docker 部署了几个自己的小服务在我自己的 VPS 上,最近更新 apt 的时候让 docker daemon 重启了,所以一个部署的博客也被 502 了。我才反应过来这个更新会让 docker 服务重启~ 为了验证是不是 apt update 导致的重启,并且修改/查看博客部署的重启策略(restart policy),我开始了一系列骚操作。

如何看相应的系统记录(logs)

主打命令 journalctl,如果你记得自己的更新时间,就可以用 --since--until 这两个 flag 来限制日志的生成时间。比如我记得是昨天大致上午 10 点半左右更新的,就查看了下 10:40 到 11 点的日志:

sudo journalctl --since '2025-03-27 10:40' --until '2025-03-27 11:00'

这里面就发现了我在运行了 sudo apt upgrade 后,docker 就开始自己重启。所以确认了更新与重启的相关性。

ps,如果不太记得大致时间,可以直接用动作的关键词找,比如找最近两天内的所有关于 apt upgrade 的日志:

sudo journalctl --since '2025-03-27' | grep -e 'apt upgrade'
  1. 那个竖杠|就是大名鼎鼎的 pipe,相当于把前面所有的输出(output)带给下面作为输入(input),这里就是前面从 3-27 号后的日志,扔给了grep
  2. grep 是用来抓取相关日志的,后面那个 -e flag 用来标注 regular expression,这里表示只要前面的日志行有文字apt upgrade,就显示出来。

docker restart policy

我发现我的博客是挂了,但是另一个记账的服务并没有挂,用 docker ps 看了下发现居然有两个服务在跑,一个是我的记账服务,一个是我以前关掉过的没用的一个服务,这时候就在想为什么,如果机器没有重启,只是因为 docker daemon 重启的话,怎么才能保证服务自动重启?经过查找我发现了关键词是 restart policy

这个 policy 在运行docker run或者docker compose updocker-compose.yaml时都可以设置,比如下面这段 run,就包含了设置 retart policy

docker run -d \
  --name service-name \
  --restart always \
  -p 8080:8080 \
  image-name:latest

同样在docker-compose.yaml的文件中,你也可以设置:

services:
  sonic-blog:
    image: "gosonic/sonic:latest"
    ports:
      - 8181:8080
    restart:
      unless-stopped

通过这种设置,你的 docker 相关服务,就可以在 daemon 重启后自动恢复(保证我的网站服务永远在线。

如果你不知道当时自己设置了什么政策,下面来教你如何查看当前的服务有着什么 restart policy。

sudo docker inspect 4b15327cd0de | jq '.[0] | .HostConfig | .RestartPolicy'
  1. docker inspect 后面接 image id(image id 可以通过 docker ps 获得相应的服务 id),可以直接看到当前 container 的所有设置,这个设置出来是 json 的格式,你当然可以通过less 来即时浏览,但如果你想要更精确——
  2. 你就需要jq这个小工具了,它是一个命令行 json parser 小工具,可以通过简单的语法得到你想要的 json 值。比如这里,因为出来的 json 文件是一个 array,所以 .[0]可以得到第一个 json object,然后通过 pipe,给到后面,.HostConfig就是直接得到当前 json object里面HostConfig的值,同样的方法,再得到里面RestartPolicy的值。
➜  sudo docker inspect 4b15327cd0de | jq '.[0] | .HostConfig | .RestartPolicy'
{
  "Name": "unless-stopped",
  "MaximumRetryCount": 0
}