GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

Definitive Guide on Backup and Restore of Docker Containers [A Cloud + Local Approach for Standalone Servers]

Wie Sie vielleicht schon den Satz gehört haben:Ein Backup ist nicht gut, wenn es nicht wiederherstellbar ist .

Es gibt verschiedene Möglichkeiten, ein Backup Ihrer wichtigen Dateien auf einem Cloud-Server zu erstellen. Wichtig ist aber auch, dass Sie immer eine aktualisierte Kopie dieser Dateien auf Ihrem lokalen Ordner haben Systeme.

Es ist in Ordnung, sie in der Cloud zu sichern. Aber ein echtes Backup ist nur eine frische und regelmäßig aktualisierte Kopie, die Ihnen jederzeit zur Verfügung steht. Wieso den? Weil es IHRE Daten sind!

Zwei Herausforderungen, die ich in dieser Hinsicht ansprechen werde, sind :

  1. Die Notwendigkeit, Docker-Container auf einem Produktionsserver zu stoppen, um mögliche Datenbeschädigungen (insbesondere Datenbanken) beim Backup zu vermeiden. Die Dateien auf Live-Produktionscontainern werden kontinuierlich geschrieben.
  2. Das Anhalten von Docker-Containern führt auch zu Ausfallzeiten, und das können Sie sich nicht leisten, insbesondere wenn Sie in der Produktion sind.

Diese Probleme können durch die Verwendung von Clustern anstelle von einzelnen Servern behoben werden. Aber hier konzentriere ich mich auf einzelne Server und nicht auf Cluster um den Cloud-Service-Aufwand so gering wie möglich zu halten.

Ich fragte mich immer wieder, wie ich mit den beiden oben genannten Herausforderungen umgehen sollte. Dann fiel mir auf, dass wir eine Kombination aus einer Cloud- und einer lokalisierten Lösung verwenden können.

Mit Cloud-basierten Lösungen meine ich die Backup-Dienste von Cloud-Service-Anbietern wie Linode, Digital Ocean und anderen. In dieser exemplarischen Vorgehensweise werde ich Linode verwenden.

Mit lokalisierten Lösungen meine ich die Verwendung von Befehlszeilen- oder GUI-basierten Tools, um das Backup von Cloud-Servern auf Ihr lokales System/Desktop herunterzuladen. Hier habe ich sftp (befehlsbasiert) verwendet.

Zuerst werde ich besprechen, wie man die Sicherung durchführt, gefolgt von der Wiederherstellung.

Das Cloud + Local Based Backup-Verfahren

Sehen wir uns zuerst die Sicherungsprozedur an.

Aktivieren Sie Backups auf dem Linode-Produktionsserver (falls Sie dies noch nicht getan haben)

Wenn Sie einen Produktionsserver auf Linode verwenden, wird dringend empfohlen, dass Sie die Sicherung für ihn aktivieren, wenn er zum ersten Mal bereitgestellt wird. Eine "Nanode", wie sie genannt wird, kommt mit 1 GB RAM und bietet den folgenden Backup-Plan:

Alle anderen Backup-Lösungen bieten eine ähnliche Funktion, jedoch zu höheren Raten. Stellen Sie sicher, dass es aktiviert ist.

Machen Sie einen manuellen Snapshot als Backup in der Cloud

Geben Sie ein Datum zur späteren Bezugnahme ein. Hier nenne ich es "manual-snapshot-11-05-21".

Sobald Sie darauf klicken, werden Sie um eine Bestätigung gebeten:

Wenn Sie bestätigen, finden Sie unten rechts eine Benachrichtigung:

Sie können den Fortschritt auf derselben Seite überwachen, neben der Stelle, wo steht, dass Ihr Server läuft (oben links):

Sobald es fertig ist, sehen Sie das Backup als viertes in der Liste.

Klonen Sie den Produktionsserver

Obwohl Sie einen Server (basierend auf früher geplanten Backups) direkt aus dem Linode-Panel klonen können, empfehle ich Ihnen, manuelle Backups zu verwenden, wie im obigen Schritt beschrieben.

Um also mit der Erstellung eines Klons basierend auf der letzten manuellen Sicherung fortzufahren, die Sie erstellt haben, befolgen Sie unbedingt die folgenden Anweisungen:

