Maison >Opération et maintenance >Docker >Docker ne quitte jamais le conteneur

Docker ne quitte jamais le conteneur

王林
王林original
2023-05-16 20:35:362444parcourir

Pour que le conteneur Docker continue de fonctionner et ne se ferme pas, il existe de nombreuses façons d'y parvenir. Dans cet article, nous aborderons certaines méthodes couramment utilisées ainsi que leurs avantages et inconvénients.

Méthode 1 : Utilisez l'option --restart

Docker fournit une option --restart qui peut redémarrer automatiquement le conteneur lorsque celui-ci se ferme anormalement . Il existe trois valeurs optionnelles, à savoir no, on-failure et always, qui correspondent respectivement à aucun redémarrage, redémarrage sur sortie anormale et toujours. Redémarrage. Exemple spécifique : --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

L'avantage d'utiliser l'option --restart est qu'elle est simple et facile à utiliser. Il vous suffit d'ajouter une option à la ligne de commande. Mais si une erreur se produit dans le conteneur, celui-ci continuera à redémarrer jusqu'à ce que le conteneur soit arrêté manuellement. Cela peut entraîner une instabilité du code et une perte de données.

Méthode 2 : Utiliser Docker Compose

Docker Compose est un outil qui peut définir et exécuter plusieurs conteneurs Docker. Il peut décrire la relation entre les conteneurs et les paramètres de démarrage via un fichier yml. Ajoutez la configuration suivante dans le fichier docker-compose.yml : #🎜🎜#rrreee#🎜🎜# Ensuite, vous pouvez utiliser la commande docker-compose pour démarrer le conteneur : L'option #🎜🎜#rrreee#🎜🎜#restart: always indique à Docker de redémarrer automatiquement le conteneur lorsque celui-ci se ferme anormalement. L'avantage de cette méthode est qu'elle peut gérer plusieurs conteneurs, ce qui est pratique et rapide, mais il reste le problème du redémarrage constant des conteneurs. #🎜🎜##🎜🎜#Méthode 3 : Utiliser un processus démon #🎜🎜##🎜🎜#L'utilisation d'un processus démon est un moyen fiable d'empêcher le conteneur Docker de se fermer. Démarrez un processus démon dans le conteneur, puis laissez le conteneur Docker s'exécuter sous la supervision du processus démon. S'il y a un problème avec le conteneur, le démon redémarrera le conteneur. #🎜🎜##🎜🎜#Ce qui suit est un exemple d'utilisation du démon supervisor pour démarrer un service Node.js : #🎜🎜#
  1. Installer le superviseur :
  2. ol>rrreee
    1. Créez le fichier supervisord.conf et ajoutez le contenu suivant :
    rrreee
    1. Ajoutez la configuration suivante dans le Dockerfile :
    rrreee#🎜🎜#Générez l'image et démarrez le conteneur : #🎜🎜#rrreee#🎜🎜#L'avantage d'utiliser un démon est que vous pouvez contrôler de manière flexible le comportement du conteneur. Cependant, cela nécessite un travail de configuration supplémentaire et doit démarrer un processus démon, qui consomme certaines ressources système. #🎜🎜##🎜🎜#Méthode 4 : Utiliser la surveillance externe #🎜🎜##🎜🎜#En utilisant un système de surveillance externe pour surveiller le conteneur Docker et redémarrer le conteneur lorsque des exceptions se produisent, vous pouvez contrôler de manière plus flexible le comportement du conteneur . Lorsqu'un conteneur présente une anomalie, le système de surveillance peut prendre certaines mesures, telles que l'émission d'une alarme, l'enregistrement de journaux, le redémarrage du conteneur, etc. #🎜🎜##🎜🎜#Par exemple, vous pouvez utiliser systemd pour surveiller les conteneurs Docker : #🎜🎜#
    1. Créez un fichier d'unité systemd, tel que mydocker. service, le contenu du fichier est le suivant :
    rrreee#🎜🎜#Ce fichier définit un conteneur nommé myapp. Lorsqu'un problème survient avec le conteneur, systemd redémarrera automatiquement le conteneur. Utilisez la commande systemctl pour activer ce service : #🎜🎜#rrreee#🎜🎜#L'avantage d'utiliser la surveillance externe est qu'elle est plus flexible et peut utiliser divers systèmes de surveillance tiers, mais cela nécessite travaux supplémentaires de configuration et de maintenance. #🎜🎜##🎜🎜# Dans l'ensemble, il existe de nombreuses façons de faire fonctionner les conteneurs Docker pendant une longue période, chacune avec ses propres avantages et inconvénients. Le choix spécifique doit être basé sur les besoins réels. Lors du démarrage d'un conteneur, vous devez également tenir compte de la stabilité et de la sécurité de son fonctionnement et utiliser des outils d'automatisation appropriés pour réduire les opérations manuelles. #🎜🎜#

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn