Поиск томов данных в Docker Desktop (Windows)

В настоящий момент я пытаюсь изучить докер, и я не понимаю, где на самом деле существуют тома данных.

Я использую Docker Desktop для Windows. (Windows 10)

В документации говорится, что запуск docker inspect на объекте даст вам источник: 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": ""
    }
]

однако я этого не вижу, получаю следующее:

$ 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"
    }
]

Может кто-нибудь мне помочь? Я просто хочу знать, где на самом деле находится мой том данных, на моем хост-компьютере? Если да, то как я могу найти к нему путь?


person Brad    schedule 03.04.2017    source источник
comment
вы нашли решение, чтобы увидеть, где они на самом деле хранятся? В панели инструментов Docker это очень легко проверить, мы можем войти в докер-машину и проверить. Однако я еще не нашел способа проверить, где эти тома существуют в случае Docker Desktop.   -  person Nag    schedule 24.03.2020
comment
См. Принятый ответ   -  person Brad    schedule 24.03.2020


Ответы (13)


Ваш каталог тома /var/lib/docker/volumes/blog_postgres-data/_data, а /var/lib/docker обычно монтируется в C:\Users\Public\Documents\Hyper-V\Virtual hard disks. В любом случае вы можете проверить это, заглянув в настройки Docker.

Информацию о том, как делиться дисками с Докер в Windows.

Кстати, Source - это местоположение на хосте, а Destination - это местоположение внутри контейнера в следующем выводе:

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

Обновлено, чтобы ответить на вопросы в комментарии:

Мое главное любопытство здесь в том, что делиться изображениями и т. Д. - это здорово, но как мне поделиться своими данными?

Собственно volume предназначен для этой цели (управлять данными в контейнере Docker). Данные в томе сохраняются на хосте FS и изолированы от жизненного цикла контейнера / образа Docker. Вы можете поделиться своими данными в томе:

  • Подключите том Docker к хосту и используйте его повторно

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

    Тогда все ваши данные сохранятся в /path/on/host; вы можете сделать резервную копию, скопировать на другую машину и повторно запустить контейнер с тем же объемом.

  • Создайте и смонтируйте контейнер данных.

    Создайте контейнер данных: docker create -v /dbdata --name dbstore training/postgres /bin/true

    Запустите другие контейнеры на основе этого контейнера, используя --volumes-from: docker run -d --volumes-from dbstore --name db1 training/postgres, тогда все данные, сгенерированные db1, будут сохраняться в томе контейнера dbstore.

Дополнительную информацию можно найти в официальных документах по томам Docker.

Проще говоря, volumes - это просто каталог на вашем хосте со всеми данными вашего контейнера, поэтому вы можете использовать любой метод, который вы использовали раньше, для резервного копирования / обмена данными.

Могу ли я отправить том в докер-хаб, как с изображениями?

Нет. образ Docker - это то, что вы можете отправить в концентратор Docker (он же «реестр»); но данных нет. Вы можете создавать резервные копии / сохранять / делиться своими данными любым способом, который вам нравится, но отправка данных в реестр Docker для их совместного использования не имеет никакого смысла.

могу ли я делать резервные копии и т. д.?

Да, как написано выше :-)

person shizhz    schedule 03.04.2017
comment
Итак, источник /var/lib/docker/volumes/blog_postgres-data/_data - это докер Linux VM, на котором работает. Мое главное любопытство здесь в том, что делиться изображениями и т. Д. - это здорово, но как мне поделиться своими данными? Могу ли я отправить том в докер-хаб, как с изображениями? могу ли я делать резервные копии и т. д.? - person Brad; 03.04.2017
comment
@Brad, я обновил свой ответ на ваши вопросы, потому что комментария недостаточно, надеюсь, он может быть вам полезен :-) - person shizhz; 04.04.2017
comment
@Brad вы можете смонтировать том с одним и тем же именем в нескольких контейнерах. Итак, docker run -it --rm -v blog_postgres-data:/data busybox ls -l /data покажет эти данные. - person BMitch; 20.02.2019
comment
Каталог C: \ Users \ Public \ Documents \ Hyper-V \ Виртуальные жесткие диски пуст (Wondows 10 Enterprise) - person Leos Literak; 14.08.2020
comment
Но dbstore закрыт. Как просмотреть / скачать данные ?. - person sushil; 22.09.2020
comment
Каталог C: \ Users \ Public \ Documents \ Hyper-V \ Виртуальные жесткие диски для меня тоже пуст - person Gigino; 30.11.2020
comment
В конечном итоге ваш Docker управляется Hyper-V (если вы не используете WSL2). Это может быть в ProgramData \ DockerDesktop - person Wli; 15.12.2020
comment
Вы можете найти его в C: \ ProgramData \ Docker, но ProgramData - это скрытая папка. Подпапка \ volume будет содержать все, что вы можете найти через docker volume ls - person ill; 02.02.2021

