Установка и использование Docker Compose
Docker – очень полезный инструмент, но чтобы использовать его возможности в полной мере, нужно создать отдельный контейнер для каждого компонента приложения. Однако при работе со сложными приложениями, состоящими из большого количества компонентов, управлять контейнерами и синхронизировать их работу – довольно трудная задача.
Сообщество Docker использовало для решения этой проблемы средство под названием Fig, которое позволяет использовать единый YAML-файл для планирования и организации работы контейнеров и конфигураций Docker. Но со временем команда Docker решила разработать собственное средство, основанное на исходном коде Fig. Так появился Docker Compose – инструмент для определения и запуска многоконтейнерных приложений Docker. Коротко говоря, Docker Compose предназначен для планирования и организации процессов в контейнерах Docker (запуска, отключения, создания межконтейнерных соединений и томов, и т.п.).
Общие понятия Docker и Docker Compose
Прежде чем приступить к работе с Docker Compose, нужно ознакомиться с основными понятиями Docker.
Образы Docker
По сути, каждый контейнер является образом Docker. Образ проще представить в виде готовой установки Linux. Как правило, простая установка содержит минимальное количество пакетов, необходимое для запуска образа. Образы используют ядро хост-системы, но, будучи запущенными в контейнерах Docker, они видят только свою файловую систему, что позволяет, к примеру, запустить контейнер с дистрибутивом CentOS в системе Ubuntu и наоборот.
Большинство контейнеров Docker распространяется при помощи ресурса Docker Hub, который поддерживается командой разработчиков проекта. Наиболее популярные проекты с открытым исходным кодом имеют свой образ, загруженный в Docker Registry, который можно использовать для развёртывания программного обеспечения. По возможности лучше использовать «официальные» образы, подтверждённые командой Docker.
Взаимодействие между образами Docker
По умолчанию контейнеры Docker изолированы от главной машины, следовательно, главная машина не имеет доступа к файловой системе в контейнере, а также никаких средств взаимодействия с ней через сеть.
Для решения этой проблемы Docker предлагает три основных способа. Первый и наиболее распространенный способ – указать переменные среды Docker внутри контейнера. Код, запущенный внутри контейнера, будет проверять значения этих переменных среды при загрузке и использовать их для соответствующей настройки.
Следующий метод – использование томов данных Docker. Тома Docker бывают двух видов – внутренние и общие. По умолчанию после перезагрузки или отключения контейнера данные будут потеряны; контейнер, по сути, возвращается в состояние, в котором он находился до запуска. Это удобно при тестировании или разработке (поскольку обеспечивает одинаковую среду при каждом новом запуске контейнера), однако совсем не подходит для среды производства (поскольку после перезапуска весь добавленный контент будет потерян). Внутренний том Docker позволяет сохранять данные определённой папки отдельного контейнера Docker. Например, чтобы сохранить содержимое лог-файлов после перезагрузки, можно создать внутренний том для /var/log.
Общий том отображает папку контейнера Docker в папке на хост-компьютере. Это позволяет легко обмениваться файлами между контейнером и главной машиной.
Взаимодействие между различными контейнерами Docker обеспечивается при помощи ссылок, а также путём перенаправления портов, что позволяет направить порты из контейнера Docker к портам на хост-сервере. К примеру, можно создать ссылку, чтобы настроить взаимодействие контейнеров WordPress и MariaDB, и использовать перенаправление порта, чтобы позволить WordPress взаимодействовать с внешним миром, чтобы пользователи могли подключиться к нему.
Требования
Для выполнения руководства понадобится:
- Сервер Ubuntu 14.04
- Не-root пользователь с доступом к sudo (подробнее об этом – в руководстве по начальной настройке сервера).
1: Установка Docker
Установите Docker, если ранее он не был установлен.
Проще всего это сделать при помощи установочного скрипта; загрузите и установите его (будет запрошен пароль sudo):
wget -qO- https://get.docker.com/ | sh
Эта команда загрузит и выполнит скрипт, написанный командой Docker.
Для работы с Docker пользователя нужно настроить соответствующим образом. Добавьте пользователя в группу docker.
sudo usermod -aG docker $(whoami)
2: Установка Docker Compose
После установки Docker можно приступать к установке Docker Compose. Для начала установите python-pip:
sudo apt-get -y install python-pip
Затем установите Docker Compose:
sudo pip install docker-compose
3: Запуск контейнера при помощи Docker Compose
Официальный открытый ресурс Docker, Docker Hub, предлагает образ простого приложения Hello World. Можно использовать его, чтобы протестировать Docker Compose.
Создайте каталог для YAML-файла:
mkdir hello-world
Откройте этот каталог:
cd hello-world
Создайте YAML-файл при помощи текстового редактора:
nano docker-compose.yml
Поместите в файл следующий контент, затем сохраните и закройте его:
my-test:
image: hello-world
Первая строка будет использоваться как часть имени контейнера. Вторая строка указывает, какой образ использовать для создания контейнера. Образ будет загружен из официального репозитория Docker Hub.
В каталоге ~/hello-world выполните следующую команду, чтобы создать контейнер:
docker-compose up
На экране должен появиться примерно такой вывод:
Creating helloworld_my-test_1...
Attaching to helloworld_my-test_1
my-test_1 |
my-test_1 | Hello from Docker.
my-test_1 | This message shows that your installation appears to be working correctly.
my-test_1 |
Вывод описывает действия Docker:
- Клиент Docker подключается к демону Docker.
- Демон загружает образ hello-world с Docker Hub.
- Демон создаёт из этого образа новый контейнер.
- Демон передаёт полученный вывод клиенту Docker, а он возвращает его в терминал.
Процесс не завершается самостоятельно, нажмите CTRL-C.
4: Команды Docker Compose
Рассмотрим команды, которые поддерживает Docker Compose.
Команда docker-compose работает на уровне каталога. На одной машине можно иметь несколько групп контейнеров; для этого нужно создать отдельный каталог и отдельный файл docker-compose.yml для каждого контейнера.
Вы уже запускали команду docker-compose up и остановили процесс при помощи комбинации CTRL-C. Это выводит в окно терминала отладочные сообщения. Однако в среде производства инструмент docker-compose должен работать как сервис. Для этого достаточно добавить опцию –d:
docker-compose up -d
Эта команда запускает docker-compose в фоновом режиме.
Чтобы просмотреть группу контейнеров Docker (и запущенных, и отключенных), используйте следующую команду:
docker-compose ps
К примеру, вывод может иметь такой вид (этот вывод сообщает, что контейнер helloworld_my-test_1 отключен):
Name Command State Ports
-----------------------------------------------
helloworld_my-test_1 /hello Exit 0
Состояние запущенных контейнеров – Up:
Name Command State Ports
---------------------------------------------------------------
nginx_nginx_1 nginx -g daemon off; Up 443/tcp, 80/tcp
Чтобы остановить все контейнеры Docker в группе конкретного приложения, выполните следующую команду в каталоге, в котором находится файл docker-compose.yml, при помощи которого был запущена группа Docker:
docker-compose stop
Примечание: Также можно использовать команду docker-compose kill.
Иногда Docker хранит устаревшую информацию во внутреннем томе. Чтобы вернуть среду в её исходное состояние, нужно использовать команду rm, которая удаляет все контейнеры, созданные группой:
docker-compose rm
Если запустить эту команду в другом каталоге (не в том, в котором хранится контейнер Docker и yml-файл), команда вернёт ошибку:
Can't find a suitable configuration file in this directory or any parent. Are you in the right directory?
Supported filenames: docker-compose.yml, docker-compose.yaml, fig.yml, fig.yaml
5: Работа с файловой системой контейнера Docker (опционально)
Если вам нужно взаимодействовать с файловой системой контейнера при помощи командной строки, используйте команду docker exec.
Образец контейнера Hello World закрывается после запуска, потому нужно запустить новый контейнер, чтобы протестировать работу команды docker exec. Для примера можно использовать образ Nginx с Docker Hub.
Создайте новый каталог и откройте его
mkdir ~/nginx && cd $_
Создайте файл docker-compose.yml:
nano docker-compose.yml
Вставьте в него следующий код:
nginx:
image: nginx
Сохраните и закройте файл. Теперь нужно запустить контейнер Nginx как фоновый процесс:
docker-compose up -d
Образ Nginx будет загружен, контейнер запустится в фоновом режиме.
После этого нужно узнать CONTAINER ID данного контейнера. Список запущенных контейнеров можно просмотреть при помощи команды:
docker ps
На экране появится примерно такой вывод:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e90e12f70418 nginx "nginx -g 'daemon off" 6 minutes ago Up 5 minutes 80/tcp, 443/tcp nginx_nginx_1
Примечание: Эта команда выводит только запущенные контейнеры.
Чтобы внести изменения в файловую систему контейнера, используйте ID – контейнера (в данном случае это e90e12f70418) и команду docker exec. Это запустит оболочку в контейнере.
docker exec -it e90e12f70418 /bin/bash
Опция –t открывает терминал, а опция –i запускает интерактивный режим. Опция /bin/bash открывает оболочку bash для запущенного контейнера.
root@e90e12f70418:/#
Теперь можно взаимодействовать с контейнером из командной строки.
Имейте в виду: все изменения будут утеряны, как только контейнер перезапустится, если каталог не входит в том данных. Кроме того, нужно помнить, что большинство контейнеров создаются как минимальные установки Linux, потому некоторые команды и утилиты в них недоступны.
Заключение
Данное руководство охватывает только основы работы с Docker Compose.
Более подробную информацию о файле docker-compose.yml можно найти здесь.
Tags: Docker, Docker Compose, Ubuntu 14.04
3 комментария
Спасибо за статью!
ERROR: In file ‘./docker-compose.yml’, service ‘image’ must be a mapping not a string.
Пробелы должны быть, вот так:
my-test:
[пробел]image: hello-world