Docker windows share folder

Изучаем Docker, часть 6: работа с данными

В сегодняшней части перевода серии материалов о Docker мы поговорим о работе с данными. В частности — о томах Docker. В этих материалах мы постоянно сравнивали программные механизмы Docker с разными съедобными аналогиями. Не будем отходить от этой традиции и здесь. Данные в Docker пусть будут специями. В мире существует множество видов специй, а в Docker — множество способов работы с данными.

Обратите внимание на то, что этот материал подготовлен с использованием движка Docker версии 18.09.1 и API версии 1.39.

Данные в Docker могут храниться либо временно, либо постоянно. Начнём с временных данных.

Временное хранение данные

В контейнерах Docker организовать работу с временными данными можно двумя способами.

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

Для хранения временных файлов в Docker можно воспользоваться ещё одним решением, подходящим для тех случаев, когда требуется более высокий уровень производительности, в сравнении с тем, который достижим при использовании стандартного механизма временного хранения данных. Если вам не нужно, чтобы ваши данные хранились бы дольше, чем существует контейнер, вы можете подключить к контейнеру tmpfs — временное хранилище информации, которое использует оперативную память хоста. Это позволит ускорить выполнение операций по записи и чтению данных.

Часто бывает так, что данные нужно хранить и после того, как контейнер прекратит существовать. Для этого нам пригодятся механизмы постоянного хранения данных.

Постоянное хранение данных

Существуют два способа, позволяющих сделать срок жизни данных большим срока жизни контейнера. Один из способов заключается в использовании технологии bind mount. При таком подходе к контейнеру можно примонтировать, например, реально существующую папку. Работать с данными, хранящимися в такой папке, смогут и процессы, находящиеся за пределами Docker. Вот как выглядят монтирование tmpfs и технология bind mount.

Монтирование tmpfs и bind mount

Минусы использования технологии bind mount заключаются в том, что её использование усложняет резервное копирование данных, миграцию данных, совместное использование данных несколькими контейнерами. Гораздо лучше для постоянного хранения данных использовать тома Docker.

Тома Docker

Том — это файловая система, которая расположена на хост-машине за пределами контейнеров. Созданием и управлением томами занимается Docker. Вот основные свойства томов Docker:

  • Они представляют собой средства для постоянного хранения информации.
  • Они самостоятельны и отделены от контейнеров.
  • Ими могут совместно пользоваться разные контейнеры.
  • Они позволяют организовать эффективное чтение и запись данных.
  • Тома можно размещать на ресурсах удалённого облачного провайдера.
  • Их можно шифровать.
  • Им можно давать имена.
  • Контейнер может организовать заблаговременное наполнение тома данными.
  • Они удобны для тестирования.

Как видите, тома Docker обладают замечательными свойствами. Давайте поговорим о том, как их создавать.

Читайте также:  Залипает курсор мыши windows

Создание томов

Тома можно создавать средствами Docker или с помощью запросов к API.

Вот инструкция в Dockerfile, которая позволяет создать том при запуске контейнера.

При использовании подобной инструкции Docker, после создания контейнера, создаст том, содержащий данные, которые уже имеются в указанном месте. Обратите внимание на то, что если вы создаёте том с использованием Dockerfile, это не освобождает вас от необходимости указать точку монтирования тома.

Создавать тома в Dockerfile можно и используя формат JSON.

Кроме того, тома можно создавать средствами командной строки во время работы контейнера.

Работа с томами из командной строки

▍Создание тома

Создать самостоятельный том можно следующей командой:

▍Выяснение информации о томах

Для того чтобы просмотреть список томов Docker, воспользуйтесь следующей командой:

Исследовать конкретный том можно так:

▍Удаление тома

Удалить том можно так:

Для того чтобы удалить все тома, которые не используются контейнерами, можно прибегнуть к такой команде:

Перед удалением томов Docker запросит у вас подтверждение выполнения этой операции.

