Son aktivite 1 month ago

Restart des container declarant /var/run/docker.sock dasn le compose .

Erreur32's Avatar Erreur32 bu gisti düzenledi 5 months ago. Düzenlemeye git

1 file changed, 132 insertions, 15 deletions

docker-systemd-sock-restartauto.md

@@ -1,34 +1,53 @@
1 - # Redémarrage automatique des containers utilisant docker.sock
1 + # Tutoriel complet – Redémarrage automatique des containers utilisant docker.sock
2 2
3 - ## Problème
4 - Lors d’une mise à jour Docker :
5 - - `dockerd` redémarre
6 - - le socket `/var/run/docker.sock` est recréé
7 - - les containers qui l’utilisent (Portainer, Dozzle, Telegraf, etc.)
8 - restent UP mais ne fonctionnent plus
9 - - `docker compose down/up` corrige car il recrée tout
3 + ## Contexte
10 4
11 - ## Solution
12 - Redémarrer automatiquement **uniquement** les containers
13 - qui montent `/var/run/docker.sock`, juste après le redémarrage de Docker.
5 + Sur Debian, lors d’une mise à jour Docker (`apt upgrade`) :
6 +
7 + * le service `docker.service` est redémarré
8 + * le socket `/var/run/docker.sock` est recréé
9 + * les containers qui montent ce socket (Portainer, Dozzle, Telegraf, etc.) restent **UP** mais ne fonctionnent plus
10 + * un `docker compose down && up -d` corrige le problème mais est destructif (réseaux recréés, coupure de service)
11 +
12 + Même avec `live-restore`, ce problème persiste car le **socket Docker est perdu**.
13 +
14 + ---
15 +
16 + ## Objectif
17 +
18 + * Détecter automatiquement les containers qui utilisent `/var/run/docker.sock`
19 + * Les redémarrer **juste après chaque redémarrage de Docker**
20 + * Ne toucher à aucun autre container
21 + * Éviter totalement `docker compose down/up`
22 +
23 + ---
24 +
25 + ## Principe de la solution
26 +
27 + 1. Un script shell détecte les containers montant `/var/run/docker.sock`
28 + 2. Le script redémarre uniquement ces containers
29 + 3. Un service systemd exécute ce script **après le redémarrage de Docker**
14 30
15 31 ---
16 32
17 - ## 1. Script de détection + restart
33 + ## Étape 1 – Création du script
18 34
19 - Créer le script :
35 + ### 1.1 Créer le répertoire
20 36
21 37 ```bash
22 38 mkdir -p /home/tools/SH
39 + ```
40 +
41 + ### 1.2 Créer le script
23 42
43 + ```bash
24 44 cat > /home/tools/SH/docker-restart-sock.sh <<'EOF'
25 45 #!/bin/sh
26 46
27 47 printf "%-20s %-30s %-18s %-10s\n" "CONTAINER" "IMAGE" "RESTART" "UP(s)"
28 48
29 49 for id in $(docker ps -aq); do
30 - if docker inspect -f '{{range .Mounts}}{{.Source}}{{end}}' "$id" \
31 - | grep -q '/var/run/docker.sock'; then
50 + if docker inspect -f '{{range .Mounts}}{{.Source}}{{end}}' "$id" | grep -q '/var/run/docker.sock'; then
32 51
33 52 name=$(docker inspect -f '{{.Name}}' "$id" | sed 's#^/##')
34 53 image=$(docker inspect -f '{{.Config.Image}}' "$id")
@@ -44,3 +63,101 @@ for id in $(docker ps -aq); do
44 63 fi
45 64 done
46 65 EOF
66 + ```
67 +
68 + ### 1.3 Sécuriser le script
69 +
70 + ```bash
71 + chown root:root /home/tools/SH/docker-restart-sock.sh
72 + chmod 750 /home/tools/SH/docker-restart-sock.sh
73 + ```
74 +
75 + ### 1.4 Test manuel
76 +
77 + ```bash
78 + /home/tools/SH/docker-restart-sock.sh
79 + ```
80 +
81 + ---
82 +
83 + ## Étape 2 – Création du service systemd
84 +
85 + ### 2.1 Créer le service
86 +
87 + ```bash
88 + cat > /etc/systemd/system/docker-sock-restart.service <<'EOF'
89 + [Unit]
90 + Description=Restart containers using docker.sock after Docker restart
91 + After=docker.service
92 + Requires=docker.service
93 +
94 + [Service]
95 + Type=oneshot
96 + ExecStart=/home/tools/SH/docker-restart-sock.sh
97 + TimeoutStartSec=0
98 +
99 + [Install]
100 + WantedBy=multi-user.target
101 + EOF
102 + ```
103 +
104 + ### 2.2 Activer le service
105 +
106 + ```bash
107 + systemctl daemon-reload
108 + systemctl enable docker-sock-restart.service
109 + ```
110 +
111 + ---
112 +
113 + ## Étape 3 – Vérifications
114 +
115 + ### Lancement manuel
116 +
117 + ```bash
118 + systemctl start docker-sock-restart.service
119 + ```
120 +
121 + ### Logs du service
122 +
123 + ```bash
124 + journalctl -u docker-sock-restart.service -n 50
125 + ```
126 +
127 + ### Ordre d’exécution Docker → script
128 +
129 + ```bash
130 + journalctl -u docker.service -u docker-sock-restart.service --no-pager
131 + ```
132 +
133 + ---
134 +
135 + ## Résultat final
136 +
137 + * Mise à jour Docker ou reboot
138 + * `docker.service` redémarre
139 + * `/var/run/docker.sock` est recréé
140 + * `docker-sock-restart.service` s’exécute automatiquement
141 + * seuls les containers utilisant `docker.sock` sont redémarrés
142 + * plus jamais besoin de `docker compose down && up -d`
143 +
144 + ---
145 +
146 + ## Containers typiquement concernés
147 +
148 + * portainer
149 + * dozzle / dozzle-agent
150 + * uptime-kuma
151 + * telegraf
152 + * watchtower
153 + * lazydocker
154 + * dockge
155 +
156 + ---
157 +
158 + ## Notes
159 +
160 + * Compatible avec `live-restore`
161 + * Pas de boucle de redémarrage
162 + * Impact nul sur les autres containers
163 + * Solution fiable, propre et maintenable

