Использование томов данных Docker в Ubuntu 14.04

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

Требования

  • Сервер Ubuntu 14.04.
  • Не-root пользователь с доступом к sudo.
  • Предварительно установленная платформа Docker (инструкции по установке можно найти в разделе 1 этого руководства)

Примечание: Данное руководство предназначено для сервера Ubuntu 14.04, однако команда docker работает аналогичным образом и на других дистрибутивах.

Контейнеры Docker

Чтобы продуктивно использовать Docker, нужно ознакомиться с основными понятиями экосистемы Docker.

Примечание: Если вы знаете, что такое контейнеры Docker и как они работают, переходите к следующему разделу руководства.

Контейнеры Docker похожи на виртуальные машины. Главным их отличием является то, что контейнер менее изолирован от окружения. Контейнеры Docker используют ядро Linux вместе с хост-системой, а потому запускаются не так, как виртуальные машины.

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

Тома данных Docker

Файловые системы Docker являются временными по умолчанию, и это часто вызывает путаницу. Если вы запускаете образ Docker, в конечном итоге вы получите контейнер, который внешне ведет себя подобно виртуальной машине. В контейнере вы можете создавать, изменять и удалять файлы. Но если вы остановите контейнер и запустите его снова, все изменения будут утеряны: удалённые файлы будут восстановлены, а все новые файлы и данные исчезнут. Это потому, что образы Docker больше похожи на шаблоны, чем на стандартные образы.

Образы Docker – это файлы, в которых хранятся приложения. Например, образ Nginx с Docker Hub (это открытый реестр Docker) кроме бинарных файлов Nginx содержит также минимальный дистрибутив Linux. Это похоже на снапшоты VirtualBox и других подобных инструментов виртуализации. Чтобы сохранить изменения, нужно создать новый образ Docker (не контейнер) для хранения всех изменённых файлов.

Однако создавать дополнительные образы не всегда удобно.

К примеру, если вы хотите использовать общедоступный контейнер Nginx для обслуживания веб-сайта, вам придётся постоянно копировать страницы сайта при запуске контейнера Docker. Именно в такой ситуации приходят на помощь тома данных. Тома данных Docker предоставляют отдельное место для хранения различных данных. Docker может использовать любую папку в качестве контейнера, и любые изменения данных будут сохранены.

Ранее уже говорилось, что файлы в Docker-контейнерах – временные. Вы, должно быть, уже замечали, что новые файлы пропадают из контейнера после его перезагрузки. Давайте посмотрим, почему так происходит.

Для примера запустите образ ubuntu:

docker run -t -i ubuntu /bin/bash

Эта команда выполняет несколько действий. Команда run и флаги -t и –i запускают образ Docker с терминалом в интерактивном режиме; ubuntu – имя образа, который нужно запустить, а /bin/bash – имя исполняемого файла в этом образе. Docker автоматически загрузит образ из публичного реестра, если не найдёт локальной копии. Затем Docker запустит в загруженном образе стандартную оболочку bash.

После этого командная строку будет выглядеть так:

Ubuntu container bash shell
root@cbceb444ec6a:/#

Создайте файл в корне файловой системы контейнера Docker:

echo "I'm going to disappear" > /byebye

Это создаст файл /byebye и добавит в него заданное содержание. Чтобы убедиться в этом, запросите список файлов данного каталога:

ls /

Команда вернет:

bin  boot  byebye  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

Если вы запустите команду:

cat /byebye

Она вернет:

I'm going to disappear

Теперь введите:

exit

Эта команда вернёт вас в оболочку хоста.

Теперь вернитесь в контейнер и попробуйте запросить файл /byebye. Например:

cat /byebye
cat: /byebye: No such file or directory

Закройте контейнер:

exit

Варианты применения томов данных Docker

Существует три основных варианта использования томов данных Docker:

  1. Для сохранения текущих данных контейнера. Это простейший случай применения, при котором данные сохранятся даже после перезапуска или отключения контейнера.
  2. Для обмена данными между файловой системой хоста и контейнером Docker.
  3. Для обмена данными с другими контейнерами Docker (это продвинутое использование Docker, которое выходит за рамки данного руководства).

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

На самом деле, создать том данных Docker как таковой нельзя. Вместо этого создаются контейнеры томов, к которым прилагаются тома данных. Чтобы в дальнейшем подключить к такому контейнеру другой контейнер, используйте опцию –volumes-from, которая извлечёт том из контейнера и подключит его к указанному контейнеру.

