В сегодняшней части перевода серии материалов о Docker мы поговорим о работе с данными. В частности — о томах Docker. В этих материалах мы постоянно сравнивали программные механизмы Docker с разными съедобными аналогиями. Не будем отходить от этой традиции и здесь. Данные в Docker пусть будут специями. В мире существует множество видов специй, а в Docker — множество способов работы с данными.
→ Часть 1: основы
→ Часть 2: термины и концепции
→ Часть 3: файлы Dockerfile
→ Часть 4: уменьшение размеров образов и ускорение их сборки
→ Часть 5: команды
→ Часть 6: работа с данными

Обратите внимание на то, что этот материал подготовлен с использованием движка 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 или с помощью запросов к API.
Вот инструкция в Dockerfile, которая позволяет создать том при запуске контейнера.
При использовании подобной инструкции Docker, после создания контейнера, создаст том, содержащий данные, которые уже имеются в указанном месте. Обратите внимание на то, что если вы создаёте том с использованием Dockerfile, это не освобождает вас от необходимости указать точку монтирования тома.
Создавать тома в Dockerfile можно и используя формат JSON.
Кроме того, тома можно создавать средствами командной строки во время работы контейнера.
Создать самостоятельный том можно следующей командой:
Для того чтобы просмотреть список томов Docker, воспользуйтесь следующей командой:
Исследовать конкретный том можно так:
Удалить том можно так:
Для того чтобы удалить все тома, которые не используются контейнерами, можно прибегнуть к такой команде:
Перед удалением томов Docker запросит у вас подтверждение выполнения этой операции.
Если том связан с каким-либо контейнером, такой том нельзя удалить до тех пор, пока не удалён соответствующий контейнер. При этом, даже если контейнер удалён, Docker не всегда это понимает. Если это случилось — можете воспользоваться следующей командой:
Она предназначена для очистки ресурсов Docker. После выполнения этой команды у вас должна появиться возможность удалить тома, статус которых до этого определялся неправильно.
Для работы с томами вам, при вызове команды
В давние времена (до 2017 года) популярен был флаг
Надо отметить, что при использовании флага
В существующих примерах команд, направленных на работу с данными в Docker, вы можете встретить множество примеров употребления флага
Главное различие между
При работе с
Вот пример использования
Вот полезные команды, которыми можно пользоваться при работе с томами Docker:
Вот список часто используемых параметров для
Теперь, когда мы завершили эту серию материалов о Docker, пришло время сказать пару слов о том, куда тем, кто изучает Docker, можно двигаться дальше. Вот большая хорошая статья о Docker. Вот книга о Docker (покупая эту книгу, постарайтесь раздобыть самое свежее её издание). Вот ещё одна книга, которая подойдёт тем, кто полагает, что практика — это лучший способ изучения технологий.
Уважаемые читатели! Какие материалы о Docker вы посоветовали бы изучить новичкам?

→ Часть 1: основы
→ Часть 2: термины и концепции
→ Часть 3: файлы Dockerfile
→ Часть 4: уменьшение размеров образов и ускорение их сборки
→ Часть 5: команды
→ Часть 6: работа с данными

Обратите внимание на то, что этот материал подготовлен с использованием движка 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 обладают замечательными свойствами. Давайте поговорим о том, как их создавать.
Создание томов
Тома можно создавать средствами Docker или с помощью запросов к API.
Вот инструкция в Dockerfile, которая позволяет создать том при запуске контейнера.
VOLUME /my_volumeПри использовании подобной инструкции Docker, после создания контейнера, создаст том, содержащий данные, которые уже имеются в указанном месте. Обратите внимание на то, что если вы создаёте том с использованием Dockerfile, это не освобождает вас от необходимости указать точку монтирования тома.
Создавать тома в Dockerfile можно и используя формат JSON.
Кроме того, тома можно создавать средствами командной строки во время работы контейнера.
Работа с томами из командной строки
▍Создание тома
Создать самостоятельный том можно следующей командой:
docker volume create —-name my_volume▍Выяснение информации о томах
Для того чтобы просмотреть список томов Docker, воспользуйтесь следующей командой:
docker volume lsИсследовать конкретный том можно так:
docker volume inspect my_volume▍Удаление тома
Удалить том можно так:
docker volume rm my_volumeДля того чтобы удалить все тома, которые не используются контейнерами, можно прибегнуть к такой команде:
docker volume pruneПеред удалением томов Docker запросит у вас подтверждение выполнения этой операции.
Если том связан с каким-либо контейнером, такой том нельзя удалить до тех пор, пока не удалён соответствующий контейнер. При этом, даже если контейнер удалён, Docker не всегда это понимает. Если это случилось — можете воспользоваться следующей командой:
docker system pruneОна предназначена для очистки ресурсов Docker. После выполнения этой команды у вас должна появиться возможность удалить тома, статус которых до этого определялся неправильно.
Флаги --mount и --volume
Для работы с томами вам, при вызове команды
docker, часто придётся пользоваться флагами. Например, для того чтобы создать том во время создания контейнера можно воспользоваться такой конструкцией:docker container run --mount source=my_volume, target=/container/path/for/volume my_imageВ давние времена (до 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— монтирует том, который предназначен только для чтения. Использовать этот ключ необязательно, значение ему не назначают.
Вот пример использования
--mount с множеством параметров:docker run --mount type=volume,source=volume_name,destination=/path/in/container,readonly my_imageИтоги
Вот полезные команды, которыми можно пользоваться при работе с томами Docker:
docker volume createdocker volume lsdocker volume inspectdocker volume rmdocker volume prune
Вот список часто используемых параметров для
--mount, применимых в команде вида docker run --mount my_options my_image:type=volumesource=volume_namedestination=/path/in/containerreadonly
Теперь, когда мы завершили эту серию материалов о Docker, пришло время сказать пару слов о том, куда тем, кто изучает Docker, можно двигаться дальше. Вот большая хорошая статья о Docker. Вот книга о Docker (покупая эту книгу, постарайтесь раздобыть самое свежее её издание). Вот ещё одна книга, которая подойдёт тем, кто полагает, что практика — это лучший способ изучения технологий.
Уважаемые читатели! Какие материалы о Docker вы посоветовали бы изучить новичкам?