Я использую Windows + WSL 2 (Ubuntu 18.04), Docker v19.03. Я нашел свои тома Docker в этом месте, введите в проводнике Windows:

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

У вас будет один каталог на том.

person mpc-DT    schedule 18.10.2020
comment
Спасибо, почти два часа искал ответ :)) День спас. - person İbrahim Sakacı; 20.10.2020
comment
Святая мать, я не могу поверить, сколько времени прошло, прежде чем я нашла твой ответ и решение. Я смотрел смешное количество мест. Я думаю, это новинка. Огромное спасибо. - person Sarel Botha; 24.10.2020
comment
благодарю вас! это была палочка-выручалочка даже через 2 года. я пишу этот комментарий в 2020 году :-) - person Dĵ ΝιΓΞΗΛψΚ; 29.10.2020
comment
Рад, что помог! - person mpc-DT; 05.12.2020
comment
В более общем плане /var/lib/docker/ соответствует \\wsl$\docker-desktop-data\version-pack-data\community\docker\ - person David; 06.12.2020
comment
Очень сбивает с толку - это было правильно и для меня. - person Pixelartist; 21.12.2020
comment
Это сработало для меня, но мне также интересно, явно ли это задокументировано где-нибудь в официальных документах. - person wlnirvana; 18.04.2021

Для Windows 10 + WSL 2 (Ubuntu 20.04), Docker version 20.10.2, build 2291f61

Артефакты Docker можно найти в

DOCKER_ARTIFACTS == \\wsl$\docker-desktop-data\version-pack-data\community\docker

Объемы данных можно найти в

введите описание изображения здесь

DOCKER_ARTIFACTS\volumes\[VOLUME_ID]\_data

введите описание изображения здесь

person craftsmannadeem    schedule 14.02.2021
comment
Спасибо за это. Я изо всех сил пытался найти правильный путь. Где вы нашли нужную папку? Большинство ответов в Интернете являются устаревшими и неточными для последней версии, указывая на пустые / несуществующие папки. - person Leônidas Villeneuve; 02.03.2021

При запуске контейнеров на основе Linux на хосте Windows фактические тома будут храниться в виртуальной машине Linux и не будут доступны на fs хоста, в противном случае окна, работающие на Windows = ›C: \ ProgramData \ Docker \ volume \

Также docker inspect <container_id> отобразит конфигурацию контейнера, в разделе «Монтирование» см. Более подробную информацию о уровне сохраняемости.

Обновление: неприменимо для Docker, работающего на WSL.

person boris    schedule 16.03.2020
comment
Ваш ответ правильный. При запуске контейнеров на основе Linux на хосте Windows фактические тома будут храниться в виртуальной машине Linux и не будут доступны на fs хоста. Я не смог найти никаких элементов в C: \ Users \ Public \ Documents \ Hyper -V \ Папка виртуальных жестких дисков. - person theeranitp; 01.06.2020
comment
И похоже, что Docker Desktop очень хочет просто уничтожить эту виртуальную машину. Например, я попытался что-то изменить в файле JSON на рабочем столе Docker ›Настройки› Docker Engine, и он оказался недействительным. После того, как Docker Desktop несколько раз пытался перезапустить, я наблюдал в диспетчере Hyper-V, и он просто удалил виртуальную машину. - person Aaron Axvig; 21.07.2020

Если у вас включен wsl2, вы можете найти его в проводнике файлов в \\wsl$\docker-desktop\mnt\host\wsl\docker-desktop-data\data\docker

person David Wild    schedule 31.08.2020

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

У меня тоже сработало (Windows 10 Home), отличный материал.

person GoldyOnline    schedule 24.03.2021

Я обнаружил, что моя установка Docker с WSL 2 (Ubuntu 20.04) использует это местоположение:

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

Где UserName - ваше имя пользователя.

