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

Gol*_*den 47 docker docker-compose

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

$ docker run ...
Run Code Online (Sandbox Code Playgroud)

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

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

kon*_*kon 73

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

并添加以下内容:

[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
Run Code Online (Sandbox Code Playgroud)

并在启动时启用该服务

sudo systemctl enable docker-MYPROJECT-oracle_db.service
Run Code Online (Sandbox Code Playgroud)

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

  • 对于那些希望使用docker-compose执行此操作的人,可以使用`docker-compose`命令替换上面的`docker`命令,使用`-f`标志指定docker-compose文件的位置:`/ usr/bin/docker-compose -f /path/to/docker-compose.yml up` (4认同)
  • 要添加 @charlesreid1 所说的内容,如果您的 `docker-compose.yml` 指定了 `.env` 文件,请使用 `--project-directory /path/to` **除了**明确指定您的 docker compose 文件之外。 (4认同)
  • @tres,当前文档建议_不要将_ Docker 重启策略与进程管理器混合。因此,您应该只使用其中之一,而不是同时使用两者。 (4认同)
  • 全面披露:文档实际上表明您不想这样做:“Docker 建议您使用重新启动策略,并避免使用进程管理器来启动容器。” https://docs.docker.com/config/containers/start-containers-automatically/ (3认同)
  • Docker 有自己的日志系统和进程管理器。不幸的是它没有正确的重启策略。 (2认同)

Pet*_*ons 61

是的,搬运工已重新启动的政策,如docker run --restart=always将处理这个问题.这也可以在compose.yml配置文件中找到restart: always.

  • 这是第一个被接受的答案,但是大多数搜索该功能的人可能都希望将其容器作为服务运行.[@kon使用`Systemd`作为服务管理器的答案](http://stackoverflow.com/a/39493500/3197383)是为此目的的最佳解决方案之一,需要更多的赞成. (12认同)
  • 唯一的问题是,"always"也会在容器因错误而停止时无限重启容器(参见文档).应该有一个只在daemon-start开始的策略 (7认同)
  • 我认为容器/docker 的主要卖点之一是我不需要在 systemd 中安装和管理我的每个服务(这可能很痛苦)。 (5认同)
  • 为了确保 docker(以及 restart=always 服务)在重启后启动,请启用 docker 服务,例如 `systemctl enable docker`。 (4认同)
  • 使用docker重启策略具有跨平台可移植性的优点。这些将在没有“Systemd”的系统上运行。让 Docker 处理与底层“init”系统的交互,而我们则在更高级别的抽象上进行操作。 (3认同)
  • 你的错误是无关的。您可能想发布一个单独的问题,但看起来您混淆了 docker 镜像名称和 docker 容器名称。`docker run` 命令需要一个图像的名称,你可以通过 `docker images` 列出它。 (2认同)

0xC*_*URU 50

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

docker run -d --restart unless-stopped ecstatic_ritchie
Run Code Online (Sandbox Code Playgroud)

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

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

docker update --restart unless-stopped ecstatic_ritchie
Run Code Online (Sandbox Code Playgroud)

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

docker update --restart unless-stopped $(docker ps -q)
Run Code Online (Sandbox Code Playgroud)

在 Docker主页上查看更多信息


Edw*_*ung 39

默认情况下重新启动策略no.

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

docker update --restart=always 0576df221c0b
Run Code Online (Sandbox Code Playgroud)

0576df221c0b 是容器ID.

  • @马克:不。请参阅[文档](https://docs.docker.com/config/containers/start-containers-automatically/):`如果手动停止容器,则其重新启动策略将被忽略,直到 Docker 守护进程重新启动或容器被重新启动。手动重新启动。这是防止重启循环的另一次尝试。 (6认同)
  • 有没有办法在 docker 守护进程启动时启动(一系列)容器,但不尝试在错误时重新启动?我没有找到它(当然使用重启策略)。 (3认同)

Sae*_*aeX 22

您可以使用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.
Run Code Online (Sandbox Code Playgroud)

  • 哇,发现这一点干得好,考虑到文档中没有提到它。对我来说完美的解决方案。 (4认同)

Abd*_*sit 16

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

$ sudo systemctl enable docker
Run Code Online (Sandbox Code Playgroud)

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

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

确保

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

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

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

$ docker-compose up -d
Run Code Online (Sandbox Code Playgroud)


Moh*_*asi 8

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

$ docker run -dit --restart unless-stopped <image name OR image hash>
Run Code Online (Sandbox Code Playgroud)

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

$ docker update --restart=<options> <container ID OR name>
Run Code Online (Sandbox Code Playgroud)

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

docker inspect gateway | grep RestartPolicy -A 3
Run Code Online (Sandbox Code Playgroud)

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

$ systemctl enable docker
Run Code Online (Sandbox Code Playgroud)

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


Rib*_*b47 6

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

docker run -dit --restart unless-stopped <image_name>
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,当 docker 守护进程因重新启动而停止时,守护进程会“停止”容器,将它们标记为已停止。然后当系统启动时,它实际上并没有启动这些。这是愚蠢的。这是错误:https://github.com/docker/for-linux/issues/652 (2认同)