Suchen von Datenmengen in Docker Desktop (Windows)


78

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

Ich verwende Docker Desktop für Windows . (Windows 10)

In den Dokumenten heißt es, dass Sie durch Ausführen von Docker Inspect für das Objekt die Quelle erhalten: 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": ""
    }
]

Allerdings sehe ich 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. Befindet es sich auf meinem Host-Computer? Wenn ja, wie kann ich den Weg dorthin finden?


Haben Sie die Lösung gefunden, um zu sehen, wo sie "tatsächlich" gespeichert sind? In der Docker-Toolbox ist es sehr einfach zu überprüfen, wir können uns bei der Docker-Maschine anmelden und überprüfen. Ich habe jedoch noch keine Möglichkeit gefunden, zu überprüfen, wo diese Volumes im Fall von Docker Desktop
Nag

Siehe die akzeptierte Antwort
Brad

Antworten:


60

Ihr Volume-Verzeichnis ist /var/lib/docker/volumes/blog_postgres-data/_dataund wird /var/lib/dockernormalerweise in gemountet C:\Users\Public\Documents\Hyper-V\Virtual hard disks. Wie auch immer, Sie können es überprüfen, indem Sie in den Docker-Einstellungen nachsehen.

In diesen Dokumenten finden Sie Informationen zum Freigeben von Laufwerken für Docker unter Windows.

Übrigens Sourceist der Speicherort auf dem Host und Destinationder Speicherort 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 Neugierde hier ist, dass das Teilen von Bildern usw. großartig ist, aber wie teile ich meine Daten?

Eigentlich volumeist für diesen Zweck konzipiert (Daten im Docker-Container verwalten). Die Daten in einem Volume bleiben auf dem Host-FS erhalten und sind vom Lebenszyklus eines Docker-Containers / Images isoliert. Sie können Ihre Daten in einem Volume freigeben, indem Sie:

  • Hängen Sie das Docker-Volume zum Hosten ein und verwenden Sie es erneut

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

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

  • Erstellen und Mounten eines Datencontainers.

    Erstellen Sie einen Datencontainer: docker create -v /dbdata --name dbstore training/postgres /bin/true

    Führen Sie andere Container basierend auf diesem Container mit --volumes-from: aus docker run -d --volumes-from dbstore --name db1 training/postgres. Dann db1bleiben alle von generierten Daten im Container-Volume erhalten dbstore.

Weitere Informationen finden Sie in den offiziellen Docker-Volumendokumenten .

Einfach ausgedrückt volumesist es nur ein Verzeichnis auf Ihrem Host mit all Ihren Containerdaten, sodass Sie jede Methode verwenden können, die Sie zuvor zum Sichern / Freigeben Ihrer Daten verwendet haben.

Kann ich ein Volume wie bei Bildern an Docker-Hub senden?

Nein. Ein Docker- Image können Sie an einen Docker-Hub (auch als "Registrierung" bezeichnet) senden. aber Daten sind nicht. Sie können Ihre Daten mit einer beliebigen Methode sichern / beibehalten / freigeben, aber es macht keinen Sinn, Daten in eine Docker-Registrierung zu übertragen, um sie freizugeben.

Kann ich Backups usw. erstellen?

Ja, wie oben gepostet :-)


Ok, die Quelle /var/lib/docker/volumes/blog_postgres-data/_dataist der Linux VM Docker, auf dem ausgeführt wird. Meine größte Neugierde hier ist, dass das Teilen von Bildern usw. großartig ist, aber wie teile ich meine Daten? Kann ich ein Volume wie bei Bildern an Docker-Hub senden? Kann ich Backups usw. erstellen?
Brad

@Brad, ich habe meine Antwort auf Ihre Fragen aktualisiert, weil Kommentar nicht genug ist, hoffe, es könnte hilfreich für Sie sein :-)
shizhz

@Brad Sie können das gleiche benannte Volume in mehreren Containern bereitstellen. So docker run -it --rm -v blog_postgres-data:/data busybox ls -l /datawerden diese Daten angezeigt.
BMitch

3
Das Verzeichnis "C: \ Benutzer \ Öffentlich \ Dokumente \ Hyper-V \ Virtuelle Festplatten" ist leer (Wondows 10 Enterprise)
Leos Literak

Aber dbstore wird beendet. Wie kann ich die Daten anzeigen / herunterladen?
Sushil

15

Ich bin unter Windows + WSL 2 (Ubuntu 18.04). Ich habe meine Docker-Volumes an diesem Speicherort gefunden. Geben Sie den Windows-Datei-Explorer ein:

\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\

Sie haben ein Verzeichnis pro Volume.


2
Danke, ich habe fast zwei Stunden nach der Antwort gesucht :)) Ich habe meinen Tag gerettet.
İbrahim Sakacı

2
Heilige Mutter, ich kann nicht glauben, wie lange es gedauert hat, bis ich Ihre Antwort und die Lösung gefunden habe. Ich habe an einer lächerlichen Anzahl von Stellen gesucht. Ich denke, das ist eine brandneue Sache. Vielen Dank.
Sarel Botha