person Konard    schedule 08.09.2020

вы можете найти том, связанный с хостом, по указанному ниже пути для рабочего стола Docker (Windows)

\\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes
person Waqas Ahmed    schedule 19.03.2021

В моем случае я устанавливаю docker-desktop на wsl2, windows 10 home. я нахожу свои файлы изображений в

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

Там есть контейнеры, объемы изображений.

Все файлы изображений хранятся там и разделены на несколько папок с длинными строковыми именами. Когда я заглядываю в каждую папку, я могу найти все файлы реальных изображений в папках diff.

Хотя терминал показывает путь var / lib / docker, но папка не закрывается, и фактические файлы там не хранятся. Я думаю, что ошибки нет, var / lib / docker просто связан или сопоставлен с реальной папкой, вроде этого

person Json Bourne    schedule 21.04.2021

Монтирование любых каталогов на основе NTFS не сработало для моей цели (MongoDB - насколько мне известно, это также относится, по крайней мере, к Redis и CouchDB): разрешения NTFS не позволяли необходимый доступ для таких БД, работающих в контейнерах. Ниже приведена настройка с именованными томами на HyperV.

Следующий подход запускает ssh-сервер внутри службы, настроенный с помощью docker-compse, так что он запускается автоматически и использует шифрование с открытым ключом между хостом и контейнером для авторизации. Таким образом, данные можно выгружать / скачивать через scp или sftp.

Полный файл docker-compose.yml для webapp + mongodb приведен ниже вместе с некоторой документацией по использованию службы ssh:

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:

это не имеет отношения, но для полностью рабочего примера перед любым вызовом docker-compose необходимо запустить следующий скрипт:

#!/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

Обновление: обратите внимание, что вы также можете просто использовать docker cp, поэтому описанный выше контейнер sshd, вероятно, больше не нужен, за исключением случаев, когда вам нужен удаленный доступ к файловой системе, работающей в контейнере под хостом Windows.

person Michel Müller    schedule 03.04.2019

Если вы ищете, где на самом деле находятся данные, когда вы помещаете том, указывающий на docker vm, как здесь:

version: '3.0'
services:
  mysql-server:
    image: mysql:latest
    container_name: mysql-server
    restart: always
    ports:
      - 3306:3306
    volumes:
      - /opt/docker/mysql/data:/var/lib/mysql

"/opt/docker/mysql/data" или просто / находится в \\wsl$\docker-desktop\mnt\version-pack\containers\services\docker\rootfs

Надеюсь, это поможет :)

person Zeldri    schedule 26.01.2021

Каждый контейнер имеет свою собственную файловую систему, которая не зависит от файловой системы хоста. Если вы запустите свой контейнер с флагом -v, вы можете монтировать тома, чтобы хост и контейнер видели одни и те же данные (как в docker run -v hostFolder:containerFolder).

Первый вывод, который вы напечатали, описывает такой смонтированный том (следовательно, монтируется), где /var/lib/docker/volumes/fac362...80535/_data (хост) смонтирован в /webapp (контейнер).

Я предполагаю, что вы не использовали -v, поэтому папка не смонтирована и доступна только в файловой системе контейнера, которую вы можете найти в /var/lib/docker/volumes/blog_postgres-data/_data. Эти данные будут удалены, если вы удалите контейнер (docker -rm), поэтому было бы неплохо смонтировать папку.

Что касается вопроса, где вы можете получить доступ к этим данным из окон. Насколько мне известно, docker для Windows использует подсистему bash в Windows 10. Я бы попытался запустить bash для windows10 и перейти в эту папку или узнать, как получить доступ к папкам linux из Windows 10. Отметьте это страница, где можно найти ответы на часто задаваемые вопросы о подсистеме linux в Windows 10.

Обновление: вы также можете использовать docker cp для копирования файлов между хостом и контейнером. .

person herm    schedule 03.04.2017
comment
Я понимаю, что этому уже пара лет, но, вероятно, стоит отметить, что Docker для Windows не в настоящее время использует подсистему Windows для Linux; скорее, он запускает Moby Linux внутри HyperV. - person alastair; 24.05.2019

Если вы работаете в Windows и используете Docker для Windows, тогда Docker работает через виртуальную машину (MobyLinuxVM). Ваши тома (как и все остальные) находятся в этой виртуальной машине! Вот как их найти:

# 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
person illuminates    schedule 31.10.2020