Расположение томов данных в Docker Desktop (Windows)
Сейчас я пытаюсь изучить докер, и я запутался в том, где фактически существуют объемы данных.
Я использую Docker Desktop для Windows. (Windows 10)
В документах говорится, что при запуске проверки докера на объекте вам будет указан источник: 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"
}
]
Может кто-нибудь мне помочь? Я просто хочу знать, где на самом деле существует мой объем данных, на моем хост-компьютере? Если так, как я могу получить путь к нему?
Ответы
Ответ 1
Ваш каталог томов находится в /var/lib/docker/volumes/blog_postgres-data/_data
и /var/lib/docker
обычно монтируемых в C:\Users\Public\Documents\Hyper-v\Virtual hard disks
. В любом случае вы можете проверить это, посмотрев в настройках Docker.
Вы можете обратиться к этим документам для получения информации о том, как совместно использовать диски с 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 для совместного использования не имеет никакого смысла.
я могу делать резервные копии и т.д?
Да, как написано выше :-)
Ответ 2
Каждый контейнер имеет свою собственную файловую систему, которая не зависит от файловой системы хоста. Если вы запускаете свой контейнер с флагом -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. Проверьте это страница для часто задаваемых вопросов в подсистеме linux в Windows 10.
Обновление. Вы также можете использовать docker cp для копирования файлов между хостом и контейнером.
Ответ 3
Монтирование любых каталогов, основанных на 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 [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:
это не имеет отношения, но для полностью работающего примера перед любым вызовом 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