В этой статье мы расскажем о Docker Compose и покажем, как использовать его для ваших нужд.
Мы установим его, напишем простой файл Compose и запустим контейнер.
Затем мы увидим, как запустить несколько контейнеров.
Затем мы увидим, как создавать образы, а в последней части – как использовать несколько файлов Compose для запуска контейнеров в различных средах, таких как, например, разработка и производство.
Вступление
До сих пор мы видели, как Docker отлично подходит для управления образами и запуска контейнеров.
Но часто приложения требуют, чтобы разные контейнеры работали и общались друг с другом.
Соединяя их через сеть, заставляя их совместно использовать тома диска, и передавая переменные среды, можно легко превратить в последовательность команд, которые сложно документировать и поддерживать с течением времени.
Тут на помощь приходит Docker Compose.
Давайте начнем его устанавливать, а затем напишем файл Compose.
Установка Docker Compose
В Ubuntu 18.04 установить Docker Composer просто:
# apt install docker-compose
Чтобы проверить установку, вы можете проверить его версию:
$ docker-compose -v docker-compose version 1.17.1, build unknown
Версии Docker Engine и Docker Compose важны, так как их выпуски встречаются часто, а функции добавляются и удаляются.
Показанная выше версия (1.17.1) была выпущена в ноябре 2017 года.
Если вам нужен более новый выпуск, вы можете либо включить репозиторий Ubuntu Universe и получить более новый пакет, либо даже загрузить и установить последний выпуск непосредственно с веб-сайта Docker Compose:
# curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # sudo chmod +x /usr/local/bin/docker-compose
Файл Docker Compose
Docker Compose читает файл YAML, который обычно называется docker-compose.yml.
version: "3" services: apache: image: php:7.3-apache container_name: 'apache' ports: - "80:80" volumes: - ./www:/var/www/html
В начале, синтаксическая версия сообщается как 3.
Далее, в разделе служб указан только один контейнер (apache), а теги image, container_name, ports и volume используются для описания того, как он должен выполняться.
Теперь создайте каталог с именем www и поместите этот файл index.html внутрь.
<html> <body> Hello </body> </html>
Далее, для проверки работоспособности PHP просто поместите этот файл в www.
<?php phpinfo(); ?>
Команды Docker Compose
Команда up позаботится обо всем: загрузить зобразы из Docker Hub, если они еще не существуют в локальном кэше, создать пользовательские образа (что не так; мы рассмотрим это в следующем разделе) и запустить контейнеры.
$ docker-compose up -d
Ключ -d указывает Docker Compose запускать контейнеры в фоновом режиме.
Если вместо docker-compose.yml используется другое имя файла, это можно сообщить с помощью -f.
Обратите внимание, что команда запуска намного проще, чем аналог запуска Docker.
У него есть еще два преимущества: он не изменяется независимо от содержимого файла Compose, и если в файле Compose указано более одного контейнера, все они будут запущены.
Для сравнения команда docker run будет выглядеть так:
$ docker run -d --name='apache-alone' -p 80:80 -v $PWD/www:/var/www/html php:7.3-apache
Поскольку синтаксис файла Compose – YAML, отступ имеет значение.
Если вы получаете синтаксические ошибки, проверьте синтаксис YAML с помощью онлайн-парсера, такого как этот.
Вы можете проверить, работает ли контейнер.
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3937d997e029 php:7.3-apache "docker-php-entrypoi…" 8 minutes ago Up 8 minutes 0.0.0.0:80->80/tcp apache
Теперь зайдите на http://localhost в вашем любимом браузере, а затем на http://localhost/phpinfo.php.
Запуск нескольких контейнеров
Давайте теперь посмотрим на более сложный файл Compose.
Давайте представим, что мы собираемся настроить локальную среду для разработки приложения LAMP.
Нам нужен контейнер с Apache и PHP, другой контейнер с MySQL и, возможно, контейнер PHPMyAdmin для взаимодействия с MySQL. Docker-compose.yml будет:
version: "3" services: apache: image: php:7.3-apache container_name: 'apache' restart: 'always' ports: - "80:80" - "443:443" volumes: - ./www:/var/www/html - ./php/php.ini:/usr/local/etc/php/php.ini - ./sites-enabled:/etc/apache2/sites-enabled - apache-logs:/var/log/apache2 mysql: image: mariadb:10.4 container_name: 'mysql' restart: 'always' volumes: - mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: somepassword MYSQL_DATABASE: db_site MYSQL_USER: user MYSQL_PASSWORD: password phpmyadmin: image: phpmyadmin/phpmyadmin:4.8 container_name: 'phpmyadmin' environment: PMA_HOST: mysql PMA_PORT: 3306 ports: - '8080:80' volumes: apache-logs: mysql-data:
Этот файл Compose запускает три контейнера, каждый из которых имеет раздел под службами.
Обратите внимание, что мы определяем некоторые переменные окружения под окружением.
Определение restart: всегда указывает Docker автоматически запускать контейнеры при запуске службы Docker (например, в случае перезагрузки).
Команда для запуска трех контейнеров такая же, как в предыдущем простом примере.
Легко запомнить, верно?
$ docker-compose up -d
Проверьте, созданы ли контейнеры.
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f76ece3508fe phpmyadmin/phpmyadmin:4.8 "/run.sh supervisord…" 20 seconds ago Up 4 seconds 9000/tcp, 0.0.0.0:8080->80/tcp phpmyadmin 69b1b5054f3d mariadb:10.4 "docker-entrypoint.s…" 20 seconds ago Up 6 seconds 3306/tcp mysql 6747d7580dac php:7.3-apache "docker-php-entrypoi…" 2 days ago Up 14 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp apache
Интересно отметить, что контейнеры могут общаться через свои имена и получать доступ к портам друг друга без необходимости выставлять свои порты хосту.
Например, мы не открывали порт 3306 службы MySQL (как видно из приведенного выше вывода), но PHPMyAdmin может получить доступ к этому порту.
Чтобы получить доступ к PHPMyAdmin, перейдите по адресу http://localhost:8080 и войдите в систему, используя имя пользователя и пароль, определенные в службе MySQL (user / password).
Создание образов с помощью Docker Compose
Если вам нужно создать образ, а не использовать существующее, просто добавьте тег сборки.
В приведенном ниже примере мы говорим Docker Compose найти текущий каталог для Dockerfile.
Тег образа будет использоваться для названия нового образа.
version: "3"
services:
apache:
build: .
image: my-image-name
container_name: 'apache'
restart: 'always'
ports:
- "80:80"
Переопределение с использованием нескольких файлов Docker Compose
Docker Compose позволяет легко настроить запуск контейнеров для различных сред.
Вам просто нужно создать вызываемые файлы переопределения и запустить контейнеры, указав их.
Они перезапишут предыдущие определения, сделанные в базовом файле Compose.
Например, давайте создадим файл переопределения с именем docker-compose-prod.yml и определим другой пароль для MySQL.
version: "3"
services:
mysql:
environment:
MYSQL_ROOT_PASSWORD: somepassword_other
MYSQL_DATABASE: db_site_other
MYSQL_USER: user_other
MYSQL_PASSWORD: password_other
$ docker stop mysql $ docker rm mysql $ docker volume ls $ docker volume rm directory_mysql-data
И тогда вы можете выполнить команду ниже.
Важно следить за порядком файлов.
Можно использовать несколько файлов.
В нашем примере будет переопределен только раздел среды службы mysql.
$ docker-compose -f docker-compose.yml -f docker-compose-prod.yml up -d
После проверки работы контейнеров попробуйте получить доступ к PHPMyAdmin с использованием новых учетных данных.
Заключение
В этой статье был представлен Docker Compose, удобный инструмент для организации запуска нескольких контейнеров на одном хосте.
Существует множество возможностей, и настоятельно рекомендуется прочитать руководство по Docker Compose.
В следующих статьях мы рассмотрим способы организации контейнеров Docker между несколькими хостами.