系统重启时 docker 容器没有自启动问题排查

发布时间: 2024-02-08 15:40:15 作者: 大象笔记

线上服务器环境,基于 docker 部署了一堆服务,虽然在 docker-compose.yml 中将各个服务配置了

restart: always

但是,实际测试发现,系统重启后,所有后期配置的 restart: always 的服务,都没有自启动。

只有一开始就设置了 restart: always 的服务,才自启动成功。

Google 搜索了一下,发现确实存在这个问题,对于这种容器,需要后期手动通过 docker 命令来更新配置,只修改 docker-compose.yml 是不够的。

检查指定容器当前配置的方法

docker inspect <your-container> | fgrep -i restart -A 5

your-container 部分可以使用 CONTAINER ID 或者 NAME。

可以通过

docker container ls

查看。例如:

$ docker inspect f9df5e40eea8 | fgrep -i restart -A 5
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 2332778,
            "ExitCode": 0,
            "Error": "",
--
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "docker-default",
--
            "RestartPolicy": {
                "Name": "",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",

可以看到,这里的 RestartPolicy Name 为空字符串,即,代表默认值 no,不会自启动。

而自启动正常的 mysql 容器对应的配置则是:

 "RestartPolicy": {
                "Name": "always",
                "MaximumRetryCount": 0
},

redis 容器对应的配置则是

"RestartPolicy": {
                "Name": "on-failure",
                "MaximumRetryCount": 0
},

对于后续重新 build 的容器,也是正常的。

启用

docker update <your-container> --restart always

禁用

docker update <your-container> --restart no

always 与 on-failure 的区别

参考

我是一名山东烟台的开发者,联系作者