start your docker containers automatically
我用 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'
- 那个竖杠
|
就是大名鼎鼎的 pipe,相当于把前面所有的输出(output)带给下面作为输入(input),这里就是前面从 3-27 号后的日志,扔给了grep
grep
是用来抓取相关日志的,后面那个-e
flag 用来标注 regular expression,这里表示只要前面的日志行有文字apt upgrade
,就显示出来。
docker restart policy
我发现我的博客是挂了,但是另一个记账的服务并没有挂,用 docker ps
看了下发现居然有两个服务在跑,一个是我的记账服务,一个是我以前关掉过的没用的一个服务,这时候就在想为什么,如果机器没有重启,只是因为 docker daemon 重启的话,怎么才能保证服务自动重启?经过查找我发现了关键词是 restart policy。
这个 policy 在运行docker run
或者docker compose up
的 docker-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'
docker inspect
后面接 image id(image id 可以通过docker ps
获得相应的服务 id),可以直接看到当前 container 的所有设置,这个设置出来是 json 的格式,你当然可以通过less
来即时浏览,但如果你想要更精确——- 你就需要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
}