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