178

Supposed I have a Docker container that I want to run, then I can call

$ docker run ...

and everything is fine. Is there a built-in way to run a container in a way that it will be restarted automatically, if the system crashes and reboots?

If so, is this also available in Docker Compose?

4

12 回答 12

208

是的,docker 有重启策略,比如docker run --restart=always可以处理这个问题。这也可以在compose.yml 配置文件中作为restart: always.

于 2015-05-26T05:45:54.177 回答
194

如果您希望即使没有用户执行登录也启动容器(例如我只启动并且不想每次登录的 VirtualBox VM)。以下是我为 Ubuntu 16.04 LTS 执行的步骤。例如,我安装了一个 oracle db 容器:

$ docker pull alexeiled/docker-oracle-xe-11g
$ docker run -d --name=MYPROJECT_oracle_db --shm-size=2g -p 1521:1521 -p 8080:8080 alexeiled/docker-oracle-xe-11g
$ vim /etc/systemd/system/docker-MYPROJECT-oracle_db.service

并添加以下内容:

[Unit]
Description=Redis container
Requires=docker.service
After=docker.service

[Service]
Restart=always
ExecStart=/usr/bin/docker start -a MYPROJECT_oracle_db
ExecStop=/usr/bin/docker stop -t 2 MYPROJECT_oracle_db

[Install]
WantedBy=default.target

并在启动时启用服务

sudo systemctl enable docker-MYPROJECT-oracle_db.service

有关更多信息https://docs.docker.com/engine/admin/host_integration/

于 2016-09-14T14:49:09.760 回答
154

默认重启no策略 是.

对于创建的容器docker update,用于更新重启策略。

docker update --restart=always 0576df221c0b

0576df221c0b是容器 ID。

于 2018-07-27T01:09:04.667 回答
30

您可以使用docker update --restart=on-failure <container ID or name>.

顾名思义,on-failure它不仅会在失败时重新启动容器,还会在系统启动时重新启动。

根据文档,有多个重启选项:

Flag            Description
no              Do not automatically restart the container. (the default)
on-failure      Restart the container if it exits due to an error, which manifests as a non-zero exit code.
always          Always restart the container if it stops. If it is manually stopped, it is restarted only when Docker daemon restarts or the container itself is manually restarted. (See the second bullet listed in restart policy details)
unless-stopped  Similar to always, except that when the container is stopped (manually or otherwise), it is not restarted even after Docker daemon restarts.
于 2019-11-21T08:36:30.527 回答
18

1)首先,您必须在启动时启用docker服务

$ sudo systemctl enable docker

2)然后如果你有 docker-compose .yml 文件添加restart: always或者如果你有 docker 容器添加重启=总是这样:

docker run --restart=always 并运行 docker 容器

确保

如果你手动停止一个容器,它的重启策略会被忽略,直到 Docker 守护进程重启或者容器被手动重启。

在 Docker 官方页面上看到这个重启策略

3)如果你想启动 docker-compose,所有的服务都会在你重启系统时运行所以你只运行一次下面的命令

$ docker-compose up -d
于 2020-06-09T15:10:34.457 回答
11

文档中更“温和”的模式:

docker run -dit --restart unless-stopped <image_name>
于 2018-07-13T12:01:54.880 回答
11

要启动容器并将其设置为在系统重新启动时自动重新启动,请使用

docker run -d --restart unless-stopped ecstatic_ritchie

ecstatic_ritchie指定感兴趣容器的示例名称在哪里。用于docker ps -a列出所有容器名称。

使特定运行的容器在系统重启时自动启动

docker update --restart unless-stopped ecstatic_ritchie

使所有正在运行的容器在系统重启时自动启动

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

在 Docker主页上查看更多信息

于 2021-01-06T10:13:01.290 回答
4

这就是 crontab 的用途:

@reboot sleep 10 ; docker start <container name> 2>&1 | /usr/bin/logger -t 'docker start'

