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

如何使Docker容器在系统引导时自动启动?,docker,docker-compose,Docker,Docker Compose,假设我有一个想运行的Docker容器,那么我可以调用 $ docker run ... 一切都很好。如果系统崩溃并重新启动,是否有一种内置的方法可以自动重新启动容器 如果是这样的话,Docker Compose中是否也有此功能?是的,Docker有诸如Docker run--restart=always之类的功能来处理此问题。如果您希望在没有用户执行登录的情况下启动容器,也可以在asrestart:always中使用此功能(例如,我只启动VirtualBox VM,不希望每次都登录)。以下是我

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

$ docker run ...
一切都很好。如果系统崩溃并重新启动,是否有一种内置的方法可以自动重新启动容器


如果是这样的话,Docker Compose中是否也有此功能?

是的,Docker有诸如
Docker run--restart=always
之类的功能来处理此问题。如果您希望在没有用户执行登录的情况下启动容器,也可以在as
restart:always

中使用此功能(例如,我只启动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
有关更多信息,请参见文档中的“柔和”模式:

docker run -dit --restart unless-stopped <image_name>
docker run-dit--除非停止,否则重新启动

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

docker update --restart=always 0576df221c0b

0576df221c0b
是容器id。

我想在Windows上启动容器

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


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

这就是crontab的用途:

@reboot sleep 10 ; docker start <container name> 2>&1 | /usr/bin/logger -t 'docker start'
@重启睡眠10;docker start 2>&1 |/usr/bin/logger-t“docker start”

通过
crontab-e
访问您的用户crontab,或使用
crontab-l
显示它,或在
/etc/crontab
处编辑您的系统crontab,您可以使用
docker update--restart=on failure

顾名思义,
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.
1) 首先,您必须在引导时启用docker服务

$ sudo systemctl enable docker
2) 然后,如果您有docker compose.yml文件add
restart:always
,或者如果您有docker container addrestart=always,如下所示:

docker-run--restart=始终
并运行docker-container

确定

如果手动停止容器,则在Docker守护程序重新启动或容器手动重新启动之前,其重新启动策略将被忽略

见Docker官方页面

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

$ docker-compose up -d

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

$ docker run -dit --restart unless-stopped <image name OR image hash>
毕竟,不要忘记通过以下方式在系统启动时启用已安装的docker daemon

$ systemctl enable docker

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

我在运行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.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 ps”在没有其他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.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依赖项是否会自动启动它)。

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

docker run -d --restart unless-stopped ecstatic_ritchie
其中,
摇头丸_ritchie
是指定感兴趣的容器的示例名称。使用
docker ps-a
列出所有容器名称

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

docker update --restart unless-stopped ecstatic_ritchie
docker update --restart unless-stopped $(docker ps -q)
使所有正在运行的容器在系统重新启动时自动启动

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

有关Docker的更多信息,请参见本章中对2021年答案的详细描述。默认情况下,docker已安装但未启用。如果您使用的是最新的Ubuntu(例如20),并且您通过
apt
安装了docker,那么您所要做的就是
sudo systemctl enable——现在是docker


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

这是第一个被接受的答案,但可能大多数搜索该功能的人确实希望将其容器作为服务运行。这是最好的解决方案之一,需要更多的投票。这对我来说不起作用。我有一个名为“crmpicco-mysql”的容器,我运行了
docker-run--restart=always crmpicco-mysql
,得到了错误:
无法在本地找到图像“crmpicco-mysql:latest”。您的错误与此无关。您可能想发布一个单独的问题,但看起来您混淆了docker图像名称和docker容器名称。
docker run
命令需要图像的名称,您可以通过