Если том связан с каким-либо контейнером, такой том нельзя удалить до тех пор, пока не удалён соответствующий контейнер. При этом, даже если контейнер удалён, Docker не всегда это понимает. Если это случилось — можете воспользоваться следующей командой:

Она предназначена для очистки ресурсов Docker. После выполнения этой команды у вас должна появиться возможность удалить тома, статус которых до этого определялся неправильно.

Флаги —mount и —volume

Для работы с томами вам, при вызове команды docker , часто придётся пользоваться флагами. Например, для того чтобы создать том во время создания контейнера можно воспользоваться такой конструкцией:

В давние времена (до 2017 года) популярен был флаг —volume . Изначально этот флаг (ещё им можно пользоваться в сокращённом виде, тогда он выглядит как -v ) использовался для самостоятельных контейнеров, а флаг —mount — в среде Docker Swarm. Однако, начиная с Docker 17.06, флаг —mount можно использовать в любых сценариях.

Надо отметить, что при использовании флага —mount увеличивается объём дополнительных данных, которые приходится указывать в команде, но, по нескольким причинам, лучше использовать именно этот флаг, а не —volume . Флаг —mount — это единственный механизм, который позволяет работать с сервисами или указывать параметры драйвера тома. Кроме того, работать с этим флагом проще.

В существующих примерах команд, направленных на работу с данными в Docker, вы можете встретить множество примеров употребления флага -v . Пытаясь адаптировать эти команды для себя, учитывайте то, что флаги —mount и —volume используют различные форматы параметров. То есть, нельзя просто заменить -v на —mount и получить рабочую команду.

Главное различие между —mount и —volume заключается в том, что при использовании флага —volume все параметры собирают вместе, в одном поле, а при использовании —mount параметры разделяются.

При работе с —mount параметры представлены как пары вида ключ-значение, а именно, это выглядит как key=value . Эти пары разделяют запятыми. Вот часто используемые параметры —mount :

  • type — тип монтирования. Значением для соответствующего ключа могут выступать bind, volume или tmpfs. Мы тут говорим о томах, то есть — нас интересует значение volume .
  • source — источник монтирования. Для именованных томов это — имя тома. Для неименованных томов этот ключ не указывают. Он может быть сокращён до src .
  • destination — путь, к которому файл или папка монтируется в контейнере. Этот ключ может быть сокращён до dst или target .
  • readonly — монтирует том, который предназначен только для чтения. Использовать этот ключ необязательно, значение ему не назначают.
Читайте также:  Windows installer and framework

Вот пример использования —mount с множеством параметров:

Итоги

Вот полезные команды, которыми можно пользоваться при работе с томами Docker:

  • docker volume create
  • docker volume ls
  • docker volume inspect
  • docker volume rm
  • docker volume prune

Вот список часто используемых параметров для —mount , применимых в команде вида docker run —mount my_options my_image :

  • type=volume
  • source=volume_name
  • destination=/path/in/container
  • readonly

Теперь, когда мы завершили эту серию материалов о Docker, пришло время сказать пару слов о том, куда тем, кто изучает Docker, можно двигаться дальше. Вот большая хорошая статья о Docker. Вот книга о Docker (покупая эту книгу, постарайтесь раздобыть самое свежее её издание). Вот ещё одна книга, которая подойдёт тем, кто полагает, что практика — это лучший способ изучения технологий.

Уважаемые читатели! Какие материалы о Docker вы посоветовали бы изучить новичкам?

how to share folder between host os and docker container

I have created a volume of a docker image. The docker image is:

And the container volume is:

I need to share a folder between the host Ubuntu 16.04 OS and the docker container. I ran this command for doing this:

docker run -v /home/cortana/deep-learning/:/home gcr.io/tensorflow/tensorflow:latest-gpu

This didnt lead to the folder being loaded into the container deep . I dont know what to do after this and am really new to the container stuff in docker. Please explain your answer a bit too.

EDIT: I deleted the container and then ran these commands:

There is no folder called deep-learning in the /home/ folder in the container. What have I done wrong here?

1 Answer 1

