Heim >Betrieb und Instandhaltung >Docker >Docker verlässt den Container nie

Docker verlässt den Container nie

王林
王林Original
2023-05-16 20:35:362445Durchsuche

Um den Docker-Container am Laufen zu halten und nicht zu beenden, gibt es viele Möglichkeiten. In diesem Artikel behandeln wir einige häufig verwendete Methoden und ihre Vor- und Nachteile.

Methode 1: Verwenden Sie die Option --restart

Docker bietet eine Option --restart, um den Container automatisch neu zu starten, wenn der Container abnormal beendet wird. Es gibt drei optionale Werte, nämlich no, on-failure und always, die jeweils „kein Neustart“, „Neustart bei abnormalem Beenden“ und „immer“ entsprechen. Neustart. Konkretes Beispiel: --restart,可以在容器异常退出时自动重启容器。有三种可选值,分别是 noon-failurealways,分别对应不重启、非正常退出时重启和总是重启。具体示例:

docker run --restart=always IMAGE_NAME

使用 --restart 选项的优点是简单易用,只需要在命令行中添加一个选项即可。但如果容器出现了错误,它也会一直重启,直到手动停止容器。这可能会导致代码的不稳定性和数据的丢失。

方法二:使用 Docker Compose

Docker Compose 是一个工具,可以定义和运行多个 Docker 容器。它可以通过一个 yml 文件来描述容器之间的关系和启动参数。在 docker-compose.yml 文件中添加下面的配置:

version: '3'

services:
  app:
    build: .
    restart: always

然后可以使用 docker-compose 命令启动容器:

docker-compose up -d

restart: always 选项告诉 Docker 在容器异常退出时自动重启容器。这种方法的优点是可以管理多个容器,方便快捷,但是依然存在容器一直重启的问题。

方法三:使用守护进程

使用守护进程是保持 Docker 容器不退出的一种可靠的方法。在容器中启动一个守护进程,然后让 Docker 容器在守护进程的监控下运行。如果容器出现问题,守护进程会重新启动容器。

以下是一个例子,使用 supervisor 守护进程启动一个 Node.js 服务:

  1. 安装 supervisor:
npm install -g supervisor
  1. 创建 supervisord.conf 文件,添加以下内容:
[supervisord]
nodaemon=true

[program:app]
command=supervisor app.js
directory=/app
autostart=true
autorestart=true
user=root
  1. 在 Dockerfile 中添加以下配置:
RUN apt-get update && apt-get install -y supervisor

COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

生成镜像并启动容器:

docker build -t IMAGE_NAME .
docker run -d IMAGE_NAME

使用守护进程的优点是可以灵活地控制容器的行为,但是需要一些额外的配置工作,并且需要启动一个守护进程,占用一些系统资源。

方法四:使用外部监控

使用外部监控系统来监控 Docker 容器并在异常时重启容器,可以更加灵活地控制容器的行为。在容器异常时,监控系统可以采取一些操作,例如发出警报、记录日志、重启容器等。

例如可以使用 systemd 来监控 Docker 容器:

  1. 创建一个 systemd unit 文件,例如 mydocker.service,文件内容如下:
[Unit]
Description=My Docker Container

[Service]
ExecStart=/usr/bin/docker start -a myapp
Restart=always
RestartSec=10s
ExecStop=/usr/bin/docker stop -t 2 myapp

[Install]
WantedBy=default.target

这个文件定义了一个名为 myapp 的容器。当容器出现问题时,systemd 会自动重启容器。使用 systemctl

sudo systemctl daemon-reload
sudo systemctl enable mydocker.service
sudo systemctl start mydocker.service

Der Vorteil der Verwendung der Option --restart besteht darin, dass sie einfach und benutzerfreundlich ist. Sie müssen lediglich eine Option zur Befehlszeile hinzufügen. Wenn jedoch im Container ein Fehler auftritt, wird er so lange neu gestartet, bis der Container manuell gestoppt wird. Dies kann zu Codeinstabilität und Datenverlust führen.

