如何让 Docker 容器在系统启动时自动启动?

How do I make a Docker container start automatically on system boot?

假设我有一个 Docker 容器,我想 运行,那么我可以调用

$ docker run ...

一切都很好。如果系统崩溃并重新启动,是否有一种内置的方式 运行 容器将自动重新启动?

如果是这样,Docker Compose 中是否也提供此功能?

是的,docker 有 restart policies such as docker run --restart=always that will handle this. This is also available in the compose.yml config file 作为 restart: always

如果你想让容器在没有用户登录的情况下启动(比如我只启动不想每次都登录的VirtualBox VM)。以下是我为 Ubuntu 16.04 LTS 执行的步骤。例如,我安装了一个 oracle 数据库容器:

$ 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/

来自文档的更多 "gentle" 模式:

docker run -dit --restart unless-stopped <image_name>

default restart policyno

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

docker update --restart=always 0576df221c0b

0576df221c0b是容器id。

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

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

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

这就是 crontab 的用途:

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

通过 crontab -e 访问您的用户 crontab 或使用 crontab -l 显示它或在 /etc/crontab

编辑您的系统 crontab

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

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

根据 documentation,有多个重启选项:

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.

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

$ sudo systemctl enable docker

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

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

确保

If you manually stop a container, its restart policy is ignored until the Docker daemon restarts or the container is manually restarted.

在 Docker 官方页面上查看此 restart policy

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

$ docker-compose up -d

你可以运行一个总是重启的容器:

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

如果您想更改 运行ning 容器的配置,您应该 更新 它:

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

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

docker inspect gateway | grep RestartPolicy -A 3

毕竟,不要忘记安装 docker 守护进程 在系统启动时启用 通过:

$ systemctl enable docker

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

我有一个类似的问题 运行ning Linux 系统。系统启动后,重启策略为“unless-stopped”的容器不会自动重启,除非我键入以某种方式使用 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 ps”没有其他 Docker 命令的系统上 运行,我得到以下信息:

● 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 命令。在容器所需的所有服务都已初始化之后,您大概可以 运行 "docker ps" 在 systemd 单元文件中。我通过将名为 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=多user.target

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

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

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)

更多信息见Dockerhomepage

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

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