There’s no API I’m aware of to change the mounted volumes on a running container. You destroy the existing container ( docker stop and docker rm ) and create a new one with the proper configuration ( docker run ). If you find yourself trying to maintain a single container, upgrading apps inside the container or with data inside, odds are good that you’re trying to recreate a VM rather than isolating a process, which is an anti-pattern.

From your edit, you didn’t create the /home/deep-learning folder, you created the /home folder. You also appear to be creating a second container named deep without any volume mounts and exec’ing into that one. To make a container with the /home/deep-learning volume mount and the name deep, run it like:

Shared folder in Docker. With Windows. Not only “C/user/” path

I’m new to Docker, I come from Vagrant.

I’m using Docker (1.9.1) inside my «D:/Works/something/DockerFirstTime» folder.

Now I create the machine with

docker-machine create first

and simple Dockerfile:

and simple Gemfile:

Now with this command I want to use a shared folder like in Vagrant in the same hard drive of my Dockerfile:

docker run -it -v //d/Works/something/DockerFirstTime:/usr/src/app -w /usr/src/app ruby:2.2 bundle install

But it doesn’t works.

I know that Docker only shares the /c/User/folder, is that right?

How can I use the folder with the files and modify my files with editor in Windows and then restart server like in a normal shell on a single PC or like in Vagrant?

2 Answers 2

This question and this question have a similar root problem, mounting a non C:/ drive folder in boot2docker. I wrote an in-depth answer to the other question that provide the same information that is in the first half of @VonC’s answer.

All other paths come from your virtual machine’s filesystem. [. ] In the case of VirtualBox you need to make the host folder available as a shared folder in VirtualBox. Then, you can mount it using the Docker -v flag.

To get your folder mounted in a container:

This mounts your entire D:\ drive, you can simply change the file paths to be more granular and specific.

Читайте также:  Новое обновление windows 10 2016

Share the directory with VBox:

This only needs to be done once.

Mount the shared directory in your VM:

This will need to be done each time you restart the VM.

In the Boot2Docker VM terminal:

To see sources and explanation for how this works see my full answer to the other similar question

After this you can use the -v / —volume flag in Docker to mount this folder or any sub-folders or files into containers. If you mounted your whole D:\ drive you can use that exact docker run command from your question and it should now work. If you mounted a specific part of you drive you will have to change the paths to match.

To edit in windows, run in docker:

Mounting a host directory can be useful for testing. For example, you can mount source code inside a container. Then, change the source code and see its effect on the application in real time.

As a VBox shared directory you should be able to see changes made from the Windows side reflected in the boot2docker vm.

You may need to restart containers to see the changes actually appear, this depends on how the program running inside the container, in your case ruby, uses the files. If the files are compiled into an app when the container starts, for example, you will definitely need to restart the container to see the changes.

Beware the CR LF vs. LF line ending difference when writing files in Windows and reading them in Linux. Make sure your text editor is saving files with Unix line endings or else you may start to see errors caused by ‘^M’ appended to the end of all your lines.

I know that Docker only shares the /c/User/folder, is that right?

It does, and it is able to do so because the VirtualBox VM used for providing a Linux host for docker is sharing C:\Users.

For docker to see another folder, you would need to:

    use VBoxmanage sharedfolder add «VM name» —name «sharename» —hostpath «D:\Works»

The issue with that last alternative is described in » Introduction to boot2docker» (scroll down to the «Shared folders» section)

The main issue with vboxsf is that it does not do any sort of caching sort of caching so when you are attempting to share a large amount of small files (big git repo’s) or anything that is filesystem read heavy (grunt) performance becomes a factor.

The best solution I have come up with so far is using vagrant with a customized version of boot2docker with NFS support enabled, which has very little “hacking” to get working which is nice.
And a good enough selling point for me is the speed increase by using NFS instead of vboxsf, it’s pretty staggering actually.

The magic sauce in the volume sharing is in this line.

Which tells Vagrant to share your current directory in to the boot2docker VM in the /vagrant directory, using NFS.

Оцените статью