it-swarm.com.de

Datenvolumen in Docker suchen

Ich versuche gerade, Docker zu lernen, und ich bin verwirrt darüber, wo Datenvolumen tatsächlich vorhanden sind.

Ich benutze Docker für Windows. (Windows 10)

In den Dokumenten heißt es, dass das Ausführen der Docker-Inspektion des Objekts die Quelle angibt: https://docs.docker.com/engine/tutorials/dockervolumes/#locating-a-volume

$ docker inspect web

"Mounts": [
    {
        "Name": "fac362...80535",
        "Source": "/var/lib/docker/volumes/fac362...80535/_data",
        "Destination": "/webapp",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
]

aber ich sehe das nicht, ich bekomme folgendes:

$ docker inspect blog_postgres-data
[
    {
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/blog_postgres-data/_data",
        "Name": "blog_postgres-data",
        "Options": {},
        "Scope": "local"
    }
]

Kann mir jemand helfen? Ich möchte nur wissen, wo mein Datenvolumen tatsächlich vorhanden ist. Ist es auf meinem Host-Computer? Wenn ja, wie kann ich den Weg dazu finden?

Vielen Dank

18
Brad

Ihr Volume-Verzeichnis ist /var/lib/docker/volumes/blog_postgres-data/_data, und /var/lib/docker ist normalerweise auf C:\Users\Public\Documents\Hyper-V\Virtual hard disks gemountet. Sie können es aber auch in den Docker-Einstellungen überprüfen.

In this docs finden Sie Informationen zum Freigeben von Laufwerken mit Docker unter Windows.

Übrigens ist Source der Ort auf dem Host und Destination der Ort innerhalb des Containers in der folgenden Ausgabe:

"Mounts": [
{
    "Name": "fac362...80535",
    "Source": "/var/lib/docker/volumes/fac362...80535/_data",
    "Destination": "/webapp",
    "Driver": "local",
    "Mode": "",
    "RW": true,
    "Propagation": ""
}
]

================================================== ===========================

Aktualisiert, um Fragen im Kommentar zu beantworten:

Meine größte Neugier hier ist, dass das Teilen von Bildern usw. großartig ist, aber wie kann ich meine Daten freigeben?

Eigentlich ist volume für diesen Zweck konzipiert (Daten im Docker-Container verwalten), die Daten im Volume werden auf dem Host FS gespeichert und mit dem Lebenszyklus des Docker-Containers/Image isoliert. Sie können Ihre Daten mit Volumen teilen, indem Sie:

  • Hängen Sie das Docker-Volume in den Host ein und verwenden Sie es erneut

    docker run -v /path/on/Host:/path/inside/container image

    Dann bleiben alle Ihre Daten in /path/on/Host erhalten. Sie können sie sichern, auf einen anderen Computer kopieren und den Container mit demselben Volume erneut ausführen. 

  • Erstellen Sie einen Datencontainer und hängen Sie ihn an.

    Erstellen Sie einen Datencontainer: docker create -v /dbdata --name dbstore training/postgres /bin/trueFühren Sie einen anderen Container basierend auf diesem Container mit --volumes-from: docker run -d --volumes-from dbstore --name db1 training/postgres aus. Alle von db1 generierten Daten bleiben im Volume des Containers dbstore erhalten.

Weitere Informationen finden Sie in official docs der Docker-Volumes . Einfach gesagt, volumes ist nur ein Verzeichnis auf Ihrem Host mit allen Containerdaten. Sie können daher alle Methoden verwenden, die Sie zuvor zum Sichern/Freigeben Ihrer Daten verwendet haben.

kann ich ein Volume auf einen Docker-Hub verschieben, so wie ich es mit Bildern mache?

Nein, Docker-Image ist etwas, das Sie liefern, Daten jedoch nicht. Sie können Ihre Daten mit jeder beliebigen Methode sichern/persistieren/freigeben. Es ist jedoch nicht sinnvoll, Daten an die Docker-Registrierung zu übergeben, um sie zu teilen.

kann ich Backups erstellen?

Ja, wie oben geschrieben :-)

18
shizhz

Das Mounten von NTFS-basierten Verzeichnissen hat für meinen Zweck nicht funktioniert (MongoDB - soweit mir bekannt ist, gilt dies zumindest auch für Redis und CouchDB): NTFS-Berechtigungen ermöglichten nicht den erforderlichen Zugriff für solche DBs, die in Containern ausgeführt werden. Das Folgende ist ein Setup mit benannten Volumes auf HyperV.

Der folgende Ansatz startet einen ssh-Server innerhalb eines Dienstes, der mit docker-compse so eingerichtet wird, dass er automatisch gestartet wird und die Verschlüsselung mit öffentlichen Schlüsseln zwischen Host und Container für die Autorisierung verwendet. Auf diese Weise können Daten über scp oder sftp hochgeladen/heruntergeladen werden.