Gehen Sie zum Linode-Bedienfeld und klicken Sie auf „Erstellen“:

Wählen Sie "Linode":

Wählen Sie die Registerkarte "Sicherungen":

Beachten Sie, dass der Schnappschuss, den Sie machen, auf einem 2 GB Linode basiert. Wählen Sie den soeben erstellten manuellen Snapshot aus:

Stellen Sie nun sicher, dass Sie die gleiche Spezifikation (2 GB Linode Plan) für Ihren Klon auswählen:

Nachdem Sie den neuen Server basierend auf der Sicherung des Produktionsservers erstellt haben, steht Ihnen ein leicht verfügbarer Klon des Produktionsservers zur Verfügung.

Melden Sie sich per ssh beim Klon an und stoppen Sie alle Container

Sie sollten keine Probleme haben, sich über ssh beim neuen Klon anzumelden, da er dieselben öffentlichen Schlüssel wie der Produktionsserver verwendet. Sie müssen nur die neue IP des Klons verwenden. Ich gehe davon aus, dass Sie nur ssh verwenden und die passwortbasierte Authentifizierung deaktiviert haben, oder? Lesen Sie diesen SSH-Sicherheitsleitfaden, falls Sie ihn noch nicht gelesen haben.

Stoppen Sie nach der Anmeldung alle Container, deren Daten Sie sichern möchten. Normalerweise würden Sie in die entsprechenden App-Verzeichnisse wechseln und den Befehl docker-compose down verwenden. In einer typischen Produktionsumgebung wird immer erwartet, dass Sie Docker Compose anstelle des herkömmlichen docker stop verwenden Befehl, der nur während des Testens bevorzugt werden sollte.

Wenn zum Beispiel Ghost mit seinem entsprechenden Datenbankcontainer läuft, würde ich zuerst die entsprechenden Informationen überprüfen:

[email protected]:~$ docker ps
CONTAINER ID   IMAGE                                    COMMAND                  CREATED        STATUS       PORTS                                      NAMES
6a3aafe12434   ghost:4.4.0                              "docker-entrypoint.s…"   7 days ago     Up 7 days    2368/tcp                                   ghost_ghost_2
95c560c0dbc7   jrcs/letsencrypt-nginx-proxy-companion   "/bin/bash /app/entr…"   6 weeks ago    Up 10 days                                              letsencrypt-proxy-companion
6679bd4596ba   jwilder/nginx-proxy                      "/app/docker-entrypo…"   6 weeks ago    Up 10 days   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   jwilder-nginx-proxy
1770dbb5ba32   mariadb:10.5.3                           "docker-entrypoint.s…"   3 months ago   Up 10 days                                              ghost_db_1

Wie Sie hier sehen können, lauten die Containernamen ghost_ghost_2 und ghost_db_1 jeweils unter einem Reverse-Proxy laufen. Halten wir sie auf.

[email protected]:~$ cd ghost
[email protected]:~/ghost$ docker-compose down
Stopping ghost_ghost_2 ... done
Stopping ghost_db_1    ... done
Network net is external, skipping
[email protected]:~/ghost$ 

Falls Sie mehr Anwendungen hinter einer Nginx-Reverse-Proxy-Konfiguration ausführen, verwenden Sie dasselbe Verfahren mit den entsprechenden Verzeichnisnamen, die für die Anwendungen festgelegt sind. Halte sie alle einzeln auf.

Volumes und Einstellungen als gzip-Archive sichern

Sehen wir uns nun den manuellen Sicherungsvorgang an.

Benannte Volumes sichern

Wenn Sie mit benannten Docker-Volumes arbeiten, notieren Sie sich, ob die Volumes manuell erstellt wurden oder auf einer generischen Docker Compose-Konfiguration basierten, bei der die App zuerst bereitgestellt wurde.

Eine generische Konfiguration im Volumes-Abschnitt sieht so aus:

volumes:
  ghost:
  ghostdb:

Das obige Szenario wird von Docker Compose verwaltet, und die tatsächlichen Volume-Namen, die Sie für die Sicherung benötigen, lauten ghost_ghost und ghost_ghostdb .

Falls die Volumes manuell mit docker volume create volume-name erstellt wurden , würde die Konfiguration wie folgt aussehen und ausschließlich ghost sein und ghostdb allein:

volumes:
  ghost:
    external: true
  ghostdb:
    external: true

Trotzdem müssen Sie sie in jedem Fall sichern, und Sie müssen auch die Pfade auf den Containern überprüfen, wenn die Volumes gemountet werden. Beispielsweise können bei einer typischen Ghost-Konfiguration mit MariaDB die Pfade bekannt sein, indem man sich die Unterabschnitte der Volumes innerhalb der Service-Definitionen ansieht. Hier ist ein Auszug, um Ihnen zu zeigen, was ich meine:

    ghostdb:
        volumes:
            - ghostdb:/var/lib/mysql

Die obige Konfiguration ist Teil des Datenbankdienstes und seines entsprechenden Containers, der erstellt wird, sobald er bereitgestellt wird.

Ebenso lautet der Pfad für den Ghost-Dienst selbst /var/lib/ghost/content :

    ghost:
        volumes:
            - ghost:/var/lib/ghost/content

Sie müssen diese Pfade kennen, um Ihre Volumes zu sichern.

Verwenden Sie das docker volume ls Befehl, um die Volume-Namen auf dem geklonten Server zu überprüfen.

[email protected]:~/ghost$ docker volume ls
DRIVER    VOLUME NAME
local     ghost
local     ghostdb
local     nginx-with-ssl_acme
local     nginx-with-ssl_certs
local     nginx-with-ssl_dhparam
local     nginx-with-ssl_html
local     nginx-with-ssl_vhost

So können Sie bestätigen, dass die Volumes tatsächlich ghost sind und ghostdb .

Zeit, sie zu unterstützen! Lassen Sie uns jetzt auf dem Produktionsklon ein Sicherungsverzeichnis in Ihrem Benutzerverzeichnis erstellen:

mkdir ~/backup

Jetzt werde ich den folgenden Befehl verwenden, um den Inhalt der Volumes in einem tar-Archiv zu sichern:

docker run --rm -v ghostdb:/var/lib/mysql -v ~/backup:/backup ubuntu bash -c "cd /var/lib/mysql && tar cvzf /backup/ghostdb.tar.gz ."

Im obigen Befehl mit -v oder --volume , mounte ich das vorhandene Docker-Volume in einen neuen Ubuntu-Container und binde auch das soeben erstellte Backup-Verzeichnis ein. Später gehe ich in das Datenbankverzeichnis innerhalb des Containers und verwende tar, um seinen Inhalt zu archivieren. --rm wird verwendet, um den Container automatisch zu bereinigen und sein Dateisystem zu entfernen, wenn der Container beendet wird (weil Sie es nur so lange wollen, wie der Sicherungs- oder Wiederherstellungsjob abgeschlossen ist).

Beachten Sie den Punkt am Ende des obigen Befehls, bevor das Zitat (") endet. Er stellt sicher, dass das Archiv enthält, was in /var/lib/ghost/content ist allein und ohne den gesamten Pfad selbst als Unterverzeichnisse. Letzteres verursacht Probleme beim Wiederherstellen des Archivs auf einem neuen Volume auf einem neuen Server. Denken Sie also bitte daran.

Jetzt habe ich ein Archiv des MariaDB-Datenbankvolumens, das unser Ghost-Blog verwendet. Ebenso muss ich auch das Ghost-Volume sichern:

docker run --rm -v ghost:/var/lib/ghost/content -v ~/backup:/backup ubuntu bash -c "cd /var/lib/ghost/content && tar cvzf /backup/ghost.tar.gz ."

Denken Sie daran, dass die obigen Sicherungsbefehle auf externen Volumes basieren, die ursprünglich manuell erstellt wurden. Für generische Volumes, die von Docker Compose erstellt und verwaltet werden, würden die tatsächlichen Volume-Namen stattdessen ghost_ghost lauten und ghost_ghostdb bzw. Zum Beispiel für ghost_ghostdb , der ghost Präfix bezieht sich auf den Namen Ihres Anwendungsverzeichnisses, in dem sich Ihre Docker Compose-Konfigurationsdateien und ghostdb befinden bezieht sich auf den Volume-Namen, den Sie in Ihrer Docker Compose-Konfiguration festgelegt haben.

Sicherungseinstellungen mit oder ohne Bind-Mounts

Beachten Sie auch, dass Sie das Ghost-Docker-Compose-Verzeichnis archivieren müssen, unabhängig davon, ob Sie Bind-Mounts oder benannte Volumes verwenden, da Ihre Konfigurationsdateien hier gespeichert sind.

Falls Sie Bind-Mounts und nicht benannte Docker-Volumes verwenden, wird das gesamte Verzeichnis einschließlich der Bind-Mounts archiviert. Hier nenne ich es ghost-docker-compose.tar.gz um Verwirrung zu vermeiden:

[email protected]:~/ghost$ sudo tar cvzf ~/backup/ghost-docker-compose.tar.gz .

Bind-gemountete Volumes benötigen keinen separaten Volume-Abschnitt in einer Docker Compose-Datei. Sie möchten nur Folgendes, wenn es innerhalb des Dienstes definiert wird:

    ghost:
        volumes:
            - ./ghost:/var/lib/ghost/content

In ähnlicher Weise würde das durch Bind bereitgestellte Datenbank-Volume folgendermaßen aussehen:

    ghostdb:
        volumes:
            - ./ghostdb:/var/lib/mysql

"./" gibt das bind-gemountete Verzeichnis innerhalb desselben Geisterverzeichnisses an, in das wir gerade "cd"d haben. Daher erstellen Sie in diesem Fall eine vollständige Sicherung aller Dateien (einschließlich Volumes und Konfigurationsdateien).

Backup-Bind-Mounts wie benannte Volumes sichern

Alternativ können Sie die Bind-Mounts auch einzeln sichern. Dadurch haben Sie die Möglichkeit zu wählen, ob Ihr neuer Server eine Bind-Mounted- oder eine Named-Volume-Konfiguration auf Docker haben soll. Der Grund dafür ist, dass die Archive auf die gleiche Weise wie oben beschriebene benannte Volumes gesichert werden. Dazu müssen Sie nacheinander in die Anwendungs- und Datenbankverzeichnisse (bind mounts) wechseln.

cd ~/ghost/ghost
sudo tar cvzf ~/backup/ghost.tar.gz .
cd ~/ghost/ghostdb
sudo tar cvzf ~/backup/ghostdb.tar.gz .

Sowohl Bind-Mounts als auch benannte Volumes haben ihre eigenen Vor- und Nachteile. Die Frage, welche davon am besten geeignet ist, variiert von Anwendung zu Anwendung. Beispielsweise schlagen Nextcloud-Entwickler benannte Volumes vor, während Rocket.Chat-Entwickler Bind-Mounts vorschlagen.

Fahren Sie fort, es ist an der Zeit, dass Sie diese Archive an Ihrem Ende abrufen.

Laden Sie die Archive mit sftp auf Ihr lokales System herunter

Mit sftp können Sie Ihre Archive sofort in Ihr lokales System herunterladen. Hier verwende ich Port 4480 und IP 12.3.1.4 als Beispiel. Es bezieht sich auf denselben Port, der von ssh verwendet wird.

[email protected]:~$ sftp -oPort=4480 [email protected]
Connected to 12.3.1.4.
sftp> get /home/avimanyu/backup/ghost.tar.gz /home/user/Downloads
Fetching /home/avimanyu/backup/ghost.tar.gz to /home/user/Downloads/ghost.tar.gz
/home/avimanyu/backup/ghost.tar.gz                                                                                                                                                                                                                                                         100%  233MB   6.9MB/s   00:34    
sftp> get /home/avimanyu/backup/ghostdb.tar.gz /home/user/Downloads
Fetching /home/avimanyu/backup/ghostdb.tar.gz to /home/user/Downloads/ghostdb.tar.gz
/home/avimanyu/backup/ghostdb.tar.gz                                                                                                                                                                                                                                                       100%   26MB   6.5MB/s   00:03  
sftp> get /home/avimanyu/backup/ghost-docker-compose.tar.gz /home/user/Downloads
Fetching /home/avimanyu/backup/ghost-docker-compose.tar.gz to /home/user/Downloads/ghost-docker-compose.tar.gz
/home/avimanyu/backup/ghost-docker-compose.tar.gz                                                                                                                                                                                                                                          100%  880     6.0KB/s   00:00
sftp> exit
[email protected]:~$

Wie Sie hier sehen können, wird der get Befehl auf sftp ist verdammt viel schneller als rsync oder scp . Einmal der Download abgeschlossen ist, wird Ihnen die sftp-Eingabeaufforderung angezeigt, wo Sie exit eingeben können und verlassen Sie die sftp-Konsole. Die heruntergeladenen Dateien wären unter /home/user/Downloads verfügbar .

An dieser Stelle können Sie sagen, dass Sie eine vollständige Sicherung Ihrer Docker-Anwendung erstellt haben.

Aber wie ich noch einmal sagen muss, es nützt nichts, wenn Sie es nicht wiederherstellen können.

Wiederherstellungsverfahren

Nachdem Sie nun wissen, wie man eine Sicherung durchführt, ist es an der Zeit, sich anzusehen, wie man aus einer Sicherung wiederherstellt.

Erstellen Sie einen neuen Server in der Cloud

Erstellen Sie einen frischen neuen Server aus Ihrem Cloud-Service-Dashboard. Ich habe dies in unserem Backup-Bereich besprochen. Auf Linode sieht es so aus:

Es wird empfohlen, die Serverspezifikationen dieselben wie die des ursprünglichen Servers zu lassen, von dem die Archive gesichert wurden (oben erwähnt).

Backup-Archive auf neuen Server hochladen

Angenommen, Sie können sich jetzt basierend auf Ihren gespeicherten ssh-Einstellungen bei Ihrem Cloud-Dienstanbieter beim neuen Server anmelden, laden Sie die Dateien mit put von sftp auf den Server hoch Befehl:

[email protected]:~$ sftp -oPort=4480 [email protected]
Connected to 12.3.1.5.
sftp> put /home/user/Downloads/ghostdb.tar.gz /home/avimanyu
Uploading /home/user/Downloads/ghostdb.tar.gz to /home/avimanyu/ghostdb.tar.gz
/home/iborg/Downloads/ghostdb.tar.gz                                                                                                                                                                                                                                                       100%   26MB   6.2MB/s   00:04    
sftp> put /home/user/Downloads/ghost.tar.gz /home/avimanyu
Uploading /home/user/Downloads/ghost.tar.gz to /home/avimanyu/ghost.tar.gz
/home/iborg/Downloads/ghost.tar.gz                                                                                                                                                                                                                                                         100%  233MB   7.2MB/s   00:32  
sftp> put /home/user/Downloads/ghost-docker-compose.tar.gz /home/avimanyu
Uploading /home/user/Downloads/ghost-docker-compose.tar.gz to /home/avimanyu/ghost-docker-compose.tar.gz
/home/iborg/Downloads/ghost-docker-compose.tar.gz                                                                                                                                                                                                                                          100%  880    22.6KB/s   00:00 
sftp> exit
[email protected]:~$ 

Wenn Sie zum Hochladen lieber eine GUI verwenden, können Sie immer noch FileZilla verwenden.

Einstellungen und Volumes wiederherstellen

Stellen Sie zunächst das Docker-Compose-Verzeichnis Ihrer Ghost-Konfiguration wieder her.

mkdir ghost
cd ghost
sudo tar xvf ~/backup/ghost-docker-compose.tar.gz

Alternativ können Sie auch versuchen, mit --same-owner den Benutzerbesitz wiederherzustellen (Berechtigungen werden bereits beibehalten), was beim Wiederherstellen von bind-gemounteten Verzeichnissen (bereits in den Archiven vorhanden) hilfreich sein kann :

sudo tar --same-owner -xvf ~/backup/ghost-docker-compose.tar.gz

Falls Sie sich für die Verwaltung der neuen Volumes auf Docker Compose verlassen möchten, erstellen Sie diese zuerst. Gemäß unserer Diskussion im obigen Abschnitt „Backup-Volumes“ müssten Sie offensichtlich die notwendigen Namenskonventionen einhalten:

docker volume create ghost_ghost
docker volume create ghost_ghostdb

Wenn Sie sie in Ihrer Docker Compose-Konfiguration als extern festlegen möchten, müssen die Namen unterschiedlich sein (überarbeiten Sie die beiden obigen Befehle):

docker volume create ghost
docker volume create ghostdb

So stellen Sie das MariaDB-Volume für Ghost wieder her:

docker run --rm -v ghostdb:/restore -v ~/backup:/backup ubuntu bash -c "cd /restore && tar xvf /backup/ghostdb.tar.gz"

So stellen Sie das Ghost-Volume selbst wieder her:

docker run --rm -v ghost:/restore -v ~/backup:/backup ubuntu bash -c "cd /restore && tar xvf /backup/ghost.tar.gz"

Stellen Sie sicher, dass die DNS-Einstellungen basierend auf der neuen IP wiederhergestellt werden

Da Sie einen neuen Server verwenden, hat sich die IP definitiv geändert und muss daher für Ihre Domain überarbeitet werden. Sie können diese Voraussetzungen für den Nginx-Reverse-Proxy-Docker als Referenz überprüfen, wo sie besprochen wurden.

Starten Sie neue Container mit den erforderlichen Einstellungen und wiederhergestellten Volumes

Starten Sie nun die Konfiguration auf dem neuen Server neu:

docker-compose up -d

Wenn Sie alle obigen Anweisungen gewissenhaft befolgen, haben Sie jetzt eine vollständig wiederhergestellte Docker-Webanwendung, die auf Ihrer Sicherung basiert.

Zerstöre den Klon

Sobald Sie sicher sind, dass Ihr Ziel erreicht ist, ist es nicht mehr erforderlich, den Klon zu haben, es sei denn, Sie möchten ihn zum Testen behalten. Wenn Sie es also nicht mehr möchten, löschen Sie bitte die Linode (DOPPELT PRÜFEN!):

Abschließende Gedanken

Es gibt bereits viele Lösungen, die partiell und portionsweise auf solche Verfahren zurückgreifen. Aber das erfordert Ausfallzeiten, weil die Container angehalten werden müssen. Diese Herausforderung wird gemeistert, indem Cloud-Sicherungen von Produktionsklonen und nicht von den Produktionsservern selbst verwendet werden.

Anstatt einen 24/7 zusätzlichen Server als Cluster für Backups ohne Ausfallzeiten zu verwenden, verwenden wir derzeit nur einen, um dies zu gewährleisten. Dies ermöglicht bessere FinOps.

Wenn Sie es vorziehen, eine GUI zum Herunterladen oder Hochladen Ihrer Backups zu verwenden, können Sie sftp verwenden über FileZilla.

Da Sie die Dateien auf einem geklonten Server und nicht auf dem Produktionsserver selbst sichern, sparen Sie wertvolle Betriebszeit und vermeiden unerwartete Schluckaufe, die während des Vorgangs auftreten können. Ganz ehrlich, Sie können völlig unbeschwert daran herumtüfteln, weil Sie den Produktionsserver nicht anfassen;)

