更新后容器未重新启动,并且始终在 docker-compose.yml 中重新启动

Containers not restarted after update with restart always in docker-compose.yml

我有一些容器,它们在 docker-compose 文件中都具有始终重启值,如下所示:

version: "3.7"
services:

  container:
    image: ghost:latest
    container_name: some_container
    restart: always
    depends_on:
       - ...
    ports:
       - ...
...

一旦 OS(Flatcar Linux / CoreOS)更新了自身 none 容器就会重新启动。但是,如果我只执行 $ sudo docker ps,所有容器都会立即启动。这是怎么回事,我该如何修复它以便我的容器在更新后自动重启?

编辑:

不确定我的问题有什么不清楚的地方,restart: always已开启。除非我在文档中遗漏了一些重要的东西,否则即使 docker 守护程序重新启动(在 os 重新启动之后),此命令也应该重新启动容器。

从下面复制我的评论之一:

Ok, so help me out here. As you can see in my question, I have restart: always turned on. All these containers are started successfully and are running well. Then the OS updates itself automatically and restarts itself. After this restart the docker daemon is restarted. But for some reasons the containers I had running WITH RESTART: ALWAYS turned on DOES NOT START. If I enter my server at this moment, type sudo docker ps to list my running containers, suddenly all containers are booted up and I see the list. So why wasn't the containers started, even though the daemon is running?

这是容器重启策略。 restart: always 如果容器停止,则重新启动容器。如果是手动停止,只有当Docker daemon 重启或者容器本身是手动的时候才会重启restarted.Please check this link restart_policy.

always 如果容器停止,请始终重新启动容器。如果手动停止,只有在Docker守护进程重启时才会重启,或者手动重启容器本身。

unless-stopped 类似于always,只是当容器停止(手动或其他方式)时,即使Docker 守护程序重新启动它也不会重新启动。

如果您已经有一个 运行 容器想要更改其重启策略,您可以使用 docker update command 来更改它,下面的命令将确保所有当前 运行 除非停止,否则容器将重新启动

$ docker update --restart unless-stopped $(docker ps -q)

注意:使用重启策略时请牢记以下几点

  1. 重启策略只有在容器启动成功后才会生效。在这种情况下,启动成功意味着容器已启动至少 10 秒并且 Docker 已开始对其进行监控。这可以防止根本不启动的容器进入重启循环。

  2. 如果您手动停止一个容器,它的重启策略将被忽略,直到 Docker 守护进程重新启动,或者容器被手动重启。这是防止重启循环的另一种尝试。

  3. 重启策略仅适用于容器。 swarm 服务的重启策略配置不同

Documentation

从评论看来,docker 服务未配置为开机自动启动。 Docker 是一个客户端服务器应用程序,来自 systemd 的服务器 运行s 为客户端用来与服务器通信的 docker 套接字提供单独的服务。因此,使用 docker 命令的任何调用都可能通过点击 docker 套接字来启动服务器。

systemd 中的服务状态可以通过以下方式检查:

systemctl status docker

或者您可能想查看:

systemctl is-enabled docker

可以手动启动:

systemctl start docker

并且可以启用以开始:

systemctl enable docker

以上所有命令都需要运行 root。

这需要 Docker 服务在启动时启动,而不是像您描述的执行“docker ps”那样使用按需启动的默认套接字激活。 =11=]

这是在禁用套接字激活的同时启用Docker服务所需的容器Linux配置:

systemd:
  units:
    # Ensure docker starts automatically instead of being socket-activated
    - name: docker.socket
      enabled: false
    - name: docker.service
      enabled: true

如果之前创建了 docker 容器,它的 [重启策略][1] 可能不会通过在 docker compose YAML 文件中更改它来自动更新。 如果在 YAML 文件中更改 Restart Policy

# cat docker-compose.yml 
version: "3"
services:
  <your-service>:
    restart: always

可以看到RestartPolicy有旧值的容器详情:

# docker inspect <your-container> | fgrep -i restart -A 5
        
    "RestartCount": 0,
--
            "RestartPolicy": {
                "Name": "",

Name 是重启策略名称!并且没有值,这意味着没有设置重启策略并使用默认值 [no][1]。
因此,您可能不仅需要更新文件中的 Restart Policy,还需要手动更新预创建的容器:

# docker update <your-container> --restart always

因此更改了新值:

# docker inspect <your-container> | fgrep -i restart -A 5
        "RestartCount": 0,
--
            "RestartPolicy": {
                "Name": "always",
                "MaximumRetryCount": 0
            },

就是这个:(
[1]: https://docs.docker.com/config/containers/start-containers-automatically/