假设我有一个要运行的Docker容器,那么我可以调用
$ docker run ...
一切都很好。如果系统崩溃并重新启动,是否有内置的方式来运行容器,使其能够自动重新启动?
如果是这样,那么在Docker Compose中也可以使用吗?
假设我有一个要运行的Docker容器,那么我可以调用
$ docker run ...
一切都很好。如果系统崩溃并重新启动,是否有内置的方式来运行容器,使其能够自动重新启动?
如果是这样,那么在Docker Compose中也可以使用吗?
Answers:
是的,码头工人具有重启策略,例如docker run --restart=always
可以处理此问题的策略。这也是在可用compose.yml配置文件作为restart: always
。
docker run --restart=always crmpicco-mysql
,但出现错误:Unable to find image 'crmpicco-mysql:latest' locally
。
docker run
命令需要一个可以通过列出的图像名称docker images
。
如果即使没有用户执行登录,也要启动容器(例如,我仅启动而不希望每次都登录的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
有关更多信息,请访问https://docs.docker.com/engine/admin/host_integration/
docker
命令替换上面的docker-compose
命令,并使用该-f
标志指定/usr/bin/docker-compose -f /path/to/docker-compose.yml up
docker-compose.yml
指定了.env
文件,则--project-directory /path/to
除了显式指定您的docker compose文件外,还要使用。
[Unit]
指令,它可能很有趣Before=
。特别是在启动诸如数据库管理系统之类的东西时,确保在特定的其他服务之前启动它可能会有所帮助。
在默认情况下重新启动策略是no
。
对于创建的容器,使用docker update
更新重启策略。
docker update --restart=always 0576df221c0b
0576df221c0b
是容器ID。
always
说即使我停止了容器,容器也将重新启动?当然,有一种方法可以在重启时重启容器,而无需进行这种持久的启动...
您可以使用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.
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 run -dit --restart unless-stopped <image_name>
restart=unless-stopped
选项将在重新启动docker引擎时尝试启动容器。我所看到的例外是当docker引擎本身未配置为在重新启动时自动启动(检查systemctl status docker
以确保已启用),并且在网络就绪之前引擎启动了容器,而我只有在使用重叠网络时才能看到。这些都将打破restart=always
。
这是crontab的用途:
@reboot sleep 10 ; docker start <container name> 2>&1 | /usr/bin/logger -t 'docker start'
通过访问用户crontabcrontab -e
或在其中显示它,crontab -l
或在以下位置编辑系统crontab/etc/crontab
您可以运行始终通过以下方式重新启动的容器:
$ 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
要查看重新启动策略的完整列表,请参阅:重新启动策略
我在运行Linux系统时遇到类似的问题。引导系统后,除非我输入以某种方式使用docker的命令(例如“ docker ps”),否则重启策略为“ unless-stopped”的容器将不会自动重启。我很惊讶,因为我期望该命令仅报告一些状态信息。接下来,我尝试了命令“ 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命令的情况下运行“ docker ps”的系统上,我得到了以下信息:
● 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 =多用户目标
到目前为止(一项测试,启用了此服务),容器在启动计算机时启动。我没有尝试依赖docker.service,因为在运行docker命令之前docker.service不会启动。下一个测试将是禁用docker-onboot的功能(以查看WantedBy依赖项是否会自动启动它)。
要启动容器并将其设置为在系统重新启动时自动重新启动,请使用
docker run -d --restart unless-stopped ecstatic_ritchie
其中ecstatic_ritchie
的示例名称指定了所需的容器。使用docker ps -a
列出所有容器名。
要使特定正在运行的容器在系统重新引导时自动启动
docker update --restart unless-stopped ecstatic_ritchie
使所有正在运行的容器在系统重新启动时自动启动
docker update --restart unless-stopped $(docker ps -q)
在Docker主页上查看更多
Systemd
是为此目的的最佳解决方案之一,并且需要更多支持。