Docker-Stack-Bereitstellung ohne Ausfallzeiten

Docker-Stack-Bereitstellung ohne Ausfallzeiten

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.

verwandte Informationen