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

Вступление

В этой статье мы рассмотрим концепцию томов данных Docker: что это такое, почему они полезны, разные типы томов, как их использовать и когда использовать каждый из них. Мы также рассмотрим несколько примеров использования томов 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, поэтому вместо этого мы создаем контейнер тома data с подключенным к нему томом. Для любых других контейнеров, которые вы затем хотите подключить к этому контейнеру тома данных, используйте опцию Docker + - volume-from +, чтобы извлечь том из этого контейнера и применить их к текущему контейнеру. На первый взгляд, это немного необычно, поэтому давайте рассмотрим краткий пример того, как мы могли бы использовать этот подход, чтобы заставить наш файл «+ byebye +» держаться, даже если контейнер удален.

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

docker create -v /tmp --name datacontainer ubuntu

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

Теперь, если мы запустим новый контейнер Ubuntu с флагом + - volume-from + и снова запустим + bash +, как мы это делали ранее, все, что мы напишем в каталог + / tmp +, будет сохранено в + / tmp + `объем нашего контейнера + datacontainer + `.

Сначала запустите образ + ubuntu:

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

Опции командной строки + -t + вызывают терминал изнутри контейнера. Флаг + -i + делает соединение интерактивным.

В приглашении bash для контейнера + 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

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

Output of cat /tmp/hiI'm not going anywhere

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

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

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

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

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

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

mkdir ~/nginxlogs

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

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 нашего хост-компьютера отображается непосредственно на эту копию порта 80 Nginx. Давайте использовать 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 для подробности.

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

Related