Ich kann nicht leugnen, dass der gesamte Prozess ziemlich umfassend ist, aber er kümmert sich sicher um unser Ziel. Darüber hinaus könnte dieser Vorgang mit einer sorgfältigen Synchronisation zwischen der Cloud und Ihrem lokalen System in Zukunft auch vollständig automatisiert werden.

Wenn Sie weitere Vorschläge zur Docker-Sicherung und -Wiederherstellung ohne Ausfallzeiten haben, teilen Sie uns bitte Ihre Gedanken im folgenden Abschnitt mit. Jedes andere Feedback oder Kommentare sind sehr willkommen.


Docker
  1. So installieren Sie Docker und führen Docker-Container in Ubuntu aus

  2. Leitfaden für das Upgrade auf MongoDB 5.0 und Rocket.Chat 4.0 auf Docker

  3. CloudBerry – Perfektes plattformübergreifendes Cloud-Backup für Einzelpersonen und IT-Profis

  4. 3-2-1 Backup-Regel für die Cloud

  5. So sichern und wiederherstellen Sie Docker-Container

Verwenden von drush für die Sicherung/Wiederherstellung und Migration von Drupal-Sites

So sichern und wiederherstellen Sie eine SD-Karte für Raspberry Pi

Stellen Sie NGINX auf Docker bereit und erhöhen Sie die Serverkapazitäten

So überprüfen Sie die Speicherplatznutzung für Docker-Images, Container und Volumes

Vollständige Anleitung zum Entfernen von Docker-Images

Docker-Befehle zum Verwalten des Containerlebenszyklus (Definitive Guide)