Расположение томов данных в 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