Давайте вернёмся к рассмотренному ранее примеру и попробуем сохранить файл после перезагрузки контейнера.

Сначала создайте контейнер для хранения томов данных:

docker create -v /tmp --name datacontainer ubuntu

Эта команда создаст контейнер datacontainer, основанный на образе ubuntu в каталоге /tmp.

Теперь запустите контейнер Ubuntu с флагом –volumes-from и снова запустите bash. После этого все данные, добавленные в каталог /tmp, будут сохранены в том данных /tmp контейнера datacontainer.

Итак, запустите образ Ubuntu:

docker run -t -i --volumes-from datacontainer ubuntu /bin/bash

Флаг –t вызывает терминал. Флаг –i запускает интерактивный режим.

Теперь с помощью командной строки контейнера ubuntu создайте файл /tmp:

echo "I'm not going anywhere" > /tmp/hi

Вернитесь в оболочку хоста:

exit

Теперь запустите эту команду снова:

docker run -t -i --volumes-from datacontainer ubuntu /bin/bash

Файл hi был сохранён:

cat /tmp/hi
I'm not going anywhere

Вы можете использовать неограниченное количество флагов –volumes-from (то есть, один контейнер может использовать данные из нескольких контейнеров данных). Также вы можете создавать неограниченное количество контейнеров для томов данных.

Единственным ограничением этого подхода является то, что при создании контейнера томов путь монтирования можно выбрать только внутри контейнера (/tmp в данном примере).

Обмен данными между файловой системой хоста и контейнером Docker

Также контейнеры Docker часто используются как способ обмена данными между файловыми системами хоста и контейнера Docker.

При этом нет необходимости создавать отдельный контейнер для данных. Можно просто запустить контейнер из любого образа Docker и переопределить один из каталогов содержимым каталога хост-системы.

К примеру, вы хотите использовать образ Nginx, но при этом вы хотите хранить логи веб-сервера для дальнейшего анализа. По умолчанию логи образа nginx хранятся в каталоге /var/log/nginx. Но этот каталог находится внутри контейнера Docker. Он не доступен для файловой системы хоста.

Создайте каталог для хранения логов, а затем запустите образ Nginx с распределённым томом, чтобы веб-сервер мог сохранять логи в файловой системе хоста.

mkdir ~/nginxlogs

Запустите контейнер:

docker run -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 -i nginx

Рассмотрим команду подробнее:

  • -v ~/nginxlogs:/var/log/nginx задаёт том, который подключает каталог /var/log/nginx внутри контейнера Nginx к каталогу ~/nginxlogs на хост-машине. Символ двоеточия разделяет пути к каталогам (сначала указывается путь к каталогу хоста).
  • -d запускает процесс в фоновом режиме (в противном случае у вас не будет доступа к терминалу).
  • -p 5000:80 настраивает перенаправление портов. Nginx прослушивает порт 80 по умолчанию. Этот параметр перенаправляет порт 80 на порт хост-системы 5000.

Также вы могли заметить отличие от стандартной команды run. Ранее, чтобы запустить команду в контейнере, её нужно было указать в конце (как, например, /bin/bash). Поскольку образ Nginx является официальным, он автоматически запускает Nginx. Поэтому команду /bin/bash можно опустить.

Итак, теперь у вас есть запущенный в контейнере веб-сервер Nginx, который взаимодействует с хостом через порт 5000. Запустите команду:

curl localhost:5000

Если на экране появилась HTML-страница Nginx, значит, все работает должным образом. Теперь проверьте папку ~/nginxlogs на хосте и откройте файл access.log.

cat ~/nginxlogs/access.log

В нём вы увидите:

~/nginxlogs/access.log`
172.17.42.1 - - [23/Oct/2015:05:22:51 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.35.0" "-"

Все изменения, внесённые в ~/nginxlogs, отразятся в контейнере Docker в реальном времени.

Заключение

Теперь вы знаете, как создавать контейнеры данных и использовать их для постоянного хранения информации.

Если вы используете Docker Compose, тома данных можно настроить в файле docker-compose.yml. Дополнительную информацию по этому вопросу можно найти в руководстве «Установка и использование Docker Compose на Ubuntu 14.04».

Tags: ,

Добавить комментарий