Docker Compose — разворачиваем мультиконтейнерное приложение в пару кликов

Docker Compose — это инструмент, который позволяет одновременно управлять несколькими контейнерами в рамках одного проекта. С помощью файла docker-compose.yml мы можем развернуть сложное приложение, в котором настроим сети, тома и другие параметры.

Для примера возьмем систему мониторинга Zabbix и запустим ее, используя Docker Compose. Наш проект будет состоять из 4 элементов:
PostgreSQL — в роли СУБД для хранения данных
pgAdmin для удобного администрирования PostgreSQL
Zabbix Server для мониторинга
Zabbix Frontend для управления заббиксом

Начнем с установки Docker Compose

Скачиваем
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname
-s)-$(uname -m)" -o /usr/local/bin/docker-compose

Даем права на запуск
chmod +x /usr/local/bin/docker-compose

Проверяем
docker-compose --version

Далее разберем сам файл docker-compose.yml
Я приведу весь файл конфига целиком, а после разберу каждую часть

version: "3"
services:
  devopslife-db:
    image: postgres:15.4
    container_name: devopslife-db-psql
    ports:
      - 5432:5432
    volumes:
      - ./pg_data:/var/lib/postgresql/data/pgdata
    environment:
      POSTGRES_PASSWORD: password123!!!
      POSTGRES_DB: psql-db
      PGDATA: /var/lib/postgresql/data/pgdata
    networks:
      devopslife-network:
        ipv4_address: 172.20.0.2
    restart: always

  pgadmin:
    image: dpage/pgadmin4
    container_name: devopslife-pgadmin
    environment:
      PGADMIN_DEFAULT_EMAIL: admin@devopslife.ru
      PGADMIN_DEFAULT_PASSWORD: password123!!!
    ports:
      - "61231:80"
    networks:
      devopslife-network:
        ipv4_address: 172.20.0.3
    restart: always

  zabbix-server:
    image: zabbix/zabbix-server-pgsql
    depends_on:
      - devopslife-db
    container_name: devopslife-zabbix-server
    environment:
      DB_SERVER_HOST: '172.20.0.2'
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password123!!!
    ports:
      - "10051:10051"
    networks:
      devopslife-network:
        ipv4_address: 172.20.0.4
    restart: always

  zabbix_wgui:
    image: zabbix/zabbix-web-apache-pgsql
    depends_on:
      - devopslife-db
      - zabbix-server
    container_name: devopslife-zabbix-frontend
    environment:
      DB_SERVER_HOST: '172.20.0.2'
      POSTGRES_USER: 'postgres'
      POSTGRES_PASSWORD: password123!!!
      ZBX_SERVER_HOST: "zabbix-server"
      PHP_TZ: "Europe/Moscow"
    ports:
      - "80:8080"
      - "443:8443"
    networks:
      devopslife-network:
        ipv4_address: 172.20.0.5
    restart: always

networks:
  devopslife-network:
    driver: bridge
    ipam:
      config:
      - subnet: 172.20.0.0/24
  • version — версия движка и формата синтаксиса Docker Compose
  • services — сервисы (контейнеры), которые будем запускать
  • devopslife-db — имя сервиса, в данном случае это контейнер с базой данных PostgreSQL 
  • image: postgres — имя образа, используемого для создания контейнера
  • container_name: devopslife-db-psql — имя контейнера, на которое в дальнейшем можно будет ссылаться
  • ports — порты пробрасываемые для доступа к контейнеру, например для подключений извне
  • volumes — тома, примонтированные к контейнеру
  • environment — переменные окружения, доступные в контейнере
  • networks — сеть, к которой будет подключен контейнер
  • devopslife-network — имя сети, к которой будет подключен контейнер
  • ipv4_address — статический ip адрес для контейнера
  • restart: always — перезапуск контейнера в случае остановки

Остальные сервисы действуют по тому же принципу.
Отдельно можно дополнить по последнему networks, но здесь тоже все просто

  • driver: bridge — указывает, что используется мост
  • subnet — подсеть для пользовательской сети

Как видим docker-compose.yml запускает несколько сервисов в разных контейнерах и связывает их между собой с помощью заданной сети. Каждый сервис в свою очередь имеет свои настройки, описанные в файле.

Docker Compose в плане подхода, можно сравнить с Terraform, суть которого заключается в том, чтобы не создавать каждый раз вручную в консоли облачного провайдера сети, инстансы и т.д., а один раз написать конфигурацию, в которой вы укажете, как будет выглядеть ваша инфраструктура. За этим подходом в плане удобства определенно будущее.

Теперь давайте запустим, то что мы написали

Можно запустить с выводом в консоль
docker-compose up

или в бэкграунде
docker-compose up -d

Вывод в консоль полезен тогда, когда запуск пошел не по плану, например контейнер с сервером заббикса постоянно перезапускается, так как образ PostgreSQL 16 версии, а нужен 15 и т.д.
Мы выберем второй вариант. Чтобы посмотреть за процессом, можете выбрать первый

Запускаем и ждем. Как только процесс завершится, проверим, что все в порядке.

docker ps

Рекомендую немного подождать после запуска, особенно если запустили в бэкграунд режиме

Зайдем внутрь контейнера с PostgreSQL

docker exec -it fbdc69851800 bash

Выполним несколько команд

Далее залогинимся в Zabbix (логин-пароль стандартные)

Проверим PgAdmin (логин-пароль в конфиге)

Завершим работу контейнеров

docker compose down

Как видите Docker Compose является весьма удобным инструментом, позволяющим буквально в одну команду развернуть целый сервис

UPD

Чтобы обновиться на новую версию

curl -L "https://github.com/docker/compose/releases/download/`curl -fsSLI -o /dev/null -w %{url_effective} https://github.com/docker/compose/releases/latest | sed 's#.*tag/##g' && echo`/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose

docker-compose -v

Photo by Ian Taylor on Unsplash