Erreur32's Avatar Erreur32 bu gisti düzenledi 5 months ago. Düzenlemeye git

1 file changed, 46 insertions

docker-systemd-sock-restartauto.md(dosya oluşturuldu)

@@ -0,0 +1,46 @@
1 + # Redémarrage automatique des containers utilisant docker.sock
2 +
3 + ## Problème
4 + Lors d’une mise à jour Docker :
5 + - `dockerd` redémarre
6 + - le socket `/var/run/docker.sock` est recréé
7 + - les containers qui l’utilisent (Portainer, Dozzle, Telegraf, etc.)
8 + restent UP mais ne fonctionnent plus
9 + - `docker compose down/up` corrige car il recrée tout
10 +
11 + ## Solution
12 + Redémarrer automatiquement **uniquement** les containers
13 + qui montent `/var/run/docker.sock`, juste après le redémarrage de Docker.
14 +
15 + ---
16 +
17 + ## 1. Script de détection + restart
18 +
19 + Créer le script :
20 +
21 + ```bash
22 + mkdir -p /home/tools/SH
23 +
24 + cat > /home/tools/SH/docker-restart-sock.sh <<'EOF'
25 + #!/bin/sh
26 +
27 + printf "%-20s %-30s %-18s %-10s\n" "CONTAINER" "IMAGE" "RESTART" "UP(s)"
28 +
29 + for id in $(docker ps -aq); do
30 + if docker inspect -f '{{range .Mounts}}{{.Source}}{{end}}' "$id" \
31 + | grep -q '/var/run/docker.sock'; then
32 +
33 + name=$(docker inspect -f '{{.Name}}' "$id" | sed 's#^/##')
34 + image=$(docker inspect -f '{{.Config.Image}}' "$id")
35 + restartp=$(docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' "$id")
36 +
37 + docker restart "$id" >/dev/null 2>&1
38 +
39 + start=$(docker inspect -f '{{.State.StartedAt}}' "$id")
40 + now=$(date -u +"%Y-%m-%dT%H:%M:%S.%NZ")
41 + up=$(($(date -d "$now" +%s) - $(date -d "$start" +%s)))
42 +
43 + printf "%-20s %-30s %-18s %-10s\n" "$name" "$image" "$restartp" "$up"
44 + fi
45 + done
46 + EOF
Daha yeni Daha eski