【问题标题】:Ensuring Docker container will start automatically when host starts确保 Docker 容器在主机启动时自动启动
【发布时间】:2017-12-24 12:48:06
【问题描述】:

有没有办法在主机启动时自动启动 Docker 容器?之前,我在 docker run 中使用“-restart always”参数,但它仅在 Docker Engine 未被终止时才有效。

【问题讨论】:

  • 如果您使用的是 RHEL 变体,这应该可以工作:docs.docker.com/engine/admin/systemd/…
  • 我将此作为我的参考,但是当我尝试启动服务时,它总是失败并且我没有得到明确的错误。 container-solutions.com/running-docker-containers-with-systemd
  • 你为什么不想使用--restart always?使用该标志,每次主机在您delete容器之前启动时,容器都会自动启动。
  • @SangminKi​​m 行为实际上是如果主机死了,容器不会启动备份。我再看看。

标签: docker


【解决方案1】:

正如你的评论,我认为你误解了--restart always

一旦运行docker run --restart always container,即使您明确停止container,每次重新启动主机时都会重新启动container

例如。

$ docker run --restart always --detach --name auto-start-redis redis
d04dfbd73eb9d2ba5beac41363aa5c45c0e034e08173daa6146c3c704e0cd1da
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
d04dfbd73eb9        redis               "docker-entrypoint..."   4 seconds ago       Up 4 seconds        6379/tcp            auto-start-redis
$ reboot       

# After reboot-------------------------------

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
d04dfbd73eb9        redis               "docker-entrypoint..."   About a minute ago   Up 21 seconds       6379/tcp            auto-start-redis

$ docker stop auto-start-redis
auto-start-redis
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
d04dfbd73eb9        redis               "docker-entrypoint..."   2 minutes ago       Exited (0) 30 seconds ago                       auto-start-redis
$ reboot 

# After reboot-------------------------------

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
d04dfbd73eb9        redis               "docker-entrypoint..."   3 minutes ago       Up 12 seconds       6379/tcp            auto-start-redis

不过,当然,这是基于docker-host 是自动启动的前提。 docker-host 在这里表示docker daemon 进程本身。通常docker-host会默认自动启动,如果不是,你需要自己设置。

我不确定您使用的是哪个操作系统,但对于Ubuntu16,您可以使用systemctl 命令来实现。

$ sudo systemctl enable docker  
# To tell systemd to start services automatically at boot, you must enable.

【讨论】:

  • 我再看看。我使用了 restart always 参数,但由于某种原因它没有启动,尽管之前我没有任何问题。
  • 如果您想在 Windows 启动时自动启动 docker 守护进程和 docker 桌面,请按照以下步骤操作thecodeframework.com/…
【解决方案2】:

如果您使用 docker swarm,您可以使用 --mode global 标志创建 global service,以确保在 docker swarm 中的每个节点上运行。

docker service create --mode global ...

如果您不使用 docker swarm,我认为最好的解决方案是使用您系统的 init 系统,如@I.R.R 所说的systemd。您可以为 systemd 创建自己的service 文件,并指定服务启动时的条件,如下所示。

[Unit]
Description=Your App
After=docker

请参阅此article 的数字海洋。

【讨论】:

  • Docker swarm 在这种情况下是一种矫枉过正。我实际上尝试过服务路线,但由于某种原因,它总是失败。我要做的是在文件中有一个 docker start 命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 2014-09-24
  • 2015-08-07
  • 2018-02-15
  • 1970-01-01
  • 2018-04-04
  • 2023-03-30
相关资源
最近更新 更多