Docker Compose или знакомство с родителями

Не так давно я писал о 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 (упор делаем на официальные образы):

Так, вроде все нашли. Что дальше? Внимательно читаем описания на каждой странице, и начинаем писать свой конфиг 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

Теперь можно переходить в:

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

Добавить комментарий