Расположение томов данных в Docker

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

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

В документах говорится, что при запуске проверки докера на объекте вам будет указан источник: https://docs.docker.com/engine/tutorials/dockervolumes/

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

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

Спасибо

19 ответов

Решение

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

Вы можете обратиться к этой документации для получения информации о том, как поделиться дисками с докером в 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 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,

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

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

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

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

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

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

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

У вас будет одна директория на каждый том.

За 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

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

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

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

\wsl$\docker-desktop-data\version-pack-data\community\docker\volume Также
работал у меня (Windows 10 Home), отличный материал.

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

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

ВWindows 11сDocker Desktop v4.15.0с включенным WSL2 путь для перехода к папке томов\\wsl.localhost\docker-desktop-data\data\docker\volumes

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

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

Если вам сложно ввести или запомнить \\wsl$, в Windows 10 версии 2004 и более поздних версиях есть более дружественный к графическому интерфейсу метод. С WSL 2 вы можете безопасно переходить ко всем специальным общим ресурсам WSL с помощью нового значка Linux в проводнике:

Оттуда вы можете перейти к (например) \docker-desktop-data\data\docker\volumes, как упоминалось в других ответах.

Дополнительные сведения см. в официальной документации Microsoft по файловым системам WSL , в которой упоминаются эти методы доступа. Для тех, кто интересуется техническими вопросами, подробное видео Microsoft должно ответить на множество вопросов.

В моем случае я устанавливаю 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" просто связан или сопоставлен с реальной папкой, вроде этого

Для себя я нашел свои тома в

      \\wsl$\docker-desktop-data\data\docker\volumes\

Использование WSL2 и Windows 21H1

Монтирование любых каталогов, основанных на 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

Если вы ищете, где на самом деле расположены данные, когда вы помещаете том, который указывает на докер «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

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

В Windows 11 просто скопируйте и вставьте следующий адрес вFile Explorer

      \\wsl.localhost\docker-desktop-data\data\docker\volumes\logger_certs\_data

Если вы используете Windows, ваши файлы докеров (в данном случае ваши тома) существуют на виртуальной машине, которую докер использует для Windows либо Hyper-V, либо WSL. Однако, если вам нужен доступ к этим файлам, вы можете скопировать файлы контейнера и сохранить их локально на своем компьютере и таким образом получить доступ к данным.

      docker cp container_Id_Here:/var/lib/mysql path_To_Your_Local_Machine_Here

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

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

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

Что касается вопроса, где вы можете получить доступ к этим данным из окон. Насколько я знаю, Docker для Windows использует подсистему bash в Windows 10. Я бы попытался запустить bash для Windows10 и перейти в эту папку или узнать, как получить доступ к папкам Linux из Windows 10. Проверьте эту страницу для FAQ на Подсистема Linux в Windows 10.

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

Если вы работаете в 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

Обычно в Windows он находится по следующему пути в файловой системе WSL Linux.

docker-desktop-data\data\docker\volumes

Другие вопросы по тегам