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