Введение
Контейнеризация приложений стала стандартом де-факто в современной IT-инфраструктуре. В этой статье мы подробно рассмотрим, как развернуть PowerDNS — мощный DNS-сервер — в Docker-контейнере на операционной системе Debian 13. Это решение идеально подходит для тех, кто хочет обеспечить высокую доступность, простоту развертывания и масштабируемость DNS-инфраструктуры.
Почему PowerDNS в Docker?
PowerDNS — это высокопроизводительный DNS-сервер, который предлагает гибкость и мощные функции. Развертывание его в Docker-контейнере предоставляет несколько ключевых преимуществ:
- Изоляция: PowerDNS работает в изолированной среде
- Переносимость: Контейнеры можно легко переносить между системами
- Масштабируемость: Простое масштабирование
- Упрощенное обновление: Обновление версий без влияния на хост-систему
1: Установка Docker на Debian 13
Первым шагом установим Docker на вашу систему Debian 13.
#Выполните следующую команду, чтобы удалить все конфликтующие пакеты:
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
#Установка репозитория
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
#Установка Docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
2: Создание docker-compose.yml
Создадим файл docker-compose.yml для развертывания PowerDNS:
#Создадим дирикторию где будет находиться
mkdir -p /opt/docker/powerdns
services:
db:
image: postgres:15
container_name: pdns-db
restart: unless-stopped
environment:
POSTGRES_USER: pdns
POSTGRES_PASSWORD: yQt5z5T7mv4uQIw
POSTGRES_DB: pdns # Changed from powerdns to pdns
volumes:
- /opt/docker/powerdns/pdns-postgres:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U pdns -d pdns"] # Added database name
interval: 5s
timeout: 5s
retries: 5
powerdns:
image: pschiffe/pdns-pgsql:latest
container_name: pdns
restart: unless-stopped
depends_on:
db:
condition: service_healthy
environment:
PDNS_gpgsql_host: db
PDNS_gpgsql_user: pdns
PDNS_gpgsql_password: yQt5z5T7mv4uQIw
PDNS_gpgsql_dbname: pdns # Changed from powerdns to pdns
PDNS_api: "yes"
PDNS_api_key: gBCq1ms7TEp8B3z
PDNS_webserver: "yes"
PDNS_webserver_address: "0.0.0.0"
PDNS_webserver_allow_from: "0.0.0.0/0"
PDNS_version_string: "powerdns-docker"
ports:
- "53:53"
- "53:53/udp"
- "8081:8081"
pdns-admin:
image: pschiffe/pdns-admin:latest
container_name: pdns-admin
restart: unless-stopped
depends_on:
db:
condition: service_healthy
powerdns:
condition: service_started
environment:
PDNS_ADMIN_SQLA_DB_TYPE: postgres
PDNS_ADMIN_SQLA_DB_HOST: db
PDNS_ADMIN_SQLA_DB_USER: pdns
PDNS_ADMIN_SQLA_DB_PASSWORD: yQt5z5T7mv4uQIw
PDNS_ADMIN_SQLA_DB_NAME: pdns
PDNS_ADMIN_SQLA_DB_PORT: 5432
PDNS_ADMIN_SECRET_KEY: ZVHqGBjDaT9tJab
PDNS_ADMIN_PDNS_API_URL: http://pdns.ruzatd.ru:8081
PDNS_ADMIN_PDNS_API_KEY: gBCq1ms7TEp8B3z
PDNS_ADMIN_PDNS_SERVER_VERSION: "4"
# Добавьте эти переменные для настройки Caddy
CADDY_PORT: 80
CADDY_BIND: 0.0.0.0
ports:
- "9191:8080"
volumes:
db_data:
Запуск PowerDNS в Docker
Запустим наши контейнеры с помощью Docker Compose:
cd /opt/docker/powerdns
docker compose up -d
Проверим статус контейнеров:
docker compose ps
Проверка работы PowerDNS
Проверим, что PowerDNS работает корректно:
# Проверяем логи
docker logs powerdns
Настройка резервного копирования
mkdir -p /usr/scripts/docker/powerdns
nano /usr/scripts/docker/powerdns/backup_pdns.sh
Добавим в скрипт следующее содержимое:
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="BACKUP_DIR\$DATE"
RETENTION_DAYS=30
# Создаем директорию для бекапов
mkdir -p $BACKUP_DIR
echo "Starting PowerDNS backup at $(date)"
# 1. Делаем дамп базы данных
echo "Creating database dump..."
docker exec pdns-db pg_dump -U pdns -d pdns | zstd -T0 -9 > $BACKUP_DIR/pdns_db_$DATE.sql.zst
# 2. Архивируем данные PostgreSQL с использованием zstd
echo "Archiving PostgreSQL data directory..."
tar -cf - /opt/docker/powerdns/pdns-postgres | zstd -T0 -9 > $BACKUP_DIR/pdns_data_$DATE.tar.zst
# 3. Копируем docker-compose файл
echo "Backing up docker-compose file..."
cp /path/to/your/docker-compose.yml $BACKUP_DIR/docker-compose_$DATE.yml
# 4. Проверяем целостность архивов
echo "Verifying backup integrity..."
zstd -t $BACKUP_DIR/pdns_db_$DATE.sql.zst && echo "Database backup integrity verified"
zstd -t $BACKUP_DIR/pdns_data_$DATE.tar.zst && echo "Data directory backup integrity verified"
# 5. Удаляем старые бекапы
echo "Cleaning up old backups (older than $RETENTION_DAYS days)..."
find $BACKUP_DIR -name "*.zst" -mtime +$RETENTION_DAYS -delete
find $BACKUP_DIR -name "*.yml" -mtime +$RETENTION_DAYS -delete
echo "Backup completed successfully at $(date)"
echo "Backup files:"
ls -lh $BACKUP_DIR/*_$DATE.*
Сделаем скрипт исполняемым и добавим в cron:
chmod +x /usr/scripts/docker/powerdns/backup_pdns.sh
crontab -e
Добавим строку для ежедневного резервного копирования:
0 2 * * * /usr/scripts/docker/powerdns/backup_pdns.sh
Заключение
В этой статье мы рассмотрели процесс развертывания PowerDNS в Docker-контейнере на Debian 13. Такой подход обеспечивает изоляцию сервиса, упрощает обновление и масштабирование DNS-инфраструктуры.
Ключевые преимущества решения:
- Простота развертывания и управления
- Высокая доступность и отказоустойчивость
- Легкое масштабирование с помощью Docker Compose
- Упрощенное резервное копирование и восстановление