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

$ docker run ...

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

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


当前回答

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

其他回答

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

这就是crontab的作用:

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

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

这个答案只能作为备份或替代使用本地Docker重启策略和/或SystemD服务单元来控制系统启动时容器的启动。

我觉得我提到这个答案的唯一原因是一种非理性的情绪反应,因为为了使SystemD服务单元方法正常工作,您必须正确处理过于复杂和大量的事情,因为这样一个简单的任务在任何Linux机器上都应该是简单的。

缺省情况下,重启策略为no。

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

docker update --restart=always 0576df221c0b

0576df221c0b是容器id。

如果你希望容器在没有用户登录的情况下也能启动(比如我只启动了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 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.