Поиск по сайту:

Как работать с томами данных Docker в Ubuntu 14.04


Введение

В этой статье мы рассмотрим концепцию томов данных Docker: что это такое, почему они полезны, разные типы томов, как их использовать и когда использовать каждый из них. Мы также рассмотрим несколько примеров использования томов Docker с помощью инструмента командной строки docker.

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

Предпосылки

Чтобы следовать этому руководству, вам понадобится следующее:

  • Дроплет Ubuntu 14.04
  • Пользователь без полномочий root с правами sudo (начальная настройка сервера с Ubuntu 14.04 объясняет, как это настроить).
  • Docker установлен в соответствии с инструкциями из шага 1 раздела «Установка и использование Docker Compose в Ubuntu 14.04».

Примечание. Несмотря на то, что в предварительных условиях содержатся инструкции по установке Docker в Ubuntu 14.04, команды docker для томов данных Docker в этой статье должны работать в других операционных системах, пока установлен Docker.

Объяснение контейнеров Docker

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

Контейнер Docker похож на виртуальную машину. По сути, это позволяет вам запускать предварительно упакованный «Linux-бокс» внутри контейнера. Основное различие между контейнером Docker и типичной виртуальной машиной заключается в том, что Docker не так изолирован от окружающей среды, как обычная виртуальная машина. Контейнер Docker разделяет ядро Linux с операционной системой хоста, что означает, что ему не нужно «загружаться», как виртуальная машина.

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

Изучение типов томов данных Docker

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

  1. Чтобы сохранить данные при удалении контейнера
  2. Для обмена данными между файловой системой хоста и контейнером Docker
  3. Для обмена данными с другими контейнерами Docker

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

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

Сохранение данных

Невозможно напрямую создать \том данных в Docker, поэтому вместо этого мы создаем контейнер тома данных с присоединенным к нему томом. Для любых других контейнеров, которые вы затем захотите подключить к этим данным тома, используйте параметр Docker --volumes-from, чтобы получить том из этого контейнера и применить их к текущему контейнеру. На первый взгляд это немного необычно, поэтому давайте рассмотрим быстрый пример того, как мы могли бы использовать этот подход, чтобы наш файл byebye оставался, даже если контейнер был удален.

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

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 делает соединение интерактивным.

В командной строке bash для контейнера ubuntu создайте файл в /tmp:

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

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

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

На этот раз файл hi уже есть:

  1. cat /tmp/hi

Тебе следует увидеть:

Output of cat /tmp/hi
I'm not going anywhere

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

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

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

Другое распространенное использование контейнеров Docker — это средство обмена файлами между хост-компьютером и контейнером Docker. Это работает иначе, чем в последнем примере. Нет необходимости сначала создавать контейнер «только для данных». Вы можете просто запустить контейнер любого образа Docker и переопределить один из его каталогов содержимым каталога в хост-системе.

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

Давайте создадим папку для хранения наших журналов, а затем запустим копию образа Nginx с общим томом, чтобы Nginx писал свои журналы в файловую систему нашего хоста, а не в /var/log/nginx внутри контейнер:

  1. mkdir ~/nginxlogs

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

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

Эта команда run немного отличается от тех, которые мы использовали до сих пор, поэтому давайте разберем ее по частям:

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

Если вы были внимательны, то могли заметить еще одно отличие от предыдущих команд run. До сих пор мы указывали команду в конце всех наших операторов run (обычно /bin/bash), чтобы сообщить Docker, какую команду запускать внутри контейнера. Поскольку образ Nginx является официальным образом Docker, он соответствует рекомендациям Docker, и создатель образа настроил образ для запуска команды для автоматического запуска Nginx. Мы можем просто перекинуть сюда обычный /bin/bash и позволить создателям образа выбрать, какую команду запустить в контейнере за нас.

Итак, теперь у нас есть копия Nginx, работающая внутри контейнера Docker на нашей машине, и порт 5000 нашей хост-машины напрямую сопоставляется с этой копией порта Nginx 80. Давайте используем curl для быстрого тестового запроса:

curl localhost:5000

Вы получите полный экран HTML-кода от Nginx, показывающий, что Nginx запущен и работает. Но что еще интереснее, если вы заглянете в папку ~/nginxlogs на хост-компьютере и посмотрите на файл access.log, вы увидите сообщение журнала от Nginx. показывая наш запрос:

cat ~/nginxlogs/access.log

Вы увидите что-то похожее на:

Output of `cat ~/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. Это охватывает все, кроме самых сложных случаев использования, когда речь идет о томах данных Docker.

Если вы используете Docker Compose, тома данных Docker можно настроить в файле docker-compose.yml. Подробности см. в разделе Как установить и использовать Docker Compose в Ubuntu 14.04.

Удачи и счастливого Докеринга!