假设我有一个想要运行的Docker容器,然后我可以调用它

$ docker run ...

一切都很好。是否有一种内置的方法来运行容器,使其在系统崩溃并重新启动时自动重新启动?

如果是的话,这在Docker Compose中也可用吗?


当前回答

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

$ 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守护进程:

$ systemctl enable docker

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

其他回答

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

$ sudo systemctl enable docker

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

Docker run——restart=always并运行Docker容器

确保

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

请看Docker官方页面上的重启策略

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

$ docker-compose up -d

如果你希望容器在没有用户登录的情况下也能启动(比如我只启动了VirtualBox虚拟机,不想每次都登录)。下面是我为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/

是的,docker有重启策略,比如docker run——restart=always,可以处理这个问题。这也可以在compose中使用。Yml配置文件的重启:始终。

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

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

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

你可以使用docker update——restart=on-failure <容器ID或名称>。

顾名思义,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.