Methode 2: Docker Compose verwenden

Docker Compose ist ein Tool, das mehrere Docker-Container definieren und ausführen kann. Es kann die Beziehung zwischen Containern und Startparametern über eine YML-Datei beschreiben. Fügen Sie die folgende Konfiguration in der Datei docker-compose.yml hinzu: 🎜rrreee🎜Dann können Sie den Befehl docker-compose verwenden, um den Container zu starten: 🎜rrreee🎜 restart: Always weist Docker an, den Container automatisch neu zu starten, wenn er abnormal beendet wird. Der Vorteil dieser Methode besteht darin, dass mehrere Container verwaltet werden können, was bequem und schnell ist. Es besteht jedoch immer noch das Problem, dass Container ständig neu gestartet werden. 🎜🎜Methode 3: Verwenden Sie einen Daemon-Prozess🎜🎜Die Verwendung eines Daemon-Prozesses ist eine zuverlässige Methode, um zu verhindern, dass der Docker-Container beendet wird. Starten Sie einen Daemon-Prozess im Container und lassen Sie dann den Docker-Container unter der Aufsicht des Daemon-Prozesses laufen. Wenn ein Problem mit dem Container auftritt, startet der Daemon den Container neu. 🎜🎜Das Folgende ist ein Beispiel für die Verwendung des <code>supervisor-Daemons zum Starten eines Node.js-Dienstes: 🎜
  1. Install supervisor:
rrreee
  1. Erstellen Sie die Datei supervisord.conf und fügen Sie den folgenden Inhalt hinzu:
rrreee
  1. Fügen Sie die folgende Konfiguration hinzu in der Docker-Datei:
rrreee🎜Generieren Sie das Image und starten Sie den Container: 🎜rrreee🎜Der Vorteil der Verwendung eines Daemons besteht darin, dass Sie das Verhalten des Containers flexibel steuern können, es erfordert jedoch einige zusätzliche Konfigurationsarbeiten , und Sie müssen einen Daemon starten, der einige Systemressourcen beansprucht. 🎜🎜Methode 4: Externe Überwachung verwenden🎜🎜Verwenden Sie ein externes Überwachungssystem, um den Docker-Container zu überwachen und den Container neu zu starten, wenn Ausnahmen auftreten, sodass Sie das Verhalten des Containers flexibler steuern können. Wenn ein Container abnormal ist, kann das Überwachungssystem einige Maßnahmen ergreifen, z. B. einen Alarm auslösen, Protokolle aufzeichnen, den Container neu starten usw. 🎜🎜Zum Beispiel können Sie systemd verwenden, um Docker-Container zu überwachen: 🎜
  1. Erstellen Sie eine Systemd-Unit-Datei, z. B. mydocker.service, mit Folgendem Inhalt:
rrreee🎜Diese Datei definiert einen Container namens myapp. Wenn ein Problem mit dem Container auftritt, startet systemd den Container automatisch neu. Verwenden Sie den Befehl systemctl, um diesen Dienst zu aktivieren: 🎜rrreee🎜Der Vorteil der Verwendung der externen Überwachung besteht darin, dass sie flexibler ist und verschiedene Überwachungssysteme von Drittanbietern verwenden kann, erfordert jedoch zusätzliche Konfigurations- und Wartungsarbeiten. 🎜🎜Generell gibt es viele Möglichkeiten, Docker-Container lange am Laufen zu halten, jede mit ihren eigenen Vor- und Nachteilen. Die konkrete Auswahl sollte auf den tatsächlichen Bedürfnissen basieren. Beim Starten eines Containers sollten Sie auch die Stabilität und Sicherheit des Containerbetriebs berücksichtigen und geeignete Automatisierungstools verwenden, um manuelle Vorgänge zu reduzieren. 🎜

Das obige ist der detaillierte Inhalt vonDocker verlässt den Container nie. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn