2016-07-11 11 views
13

Ich bin ein wenig verwirrt mit der Funktionalität der benannten Volumes in einem Docker komponieren Datei speziell, wenn es um die Sicherung/Wiederherstellung meiner App kommt.Wie sollte ich Docker benannten Volumes sichern und wiederherstellen

Ich teste eigentlich diese dockercompose Datei:

 version: '2' 
     services: 
      django: 
       build: 
        context: "{{ build_dir }}/docker/django" 
       depends_on: 
        - db 
       environment: 
        [...] 
       volumes: 
        - code:/data/code 
        - www:/var/www 
        - conf:/data/conf 
       networks: 
        - front 
        - db 
       expose: 
        - "8080" 
       entrypoint: "/init" 
      db: 
       build: 
        context: "{{ build_dir }}/docker/postgres" 
       environment: 
        [...] 
       volumes: 
        - data:/var/lib/postgresql/data 
       networks: 
        - db 

     volumes: 
      data: 
      www: 
      code: 
      conf: 

     networks: 
      front: 
       external: 
        name: "proxy_nw" 

Da die Dokumentation sagte, habe ich versucht, den Namen Volumen zu verwenden, anstatt Daten nur Container. Aber wie soll ich meine Daten sichern?

Mit einem Daten nur Container hätte ich eine docker run --rm --volume-from DOC backup_container save getan, die wirklich einfach ist.

Jetzt lese ich in this topic, dass ich etwas wie docker run --rm --volume data --volume www --volume code --volume conf backup_container save verwenden sollte. Dies ist nicht so einfach, da ich viele Anwendungen mit unterschiedlichen Typen und Namen von Volumes habe, was bedeutet, dass mein Befehl zum Speichern meiner Daten für jede Anwendung anders sein muss. Es kompliziert den Automatisierungsprozess.

Bearbeiten: Eigentlich ist diese Syntax docker run --volume data --volume www container_image my_command nicht korrekt. Es benötigt den Mountpoint innerhalb des Containers, also wäre es docker run --volume data:/somewhere --volume www:/somewhereelse container_image my_command. So ist es noch komplizierter, mit einem Backup-Container zu verwenden.

Also, was sind die besten Praktiken in diesem Fall? Sollte ich nur ein benanntes Volume für alle meine Container verwenden?

+0

Eigentlich alles in der gleichen Lautstärke zu montieren macht keinen Sinn, da alles in der Lautstärke versaut wird (es war gestern spät). – Plup

Antwort

25

Eigentlich sollte es genauso gemacht werden, wie in der offiziellen Dokumentation geschrieben.Datenvolumenbehälter speichert es Daten in "virtual root", so sollten Sie ein Backup mit dem nächsten Befehl:

docker run --rm \ 
    --volume [DOCKER_COMPOSE_PREFIX]_[VOLUME_NAME]:/[TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA] \ 
    --volume $(pwd):/[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE] \ 
    ubuntu \ 
    tar cvf /[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE]/[BACKUP_FILENAME].tar /[TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA] 

wo:

  • --rm bedeutet, dass das Bild für diesen Lauf-Befehl erstellt werden bereinigt werden
  • DOCKER_COMPOSE_PREFIX in Verzug ist Ihr Projektverzeichnis Name
  • VOLUME_NAME ist das Datenvolumen Containername aus compose Datei
  • TEMPORARY_DIRECTORY_TO_STORE_VOLUME_DATA ein Verzeichnis ist Ihre Volumendaten
  • TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE ist ein Verzeichnis, praktisch in Ihr aktuelles Verzeichnis abgebildet zu montieren, in dem die Sicherung abgelegt wird
  • BACKUP_FILENAME - ein Name der Sicherungsdatei (Sie es in aktuellem Verzeichnis)
  • ubuntu - Sie können Bildtyp mit Teer in einem anderen Behälter ändern :)

Get Daten zurück in das Volumen (Wiederherstellung):

docker run --rm \ 
    --volume [DOCKER_COMPOSE_PREFIX]_[VOLUME_NAME]:/[TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP] \ 
    --volume $(pwd):/[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE] \ 
    ubuntu \ 
    tar xvf /[TEMPORARY_DIRECTORY_TO_STORE_BACKUP_FILE]/[BACKUP_FILENAME].tar -C /[TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP] --strip 1 

wo:

  • TEMPORARY_DIRECTORY_STORING_EXTRACTED_BACKUP ein Verzeichnis, in dem die extrahierten Dateien kopiert werden (diese mit verknüpft ist das Volumen und wird daher dazu schreiben)
  • -C - sagen t ar, wo der Inhalt zu extrahieren ist
  • - Streifen 1 - entfernen führende Pfadelemente (z. das übergeordnete Verzeichnis, wenn sich der Sicherungsinhalt in einem Ordner/temp oder ähnlichem befindet)
+4

Aus irgendeinem Grund wurde das aus der offiziellen Dokumentation entfernt, irgendeine Idee warum? –

+0

Dies ist die beste Lösung, die ich gefunden habe, aber es ist wichtig zu wissen, dass die Berechtigungen für den Datenzugriff von Container zu Container geändert werden können, wenn benutzerdefinierte (nicht root) Benutzer in den Containern verwendet werden. Sei vorsichtig damit. –

0

Endlich habe ich meinen Ansatz geändert. Ich analysiere die Volumes meiner Container nach den Mountpoints und speichere alles in einem separaten Ordner im tar.

Also verwende ich keinen Container, um es zu tun, sondern ein externes Skript. Ich weiß nicht, ob es ein besserer Ansatz ist, aber es funktioniert gut.