Backup von mongodb: dump und restore für in docker.

Mein System: MacOS High Sierra 10.13.5 (2018), die Anleitung sollte aber auch auf den meisten Linuxmaschinen funktionieren. Über Windows kann ich leider keine Aussage machen.

Für mich stellte sich jüngst die Frage wie man eine mongodb-Datenbank aus einem Container exportiert und anschließend in einen neuen Container importiert. Hier für alle, die das auch interessiert / benötigten eine kurze Anleitung wie ich das gemacht habe, Wie immer gibt es mehrere Möglichkeiten. Ich habe mich bemüht eine Lösung zu finden, die einigermaßen einfach ist.

dump / backup der MongoDB aus docker container

Ich gehe davon aus, dass euer docker Container, der mongo beinhaltet läuft. Kümmern wir uns als erstes um das, was ihr braucht. Das sind:

  • den Namen des virtuellen Netzwerks, indem euer Container läuft
  • einen lokalen Ordner für den dump, z.B. ~/backup

Namen des virtuellen Netzwerks eines docker Container finden

container_id finden

> docker container ls

In der ersten Spalte findest du zu deinem Container die docker_id

Namen des virtuelle Netzwerks finden

Wenn ihr:

> docker inspect <container_id>

eingebt, findet ihr direkt unter “Network”, den Namen des Netzwerks. Nenne wir ihn ab jetzt <network_name>.

Dump der MongoDB aus Container

Gebt folgendes ein:

> docker run --rm --network=<network_name> --mount type=bind,src=<Pfad zu eurem Backup Folder>/backup,dst=/backup mongo bash -c 'mongodump --out /backup --host mongo:27017'

(Optional): Geht auch ohne es zu verstehen. Wer es aber verstehen will hier eine Erklärung. docker run startet einen weiteren Container. Die Option –rm stellt sicher, dass sobald der Container seine Aufgabe erfüllt hat wieder gelöscht wird. Die Option –network=<network_name> hängt den neuen temporären Container in dasselbe Netzwerk, indem sich der mongo Container befindet, von dem der dump gewünscht ist.–mount type=bind,src=<Pfad zu eurem Backup Folder>/backup,dst=/backup stellt eine Verbindung eines Backup-Folders auf eurer Maschine mit einem Ordner innerhalb des docker Containers. mongo ist der Name des Images, dass ihr für den temporären Container verwendet.  Der anschließende Befehlt: bash -c ‘mongodump –out /backup –host mongo:27017’ führt in eure Container den Bashbefehl “mongodump –out /backup –host mongo:27017” aus, der letztlich vom im virtuellen Netzwerk befindlichen mongodb Server (Option: —host mongo:27017) dessen Datenbank in den Ordner /backup dumpt (Option: –out /backup). Da der Folder /backup im Docker Container mit dem Folder <Pfad zu eurem Backup Folder> mit eurer lokalen Maschine verbunden ist, findet ihr den dump nun dort.

(Optional) Packen des Dumps:

Für den Fall, dass ihr das dump bewegen wollt, bietet sich packen an. Das geht so:

> tar -cvzf ~mongo_dump.tar.gz <Pfad zu eurem Backup Folder>

Restore der MongoDB in Container

(Optional) Entpacken des Dumps:

Solltet ihr den dump gepackt haben, so müsst ihr diesen nun entpacken. Das geht so. Zunächst müsst ihr das Archiv in den Ordner kopieren, den ihr in einen Container mounten wollte.

> cp <Pfad zu mongo_dump.tar.gz> <Pfad zu eurem Backup Folder>

Anschließend wechselt ihr in diesen Ordner:

> cd /Users/<PROFILE-FOLDER>/backup

Und entpackt den Inhalt:

> tar -xvzf learning_locker_mongo_dump.tar.gz

Und löscht nun die Kopie des Archivs:

> rm mongo_dump.tar.gz

Import des dumps

Findet zuvor analog zur Anleitung oben den Name des virtuellen Netzwerks <network_name> heraus. Einen Backup Folder mit Pfad <Pfad zu eurem Backup Folder> sollte ihr auch haben, indem sich ein entpackter dump befindet.

Gebt nun:

> docker run --rm --network=< --mount type=bind,src=/Users/<PROFILE-FOLDER>/backup,dst=/backup mongo bash -c 'mongorestore /backup --host mongo:27017'

ein.

Viel Erfolg!