
Ich folge dem Docker-Tutorial und mache es in meiner eigenen Version
version: "3.1"
services:
web:
image: registry.gitlab.com/xxxx/xxxx:latest
deploy:
replicas: 2
ports:
- "8888:80"
mysql:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_USER: user
MYSQL_PASS: password
ports:
- "8889:3306"
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
Immer wenn ich Code ändere, erstelle ich ein neues Docker-Image und führe das Update aus.
docker stack deploy --compose-file docker-compose.yml xxxx-learn
Dann bemerkte ich einige Ausfallzeiten. Sie starten nacheinander neue Container und stoppen alte Container nacheinander. Das Problem ist dann, dass das Herunterladen des neuen Images einige Minuten dauert und der Webserver einige Zeit zum Ausführen benötigt.
Eine Lösung, die mir in den Sinn kam, ist, vor diesen beiden Webserver-Replikaten einen Nginx-Lastausgleich auszuführen. Aber gibt es eine bessere Lösung?
Antwort1
Sie sollten die Neustartrichtlinie und die Stop_Grace_Periode in Ihre Erstellungsdatei einfügen:
version: "3.1"
services:
web:
stop_grace_period: 10s
deploy:
replicas: 2
restart_policy:
condition: on-failure
Antwort2
Dann bemerkte ich einige Ausfallzeiten. Sie starten nacheinander neue Container und stoppen alte Container nacheinander. Das Problem ist dann, dass das Herunterladen des neuen Images einige Minuten dauert und der Webserver einige Zeit zum Ausführen benötigt.
Sie müssen einen Integritätscheck für Ihr Image/Ihren Container definieren. Ohne diesen weiß Docker nicht, wann Ihre Anwendung bereit ist, Anfragen zu bedienen, und sendet Anfragen an den „noch nicht bereiten“ Container und fährt den verbleibenden laufenden Container herunter, kurz nachdem der erste ersetzt wurde.
Der Healthcheck definiert einen Befehl, der in Ihrem Container ausgeführt wird, um festzustellen, ob Ihre Anwendung fehlerfrei ist. Siehediese DokumentationInformationen zum Konfigurieren des Integritätschecks in Ihrem Image finden Sie hier.