Site icon 8HOST.COM

Установка и использование 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 взаимодействовать с внешним миром, чтобы пользователи могли подключиться к нему.

Требования

Для выполнения руководства понадобится:

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:

Процесс не завершается самостоятельно, нажмите 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 можно найти здесь.