Не так давно я писал о Dockerfile, сегодня же поговорим о Docker-Compose и приведем несколько примеров использования.
‘Docker way’ предполагает собой использования одного контейнера для одной задачи. Т.е. в отличии от LXC контейнеров, когда все можно было запихнуть в один, а потом использовать его как в полноценную виртуальную машину (ВМ).. здесь все иначе. Облегченные образы и отсутствие систем инициализации. Следовательно, сразу возникает вопрос, как их удобно связывать между собой. Вот тут то и появляется Docker Compose.
Он несет в себе сразу несколько принципиально важных моментов. Во-первых, мы уходим от трехэтажных команд типа ‘docker run..’ с 100500 аргументов ENV, имеет единый удобочитаемый конфиг. Во-вторых, не приносит в себе ничего принципиально нового, но красиво упрощает множество рутинных операций работы с Docker.
Docker Compose отлично подходит для dev и test, иногда и для небольших prod окружений… да и в целом достаточно хорош для использования в условиях ограниченного объема ресурсов (отсутствие полноценного кластера, один сервер, одна ВМ и т.д.)
Итак, допустим у нас есть некое сферическое веб-приложение в вакууме. В простейшем приближении, мы разделим его на два контейнера. Веб-сервер и само «мясо» — отдельно, а базы данных — отдельно. Прежде, чем самому начать собирать нужные контейнеры для шаблонов (с использованием «традиционных» способов в виде установки через тот или иной пакетный менеджер), стоит заглянуть на Docker Hub и поискать официальные образы. Их удобно использовать и они регулярно обновляются, что разом решает кучу проблем с обновлением и поддержкой. Если смотреть в сторону известных CMS, там есть куча всего: WordPress, Joomla и т.д. и т.п. То же самое касается и БД. Главное, внимательно читайте прилагающиеся доки, как правильно стоит запускать контейнер и какие у него есть параметры.
Мы рассмотрим как пример, установку и работу с CMS на котором работает данный сайт (WordPress), разделим функционал по контейнерам и запустим его через Docker Compose. Сначала давайте постараемся перечислить, что нам потребуется, и поищем это на Docker Hub (упор делаем на официальные образы):
- WordPress: https://hub.docker.com/_/wordpress
- MariaDB: https://hub.docker.com/_/mariadb
- phpMyAdmin: https://hub.docker.com/r/phpmyadmin/phpmyadmin
Так, вроде все нашли. Что дальше? Внимательно читаем описания на каждой странице, и начинаем писать свой конфиг docker-compose.yml и все настройки делаем только через него (старайтесь избегать своих привычных скриптов или наколенных настроек, лишние телодвижения лишь усложнят нам обслуживание нашей системы в будущем — при обновлениях). Создадим отдельную директорию под этот наш проект docker-compose (например, /home/darkfess/compose/wordpress) и положим в нее конфиг.
Я вот написал такой конфиг, и в моем случае он выглядит так:
version: "3.7" services: df-wordpress: image: wordpress container_name: df-wordpress restart: always ports: - 8080:80 environment: WORDPRESS_DB_HOST: df-maria:3306 WORDPRESS_DB_USER: darkfess WORDPRESS_DB_PASSWORD: darkfess WORDPRESS_DB_NAME: dfmaria depends_on: - df-maria networks: - frontend - backend volumes: - wp-content:/var/www/html/wp-content df-maria: image: mariadb container_name: df-maria restart: always environment: MYSQL_ROOT_PASSWORD: darkfess MYSQL_USER: darkfess MYSQL_PASSWORD: darkfess MYSQL_DATABASE: dfmaria networks: - backend volumes: - df-mariadata:/var/lib/mysql df-phpmyadmin: image: phpmyadmin/phpmyadmin container_name: df-phpmyadmin restart: always ports: - 8090:80 environment: PMA_HOST: df-maria depends_on: - df-maria networks: - frontend - backend networks: frontend: backend: volumes: wp-content: df-mariadata:
raw: docker-compose
Кратко разъясним что там да как:
- df-wordpress — контейнер с CMS WordPress
- df-maria — контейнер с базой данных (mariadb)
- df-phpmyadmin — контейнер с отдельным phpmyadmin (подключен к df-maria)
- backend — внутренняя сеть для связи между контейнерами
- frontend — внешняя сеть для доступа из вне
- ports — проброс портов на сеть frontend, по-умолчанию у меня 8080 и 8090 соответствуют внутренним 80.. можно поставить какие угодно, хоть 80:80
- environment — параметры для создания/подключения к базе данных (обратите внимание, что связь у ‘df-wordpress’ и ‘df-phpmyadmin’ с ‘df-maria’, осуществляется по внутренний сети backend)
- volumes: df-mariadata — база данных mariadb находится в persistent volume контейнера (/var/lib/docker/volumes), та же история с костомизируемыми нами файлами в CMS WordPress (wp-content)
Для запуска в сессии, с полным просмотром всех логов, выполните (ctrl+c останавливает процесс):
docker-compose up
Для запуска в фоновом режиме, будет так (тогда в помощь для логов ‘docker logs …’):
docker-compose up -d
Теперь можно переходить в:
- http://localhost:8080 — для WordPress
- http://localhost:8090 — для phpMyAdmin
Однако там будет небольшой косяк с выбором языка и установке плагинов в дальнейшем (из-за примонтированого persistant и прав внутри wordpress контейнера). Чтобы это исправить и все было ок, достаточно выровнять права внутри командой (это частный случай):
docker exec -ti -u root df-wordpress /bin/bash -c "chown -R www-data:www-data /var/www/html/wp-content"
На этом все, можно работать с нашей системой.
Для обновления всех контейнеров, выполните следующую команду:
docker-compose pull && docker-compose up --force-recreate -d
После обновления, все примонтируется на свои места с исходными настройками, а наши работы сохранятся в persistent volume`s (/var/lib/docker/volumes). Тобишь делаем регулярно бекап этих самых volume и будем вам счастье.
Проверить корректное функционирование и наличие всего (контейнеров, сетей, дисков), можно штатными средствами:
docker ps -a docker network ls docker volume ls docker image ls
Осталось обуздать силу уничтожения. Следует быть осторожнее с этими командами. Удалить контейнеры (но оставить сети и диски):
docker-compose rm
Удалить контейнеры и сети (но оставить диски):
docker-compose down
Удалить все.. контейнеры, сети и даже диски (аккуратно, даже вопросов не задает, сразу сносит):
docker-compose down -v
Ну как бы, на этом пожалуй экскурс можно и закончить. Как видите, можно быстро строить очень гибкие и удобные для обслуживания конфигурации. Для начала, нужно просто начать мыслить ‘docker way’. Дальнейшее МЕГА удобство, комфорт и страсть к Docker обязательно придут.)