1
Vielen Dank! Dies war auch nach 2 Jahren ein Lebensretter. Ich schreibe diesen Kommentar im Jahr 2020 :-)
29 ΝιΓΞΗΛψΚ

13

Wenn Sie Linux-basierte Container auf einem Windows-Host ausführen, werden die tatsächlichen Volumes in der Linux-VM gespeichert und sind nicht auf den fs des Hosts verfügbar. Andernfalls werden Windows unter Windows ausgeführt => C: \ ProgramData \ Docker \ Volumes \

Außerdem docker inspect <container_id>wird die Containerkonfiguration aufgelistet. Weitere Informationen zur Persistenzschicht finden Sie im Abschnitt Mounts.

Update: Gilt nicht für Docker, das unter WSL ausgeführt wird .


1
Ihre Antwort ist richtig. "Wenn Sie Linux-basierte Container auf einem Windows-Host ausführen, werden die tatsächlichen Volumes in der Linux-VM gespeichert und sind nicht auf der fs des Hosts verfügbar." Ich konnte keine Elemente in "C: \ Users \ Public \" finden. Ordner "Dokumente \ Hyper-V \ Virtuelle Festplatten".
theeranitp

Und es scheint, dass Docker Desktop sehr bereit ist, diese VM einfach wegzublasen. Zum Beispiel habe ich versucht, etwas in der JSON-Datei unter Docker Desktop> Einstellungen> Docker Engine zu ändern, und es war anscheinend ungültig. Nachdem Docker Desktop einige Male versucht hatte, neu zu starten, habe ich zufällig in Hyper-V Manager zugesehen und gerade die VM gelöscht.
Aaron Axvig

4

Wenn Sie wsl2 aktiviert haben, finden Sie es im Datei-Explorer unter \\wsl$\docker-desktop\mnt\host\wsl\docker-desktop-data\data\docker


2

Das Mounten von NTFS-basierten Verzeichnissen funktionierte für meinen Zweck nicht (MongoDB - soweit mir bekannt ist, gilt dies zumindest auch für Redis und CouchDB): NTFS-Berechtigungen ermöglichten keinen erforderlichen Zugriff für solche DBs, die in Containern ausgeführt wurden. Das Folgende ist ein Setup mit benannten Volumes in 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 öffentlichem Schlüssel zwischen Host und Container zur 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 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 user@localhost:/data/mongodb [target-dir within /c/]
  #upload (all mongo data): scp -r -P 2222 [source-dir within /c/] user@localhost:/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 hat nichts damit zu tun, 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, sodass 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

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 so bereitstellen, dass Host und Container dieselben Daten sehen (wie im Docker-Lauf -v hostFolder: containerFolder).

Die erste Ausgabe, die Sie gedruckt haben, beschreibt ein solches gemountetes Volume (daher Mounts), bei dem "/var/lib/docker/volumes/fac362...80535/_data" (Host) in "/ webapp" (Container) gemountet ist.

Ich gehe davon aus, dass Sie -v nicht verwendet haben, 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 (Docker -rm) entfernen. Daher ist es möglicherweise eine gute Idee, den Ordner bereitzustellen.

Zu der Frage, wo Sie über Windows auf diese Daten zugreifen können. Soweit ich weiß, verwendet Docker für Windows das Bash-Subsystem in Windows 10. Ich würde versuchen, Bash für Windows 10 auszuführen und in diesen Ordner zu wechseln oder herauszufinden, wie Sie von Windows 10 aus auf die Linux-Ordner zugreifen können. Auf dieser Seite finden Sie häufig gestellte Fragen das Linux-Subsystem in Windows 10.

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


3
Mir ist klar, dass dies ein paar Jahre alt ist, aber es ist wahrscheinlich erwähnenswert, dass Docker für Windows derzeit kein Windows-Subsystem für Linux verwendet. Stattdessen wird Moby Linux in HyperV ausgeführt.
Alastair

1

Ich habe festgestellt, dass mein Docker-Setup mit WSL 2 (Ubuntu 20.04) diesen Speicherort verwendet:

C:\Users\UserName\AppData\Local\Docker\wsl\data\ext4.vhdx

Wo UserNameist dein Benutzername?


0

Wenn Sie unter Windows arbeiten und Docker für Windows verwenden, funktioniert Docker über VM (MobyLinuxVM). Ihre Volumes (wie auch immer) befinden sich in dieser VM! So finden Sie sie:

# get a privileged container with access to Docker daemon
docker run --privileged -it --rm -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker alpine sh

# in second power-shell run a container with full root access to MobyLinuxVM
docker run --net=host --ipc=host --uts=host --pid=host -it --security-opt=seccomp=unconfined --privileged --rm -v /:/host alpine /bin/sh

# switch to host FS
chroot /host

# and then go to the volume you asked for
cd /var/lib/docker/volumes/YOUR_VOLUME_NAME/_data
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.