[Tuto] Redémarrer automatiquement un conteneur Docker avec un statut unhealthy

EVO

Administreur
Membre du personnel
25 Novembre 2019
8 158
1 562
278
/var/run/docker.sock
[Tuto] Redémarrer automatiquement un conteneur Docker avec un statut unhealthy


Informations : Je n'utilise plus autoheal depuis un moment maintenant, ce tutoriel n'est donc plus maintenu, vous pouvez vous tourner vers deunhealthy qui fait la même chose. [Tuto] Redémarrer automatiquement un conteneur Docker avec un statut unhealthy

Bonjour,
Nous allons voir comment utiliser docker-autoheal afin de surveiller nos conteneurs, et les redémarrer automatiquement en cas de besoin.

Dans mon cas, j'ai mi ceci en place pour un conteneur VPN, qui a parfois tendance a déconnecter. Avec docker-autoheal, si mon conteneur VPN passe en unhealthy, alors, il va automatiquement lancer un reboot du conteneur.

Sommaire :
1/ Configuration du conteneur à surveiller
____ a/ Conteneur crée via Portainer
____ b/ Conteneur créé en docker-compose
2/ Création du conteneur healcheck
____ a/ Via docker run :
____ b/ Via docker-compose :


C'est parti ! :giggle:

1/ Configuration du conteneur à surveiller
Sur votre conteneur à surveiller, qui devra bien sur être déja equipé d'un healcheck, vous allez devoir rajouter le label "autoheal=true"
a/ Conteneur crée via Portainer
Si votre conteneur est créé depuis Portainer, alors il suffit de l'editer :
zhbfw7K.png

Puis dans l'onget Labels, de rajouter le label comme ceci :
kV5FbLp.png

Puis de re-déployer le conteneur :
5mN7r8G.png


b/ Conteneur créé en docker-compose
Si votre conteneur est créé depuis docker-compose, il vous suffit d'éditer votre fichier .yml pour y rajouter le label, comme ceci :
Code:
    labels:
      - autoheal=true
YIyMJnT.png


2/ Création du conteneur healcheck
a/ Via docker run :

Connecter vous en SSH, et exécuter cette commande pour créer le conteneur :
Code:
sudo docker run -d \
    --name autoheal \
    --restart=always \
    -e AUTOHEAL_CONTAINER_LABEL=autoheal \
    -v /var/run/docker.sock:/var/run/docker.sock \
    willfarrell/autoheal

b/ Via docker-compose :
Code:
version: '3.3'
services:
    autoheal:
        container_name: autoheal
        restart: always
        environment:
            - AUTOHEAL_CONTAINER_LABEL=autoheal
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - /etc/localtime:/etc/localtime:ro
        image: willfarrell/autoheal
        network_mode: none

A partir de maintenant, autoheal va surveiller tous vos conteneurs auquel vous avez rajouté le label "autoheal=true" et les redémarrer au besoin.

2021-08-19 - Correction de AUTOHEAL_CONTAINER_LABEL
 
Dernière édition:
  • J'aime
Réactions: MilesTEG
Salut,

Pourrais tu faire un exemple d'utilisation avec un conteneur par exemple car sa ne marche pas chez moi.

AutoHeal:
YAML:
################
version: '3.9' #
services:      #
################
########################################################################
 AutoHeal:
  image: 'willfarrell/autoheal'
  container_name: 'Autoheal'
  hostname: 'AutoHeal'

  network_mode: 'bridge'

  environment:
   AUTOHEAL_INTERVAL: '5'
   AUTOHEAL_START_PERIOD: '0'
   AUTOHEAL_DEFAULT_STOP_TIMEOUT: '10'
   AUTOHEAL_CONTAINER_LABEL: 'autoheal'
   DOCKER_SOCK: '/var/run/docker.sock'
  volumes:
   - '/var/run/docker.sock:/var/run/docker.sock'
   - '/etc/localtime:/etc/localtime:ro'

Plex:
YAML:
########################################################################
version: '3.9'
services:
 Plex:
  image: 'linuxserver/plex'
  container_name: 'CN_Plex'
  hostname: 'CN_Plex'

  network_mode: 'bridge'

  environment:
   PUID: '1002'
   PGID: '1002'
   TZ: 'Europe/Paris'
   PLEX_CLAIM: '' # Valeur mis à blanc pour le topic
   VERSION: 'docker'

  volumes:
   - 'Plex:/config:rw'

  ports:
   - '32400:32400'
  # ----------------------------------------------------------- #
  healthcheck:
   test: ["CMD", "curl", "-L", "http://localhost:32400"]
   interval: 5s
   timeout: 2s
   retries: 3
   start_period: 20s

  labels:
   "autoheal": "true"
  # ----------------------------------------------------------- #

########################################################################

volumes:

 Plex:

  external: 'false'
 
Dernière édition:
Salut,
Tu conteneur semble contenir une WebUI, mais il n'a peut etre pas de healcheck intégré ?

Tu peut le rajouter de cette façon ( si ton conteneur possède curl ) :
YAML:
version: '3.9'
services:
  Dozzle:
    image: 'amir20/dozzle'
    container_name: 'CN_Dozzle'
    network_mode: 'bridge'
    ports:
      - '8888:8080'
    volumes:
      - '/var/run/docker.sock:/var/run/docker.sock'
    labels:
     - autoheal=true
    healthcheck:
        test: ["CMD-SHELL", "curl --fail http://localhost:8080/ || exit 1"]
        start_period: 15s
        interval: 1m30
        timeout: 10s
        retries: 3