通过以下方式访问您的用户 crontabcrontab -e或使用它显示crontab -l或编辑您的系统 crontab/etc/crontab

于 2019-08-17T00:01:12.297 回答
4

您可以通过以下方式运行始终重启的容器:

$ docker run -dit --restart unless-stopped <image name OR image hash>

如果您想更改正在运行的容器的配置,您应该通过以下方式更新它:

$ docker update --restart=<options> <container ID OR name>

如果您想查看容器的当前策略,请首先在上面运行以下命令:

docker inspect gateway | grep RestartPolicy -A 3

毕竟,不要忘记在系统启动时启用已安装的 docker daemon :

$ systemctl enable docker

要查看重启策略的完整列表,请参阅:重启策略

于 2020-07-11T09:45:34.733 回答
3

我想在 Windows 上实现开机容器启动。

因此,我刚刚创建了一个在系统启动时启动的计划任务。该任务只需启动“Docker for Windows.exe”(或任何 docker 可执行文件的名称)。

然后,所有重启策略为“always”的容器都会启动。

于 2019-08-06T09:45:40.687 回答
1

这篇博客文章很好地描述了 2021 年的答案。默认情况下,docker 已安装但未启用。如果您使用的是最新的 Ubuntu(例如 20)并且您通过 安装了 docker apt,那么您所要做的就是sudo systemctl enable --now docker.

这将在 systemd 中启用 docker 服务并在它尚未启动时立即启动它。docker 服务在安装时不会启动,但是任何使用 docker 套接字的 docker 命令(例如,docker ps)都会导致 systemd 启动该服务。启用该服务将导致它在每次启动时启动。

于 2021-04-14T12:39:12.290 回答
1

我在运行 Linux 系统时遇到了类似的问题。系统启动后,重启策略为“除非停止”的容器不会自动重启,除非我输入了以某种方式使用 docker 的命令,例如“docker ps”。我很惊讶,因为我预计该命令只会报告一些状态信息。接下来我尝试了命令“systemctl status docker”。在没有运行 docker 命令的系统上,此命令报告以下内容:

● docker.service - Docker Application Container Engine

   Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)

     Active: inactive (dead)    TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com

在没有其他 Docker 命令的情况下运行“docker ps”的系统上,我得到以下信息:

● docker.service - Docker Application Container Engine
    Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)

    Active: active (running) since Sun 2020-11-22 08:33:23 PST; 1h 25min ago

TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com

   Main PID: 3135 (dockerd)
      Tasks: 13

    Memory: 116.9M
     CGroup: /system.slice/docker.service
             └─3135 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
 ... [various messages not shown ]

最可能的解释是 Docker 在完全初始化和启动容器之前会等待一些 docker 命令。在初始化容器所需的所有服务之后,您可能可以在 systemd 单元文件中运行“docker ps”。我已经通过将名为 docker-onboot.service 的文件放在目录 /lib/systemd/system 中进行了测试,其中包含以下内容:

[Unit]
# This service is provided to force Docker containers
# that should automatically restart to restart when the system
# is booted. While the Docker daemon will start automatically,
# it will not be fully initialized until some Docker command
# is actually run.  This unit merely runs "docker ps": any
# Docker command will result in the Docker daemon completing
# its initialization, at which point all containers that can be
# automatically restarted after booting will be restarted.
#
Description=Docker-Container Startup on Boot
Requires=docker.socket
After=docker.socket network-online.target containerd.service

[Service]
Type=oneshot
ExecStart=/usr/bin/docker ps

[Install]

WantedBy=多用户.target

到目前为止(一项测试,启用此服务),容器在计算机启动时启动。我没有尝试对 docker.service 的依赖,因为 docker.service 在运行 docker 命令之前不会启动。下一个测试将禁用 docker-onboot(查看 WantedBy 依赖项是否会自动启动它)。

于 2020-11-22T19:19:23.190 回答