Пошук томів даних у Docker Desktop (Windows)


85

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

Я використовую 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"
    }
]

Хто-небудь може мені допомогти? Я просто хочу знати, де насправді існує мій обсяг даних - це на моїй хост-машині? Якщо так, то як я можу знайти шлях до нього?


Ви знайшли рішення, щоб побачити, де вони "насправді" зберігаються? У панелі інструментів Docker це дуже легко перевірити, ми можемо увійти в докер-машину та перевірити. Однак я ще не знайшов способу перевірити, де ці томи існують у справі Docker Desktop
Наг,

Дивіться прийняту відповідь
Бред,

Відповіді:


62

Ваш каталог томів є /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 для їх обміну не має сенсу.

чи можу я робити резервні копії тощо?

Так, як розміщено вище :-)


Гаразд, отже, джерелом /var/lib/docker/volumes/blog_postgres-data/_dataє докер Linux VM, на якому працює. Моя головна цікавість тут полягає в тому, що обмін зображеннями тощо є чудовим, але як я можу поділитися своїми даними? чи можу я натиснути том на докер-концентратор, як це роблю із зображеннями? чи можу я робити резервні копії тощо?
Бред

@Brad, я оновив свою відповідь на ваші запитання, оскільки коментаря недостатньо, сподіваюся, він може бути вам корисним :-)
shizhz

@Brad ви можете змонтувати один і той же том у декілька контейнерів. Так docker run -it --rm -v blog_postgres-data:/data busybox ls -l /dataпокажуть ці дані.
BMitch

3
Каталог "C: \ Users \ Public \ Documents \ Hyper-V \ Virtual hard disks" порожній (Wondows 10 Enterprise)
Leos Literak

Але dbstore вийшов. Як переглянути / завантажити дані ?.
sushil

63

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

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

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


3
Дякую, я шукав відповідь майже дві години :)) Врятував свій день.
Ібрагім Сакаджі

2
Свята мамо, я не можу повірити, скільки часу минуло, перш ніж я знайшов вашу відповідь і рішення. Я шукав смішну кількість місць. Думаю, це абсолютно нова річ. Дуже дякую.
Сарел Бота

3
Дякую! це було рятівником навіть через 2 роки. я пишу цей коментар у 2020 році :-)
Đĵ ΝιΓΞΗΛψΚ

Щасливі, що допомогли!
mpc-DT

1
Більш загально /var/lib/docker/відображається\\wsl$\docker-desktop-data\version-pack-data\community\docker\
Девід

14

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

Також docker inspect <container_id>буде перелічена конфігурація контейнера, у розділі Mounts див. Докладніше про шар стійкості.

Оновлення: Не застосовується для Docker, що працює на WSL .


1
Ваша відповідь правильна "Під час запуску контейнерів на базі Linux на хості Windows фактичні томи зберігатимуться у віртуальній машині Linux і не будуть доступні на fs хосту" Я не міг знайти жодних елементів у "C: \ Users \ Public \ Документи \ Hyper-V \ Віртуальні жорсткі диски ".
theeranitp

І, схоже, Docker Desktop дуже готовий просто здути цю ВМ. Наприклад, я намагався щось змінити у файлі JSON у Docker Desktop> Settings> Docker Engine, і це, мабуть, було недійсним. Після того, як Docker Desktop кілька разів спробував перезапуститись, я випадково спостерігав у Hyper-V Manager, і він просто видалив віртуальну машину.
Аарон Аксвіг,

6

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


2

Встановлення будь-яких каталогів, заснованих на 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:

це не пов’язано, але для повністю робочого прикладу перед будь-яким викликом складання докера потрібно запустити такий сценарій:

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


2

Я виявив, що моє налаштування Docker з WSL 2 (Ubuntu 20.04) використовує це розташування:

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

Де UserNameваше ім’я користувача.


1

Кожен контейнер має свою власну файлову систему, яка не залежить від файлової системи хоста. Якщо запустити контейнер із прапором -v, ви зможете монтувати томи, щоб хост і контейнер бачили однакові дані (як у докері -v hostFolder: containerFolder).

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

Я припускаю, що ви не використовували -v, отже папка не змонтована і доступна лише у файловій системі контейнера, яку ви можете знайти в "/ var / lib / docker / volumes / blog_postgres-data / _data". Ці дані будуть видалені, якщо ви видалите контейнер (docker -rm), тому, можливо, буде гарною ідеєю встановити папку.

Щодо питання, де ви можете отримати доступ до цих даних із Windows. Наскільки мені відомо, docker для Windows використовує підсистему bash в Windows 10. Я спробував би запустити bash для windows10 і перейти до цієї папки або дізнатися, як отримати доступ до папок Linux з Windows 10. Перевірте цю сторінку щоб отримати відповіді на поширені запитання підсистема Linux у Windows 10.

Оновлення: Ви також можете використовувати docker cp для копіювання файлів між хостом і контейнером.


3
Я усвідомлюю, що цьому пару років, але, мабуть, варто зазначити, що Docker для Windows наразі не використовує підсистему Windows для Linux; швидше, він запускає Moby Linux всередині HyperV.
alastair

0

Якщо ви використовуєте Windows і використовуєте Docker для Windows, Docker працює через VM (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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.