Le healthcheck va vérifier que l'interface du conteneur est joignable, si ce n'est pas le cas, le conteneur passera en statut unhealthy, a partir de la, autoheal va le voir, et le re-démarrera.
 
Hello :)
J'ai mis quelques labels pour autoheal dans certains docker-compose de certains conteneurs.
Comment être sûr qu'ils sont bien pris en compte ? Y a une commande sur autoheal à lancer pour voir qui il surveille ?
 
Bonjour EVOTk.
je me permets de relancer un peu de topic car je rencontre quelques problèmes.

J'ai plusieurs conteneurs qui tournent et qui ont été lancés via Docker Compose. Ils fonctionnent tous correctement mais j'ai cherché à améliorer tout ça avec autoheal, c'est d'ailleurs comme ça que je suis arrivé ici.

Lorsque je configure mes conteneurs avec healthcheck + le labels "autoheal=true" cela ne fonctionne pas.
ils restent tous au statut "starting" et impossible d'accéder au service.

Est ce que ce problème te parle ?
Je te mets un exemple :

YAML:
version: '3.9'
services:
  portainer:
   image: portainer/portainer-ce:latest
   container_name: portainer
   deploy:
    resources:
     limits:
      memory: 512M
   restart: unless-stopped
   healthcheck:
    test: curl --fail http://localhost:9000 || exit 1
    interval: 1m
    timeout: 30s
    retries: 3 
   security_opt:
    - no-new-privileges:true
   volumes:
    - /etc/localtime:/etc/localtime:ro
    - /var/run/docker.sock:/var/run/docker.sock:ro
    - ./portainerdata:/data
   networks:
    - traefik-net
   labels:
    - autoheal=true
    - traefik.enable=true
    - traefik.docker.network=traefik-net
    - traefik.http.routers.portainer.entrypoints=http
    - traefik.http.routers.portainer.rule=Host(`xxx.xxx.xxx`) 
    - traefik.http.middlewares.portainer-https-redirect.redirectscheme.scheme=https
    - traefik.http.routers.portainer.middlewares=portainer-https-redirect
    - traefik.http.routers.portainer-secure.entrypoints=https
    - traefik.http.routers.portainer-secure.rule=Host(`xxx.xxx.xxx`)
    - traefik.http.routers.portainer-secure.tls=true
    - traefik.http.services.portainer.loadbalancer.server.port=9000
volumes:
 portainerdata:
networks:
 traefik-net:
  external: true

merci
 
Non désolé, par contre, dans le healthcheck j'ai pour habitude de mettre l'ip de la passerelle du reseau docker en question, et non localhost. A voir si cela a une réelle influence.

Depuis quelques temps aussi j'ai laché autoheal pour deunhealth
tu veux dire la passerelle du réseau dans docker ou l'ip de l'hôte ?
comme j'ai un reverse proxy si je mets l'ip de l'hôte je vois pas comment le healthcheck fera la différence avec les autres conteneurs

y'a un truc qui m’échappe pardon

Depuis quelques temps aussi j'ai laché autoheal pour deunhealth
y'a une raison particulière ?
 
j'ai le même problème avec Uptime-Kuma et jirafeau par exemple.


tu as un exemple ou un tuto avec dehunhealth par hasard ?
 
tu as un exemple ou un tuto avec dehunhealth par hasard ?
Le conteneur a surveiller doit avoir le label : deunhealth.restart.on.unhealthy=true

Voici mon compose pour deunhealth :
YAML:
version: "3.7"
services:
  deunhealth:
    image: qmcgaw/deunhealth
    container_name: deunhealth
    network_mode: "none"
    environment:
      - LOG_LEVEL=info
      - HEALTH_SERVER_ADDRESS=127.0.0.1:9999
      - TZ=Europe/Paris
    restart: unless-stopped
    mem_limit: 128m
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

L'image d'uptimekuma possède de base un healthcheck https://github.com/louislam/uptime-kuma

Voir : https://github.com/louislam/uptime-kuma/blob/master/docker/dockerfile
I3Gk1V5.png
 
ha j'avais pas vu pour uptime ! ça explique tout :)
merci pour ton aide je vais creuser autoheal et tester aussi deunhealth

merci encore :)
 
Hello !
Petit retour d’expérience parce que j’ai résolu le problème.
C’était dû à une erreur de ma part les différents healthcheck que j’avais positionnés n’étaient pas corrects.
Après quelques recherches j’ai trouves ceux qui correspondaient aux types de conteneurs que j’avais et tout est rentré dans l’ordre.
Mon infra est intégralement healthy ? (a part wikijs qui fait des siennes)
Merci encore pour l’aide et les réponses.
 
Dernière édition:
Salut,
merci pour ton retour, si tu utilise Portainer, la solution pour le surveiller via healthy m'interesse :)
Je l’utilise pas mais j’ai la solution vu que j’avais fais quelques tests dessus (je fais tout via compose en yaml)
Code:
   healthcheck:
    test: ["CMD", "/docker", "container", "top", "portainer"]
    interval: 1m
    timeout: 30s
    retries: 3

Si tu as wikijs tu me fais signe ?
 
Si tu as wikijs tu me fais signe
Si tu utilise un conteneur mariadb, tu peut utiliser ceci pour le surveiller :
YAML:
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
      start_period: 15s
      interval: 90s
      timeout: 10s
      retries: 3

Si tu parle du conteneur ghcr.io/requarks/wiki:2, tu peut utiliser ceci :

YAML:
    healthcheck:
      test: ["CMD-SHELL", "curl --fail http://localhost:3000/ || exit 1"]
      start_period: 15s
      interval: 90s
      timeout: 10s
      retries: 3
 
  • J'aime
Réactions: Dutch