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

时间:2015-05-26 04:10:27

标签: docker docker-compose

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

$ docker run ...

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

如果是这样,这还可以在Docker Compose中使用吗?

12 个答案:

答案 0 :(得分:58)

如果您希望启动容器,即使没有用户执行登录(例如我只启动并且不想每次都登录的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/

答案 1 :(得分:46)

是的,docker有restart policies,例如docker run --restart=always即可处理此问题。这也可以在compose.yml config file restart: always中找到。

答案 2 :(得分:20)

default restart policyno

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

docker update --restart=always 0576df221c0b

0576df221c0b是容器ID。

答案 3 :(得分:10)

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

$ sudo systemctl enable docker

2)然后,如果您具有docker-compose .yml文件,请添加restart: always,或者如果您具有docker容器,请添加 restart = always ,如下所示:

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

确定

如果您手动停止容器,则其重启策略将被忽略,直到Docker守护进程重启或手动重启容器为止。

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

3)如果要启动docker-compose,则所有服务在重启系统时都会运行,因此只能在命令下运行一次

$ docker-compose up -d

答案 4 :(得分:3)

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

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

答案 5 :(得分:2)

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

$ 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

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

答案 6 :(得分:2)

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

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 Standalone Script

答案 7 :(得分:1)

我在运行Linux系统时遇到类似的问题。系统启动后,除非我输入以某种方式使用docker的命令(例如“ docker ps”),否则重启策略为“ unless-stopped”的容器将不会自动重启。我很惊讶,因为我期望该命令仅报告一些状态信息。接下来,我尝试了命令“ 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 = multi-user.target

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

答案 8 :(得分:0)

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

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

然后,所有重启策略为“始终”的容器将启动。

答案 9 :(得分:0)

您可以使用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.

答案 10 :(得分:-1)

这是crontab的用途:

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

通过crontab -e访问用户crontab或用crontab -l显示它,或在/etc/crontab编辑系统crontab

答案 11 :(得分:-1)

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

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