Die vollständige Datei docker-compose.yml für eine Webanwendung + Mongodb sowie eine Dokumentation zur Verwendung des SSH-Dienstes finden Sie weiter unten:

version: '3'
services:
  foo:
    build: .
    image: localhost.localdomain/${repository_name}:${tag}
    container_name: ${container_name}
    ports:
      - "3333:3333"
    links:
      - mongodb-foo
    depends_on:
      - mongodb-foo
      - sshd
    volumes:
      - "${Host_log_directory}:/var/log/app"

  mongodb-foo:
    container_name: mongodb-${repository_name}
    image: "mongo:3.4-jessie"
    volumes:
      - mongodata-foo:/data/db
    expose:
      - '27017'

  #since mongo data on Windows only works within HyperV virtual disk (as of 2019-4-3), the following allows upload/download of mongo data
  #setup: you need to copy your ~/.ssh/id_rsa.pub into $DOCKER_DATA_DIR/.ssh/id_rsa.pub, then run this service again
  #download (all mongo data): scp -r -P 2222 [email protected]:/data/mongodb [target-dir within /c/]
  #upload (all mongo data): scp -r -P 2222 [source-dir within /c/] [email protected]:/data/mongodb
  sshd:
    image: maltyxx/sshd
    volumes:
        - mongodata-foo:/data/mongodb
        - $DOCKER_DATA_DIR/.ssh/id_rsa.pub:/home/user/.ssh/keys/id_rsa.pub:ro
    ports:
        - "2222:22"
    command: user::1001

#please note: using a named volume like this for mongo is necessary on Windows rather than mounting an NTFS directory.
#mongodb (and probably most other databases) are not compatible with windows native data directories due ot permissions issues.
#this means that there is no direct access to this data, it needs to be dumped elsewhere if you want to reimport something.
#it will however be persisted as long as you don't delete the HyperV virtual drive that docker Host is using.
#on Linux and Docker for Mac it is not an issue, named volumes are directly accessible from Host.
volumes:
  mongodata-foo:

dies ist nicht verwandt, aber für ein voll funktionsfähiges Beispiel muss vor jedem Docker-Compose-Aufruf das folgende Skript ausgeführt werden:

#!/usr/bin/env bash
set -o errexit
set -o pipefail
set -o nounset

working_directory="$(pwd)"
Host_repo_dir="${working_directory}"
repository_name="$(basename ${working_directory})"
branch_name="$(git rev-parse --abbrev-ref HEAD)"
container_name="${repository_name}-${branch_name}"
Host_log_directory="${DOCKER_DATA_DIR}/log/${repository_name}"
tag="${branch_name}"

export Host_repo_dir
export repository_name
export container_name
export tag
export Host_log_directory

Update : Bitte beachten Sie, dass Sie heutzutage auch nur docker cp verwenden können, so dass der oben beschriebene sshd-Container wahrscheinlich nicht mehr erforderlich ist , es sei denn, Sie benötigen Remotezugriff auf das Dateisystem, das in einem Container unter einem Windows-Host ausgeführt wird.

1
Michel Müller

Jeder Container verfügt über ein eigenes Dateisystem, das vom Host-Dateisystem unabhängig ist. Wenn Sie Ihren Container mit dem Flag -v ausführen, können Sie Volumes einhängen, sodass der Host und der Container dieselben Daten sehen (wie im Docker-Run -v hostFolder: containerFolder). 

Die erste Ausgabe, die Sie gedruckt haben, beschreibt ein solches eingehängtes Volume (daher Mounts), bei dem "/var/lib/docker/volumes/fac362...80535/_data" (Host) an "/ webapp" (Container) angehängt ist.

Ich nehme an, Sie haben -v nicht verwendet, daher ist der Ordner nicht gemountet und nur im Container-Dateisystem zugänglich, das Sie unter "/ var/lib/docker/volume/blog_postgres-data/_data" finden. Diese Daten werden gelöscht, wenn Sie den Container entfernen (Docker -rm). Daher kann es sinnvoll sein, den Ordner bereitzustellen.

Die Frage, wo Sie von Windows aus auf diese Daten zugreifen können. Soweit ich weiß, verwendet docker for windows das bash-Subsystem in Windows 10. Ich würde versuchen, bash für windows10 auszuführen und in diesen Ordner zu gehen oder herauszufinden, wie auf die Linux-Ordner von Windows 10 aus zugegriffen werden kann. Diese page für ein FAQ auf dem Linux-Subsystem in Windows 10.

Update: Sie können auch docker cp verwenden, um Dateien zwischen Host und Container zu kopieren.

0
herm