- Home »

Установка и использование Docker Compose на последний CentOS
Если ты работаешь с контейнерами в продакшене, то без Docker Compose уже не обойтись. Это не просто «еще один инструмент» — это кардинальное изменение подхода к деплойменту и оркестрации. Сегодня разберемся, как правильно поставить и настроить Docker Compose на CentOS, чтобы твоя инфраструктура заработала как часы.
Docker Compose решает три главные боли: управление многоконтейнерными приложениями, воспроизводимость окружения и упрощение CI/CD. Вместо того чтобы каждый раз вручную запускать десятки docker run с километровыми параметрами, ты описываешь всю архитектуру в одном YAML-файле. Магия? Почти.
Как это работает под капотом
Docker Compose — это надстройка над Docker Engine, которая читает декларативное описание сервисов и превращает его в набор команд Docker API. Внутри происходит примерно следующее:
- Парсинг — Compose читает docker-compose.yml и валидирует структуру
- Создание сетей — автоматически создает изолированные Docker networks для проекта
- Сборка/загрузка образов — либо собирает из Dockerfile, либо пуллит готовые
- Оркестрация — запускает контейнеры в правильном порядке с учетом зависимостей
- Мониторинг — отслеживает состояние и может перезапускать упавшие сервисы
Compose создает для каждого проекта отдельную сеть вида projectname_default
, что позволяет контейнерам общаться друг с другом по именам сервисов. Это намного удобнее, чем настраивать линки вручную.
Установка Docker Compose на CentOS: пошаговое руководство
Перед установкой Compose нужно убедиться, что Docker Engine уже установлен. Если нет — сначала ставим его:
# Обновляем систему
sudo yum update -y
# Устанавливаем необходимые пакеты
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Добавляем официальный репозиторий Docker
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# Устанавливаем Docker CE
sudo yum install -y docker-ce docker-ce-cli containerd.io
# Запускаем и добавляем в автозагрузку
sudo systemctl start docker
sudo systemctl enable docker
# Проверяем установку
sudo docker version
Теперь устанавливаем Docker Compose. Есть несколько способов, но самый надежный — скачать бинарник с GitHub:
# Скачиваем последнюю стабильную версию
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# Делаем исполняемым
sudo chmod +x /usr/local/bin/docker-compose
# Создаем симлинк для удобства
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# Проверяем установку
docker-compose --version
Альтернативный способ через pip (если Python уже установлен):
# Устанавливаем pip, если нет
sudo yum install -y python3-pip
# Устанавливаем Docker Compose
sudo pip3 install docker-compose
# Проверяем
docker-compose --version
Первый проект: классический LAMP-стек
Создадим простой пример с Apache, MySQL и PHP. Это покажет основные принципы работы с Compose:
# Создаем структуру проекта
mkdir ~/lamp-compose && cd ~/lamp-compose
mkdir -p web/html web/config
Создаем docker-compose.yml:
version: '3.8'
services:
web:
image: php:8.1-apache
container_name: lamp_web
ports:
- "80:80"
volumes:
- ./web/html:/var/www/html
- ./web/config/php.ini:/usr/local/etc/php/php.ini
depends_on:
- db
environment:
- APACHE_DOCUMENT_ROOT=/var/www/html
networks:
- lamp-network
db:
image: mysql:8.0
container_name: lamp_db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: myapp
MYSQL_USER: appuser
MYSQL_PASSWORD: apppass
volumes:
- db_data:/var/lib/mysql
- ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
networks:
- lamp-network
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: lamp_pma
ports:
- "8080:80"
environment:
PMA_HOST: db
PMA_PORT: 3306
PMA_USER: root
PMA_PASSWORD: rootpassword
depends_on:
- db
networks:
- lamp-network
volumes:
db_data:
networks:
lamp-network:
driver: bridge
Создаем тестовый PHP-файл:
# Создаем простой index.php
cat > web/html/index.php << 'EOF'
EOF
Запускаем стек:
# Запускаем в фоновом режиме
docker-compose up -d
# Проверяем статус
docker-compose ps
# Смотрим логи
docker-compose logs -f web
Продвинутые возможности и real-world примеры
Для продакшена нужны более сложные конфигурации. Вот пример с мониторингом, балансировкой и масштабированием:
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./ssl:/etc/ssl
depends_on:
- app
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
app:
build: .
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://user:pass@db:5432/myapp
depends_on:
- db
- redis
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
failure_action: rollback
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
db:
image: postgres:14
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
volumes:
- postgres_data:/var/lib/postgresql/data
- ./db/init.sql:/docker-entrypoint-initdb.d/init.sql
deploy:
placement:
constraints: [node.labels.database == true]
redis:
image: redis:7-alpine
command: redis-server --appendonly yes
volumes:
- redis_data:/data
monitoring:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
volumes:
postgres_data:
redis_data:
prometheus_data:
networks:
default:
driver: overlay
attachable: true
Сравнение с альтернативами
Инструмент | Сложность | Масштабируемость | Экосистема | Использование |
---|---|---|---|---|
Docker Compose | Низкая | Один хост | Отличная | Dev, staging, малые проекты |
Kubernetes | Высокая | Мульти-хост | Огромная | Enterprise, большие проекты |
Docker Swarm | Средняя | Мульти-хост | Средняя | Средние проекты |
Podman Compose | Низкая | Один хост | Растущая | Rootless окружения |
Полезные команды и трюки
Набор команд, которые спасут тебе жизнь в продакшене:
# Проверка конфигурации без запуска
docker-compose config
# Пересборка образов без кеша
docker-compose build --no-cache
# Масштабирование сервиса
docker-compose up -d --scale web=3
# Просмотр ресурсов
docker-compose top
# Выполнение команды в запущенном контейнере
docker-compose exec web bash
# Создание бэкапа базы данных
docker-compose exec db mysqldump -u root -p myapp > backup.sql
# Мониторинг логов в реальном времени
docker-compose logs -f --tail=100 web
# Остановка с удалением volumes
docker-compose down -v
# Перезапуск только одного сервиса
docker-compose restart web
Автоматизация и интеграция в CI/CD
Docker Compose отлично интегрируется с системами автоматизации. Вот пример скрипта для автоматического деплоя:
#!/bin/bash
# deploy.sh
set -e
PROJECT_NAME="myapp"
COMPOSE_FILE="docker-compose.prod.yml"
BACKUP_DIR="/backups"
echo "Starting deployment of $PROJECT_NAME..."
# Создаем бэкап базы данных
echo "Creating database backup..."
docker-compose exec -T db mysqldump -u root -p$MYSQL_ROOT_PASSWORD $MYSQL_DATABASE > $BACKUP_DIR/db_backup_$(date +%Y%m%d_%H%M%S).sql
# Пуллим новые образы
echo "Pulling latest images..."
docker-compose -f $COMPOSE_FILE pull
# Пересобираем сервисы
echo "Rebuilding services..."
docker-compose -f $COMPOSE_FILE build
# Рестарт с новыми образами
echo "Restarting services..."
docker-compose -f $COMPOSE_FILE up -d
# Проверяем здоровье сервисов
echo "Checking service health..."
sleep 30
for service in web db; do
if ! docker-compose -f $COMPOSE_FILE ps $service | grep -q "Up"; then
echo "Service $service is not running! Rolling back..."
docker-compose -f $COMPOSE_FILE down
exit 1
fi
done
echo "Deployment completed successfully!"
# Очистка старых образов
docker image prune -f
Мониторинг и отладка
Для production-ready решения нужен нормальный мониторинг. Добавляем в docker-compose.yml:
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/dashboards:/var/lib/grafana/dashboards
- ./grafana/provisioning:/etc/grafana/provisioning
node-exporter:
image: prom/node-exporter:latest
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.ignored-mount-points'
- '^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)'
Безопасность и best practices
Несколько критически важных моментов:
- Никогда не используй root — создавай отдельных пользователей для каждого сервиса
- Секреты в переменных окружения — используй docker secrets или внешние системы типа Vault
- Ограничивай ресурсы — всегда задавай limits для CPU и памяти
- Используй healthchecks — это спасет тебя от «зомби» контейнеров
- Регулярно обновляй образы — уязвимости в base images — это боль
Пример безопасной конфигурации:
version: '3.8'
services:
web:
image: nginx:alpine
user: "101:101" # nginx user
cap_drop:
- ALL
cap_add:
- CHOWN
- DAC_OVERRIDE
- SETGID
- SETUID
read_only: true
tmpfs:
- /tmp
- /var/cache/nginx
deploy:
resources:
limits:
cpus: '0.5'
memory: 256M
reservations:
cpus: '0.25'
memory: 128M
Интеграция с внешними сервисами
Современные приложения редко работают изолированно. Вот как интегрировать Compose с внешними сервисами:
# Подключение к внешней базе данных
version: '3.8'
services:
app:
image: myapp:latest
environment:
- DATABASE_URL=postgresql://user:pass@external-db.amazonaws.com:5432/mydb
networks:
- default
- external-network
networks:
external-network:
external: true
name: bridge
Для работы с облачными провайдерами можно использовать специальные драйверы. Например, для AWS:
# Использование AWS EFS для persistent storage
volumes:
shared-storage:
driver: cloudstor:aws
driver_opts:
backing: shared
Troubleshooting: частые проблемы и решения
Проблема: Контейнеры не могут найти друг друга по имени
Решение: Проверь, что сервисы находятся в одной сети. По умолчанию Compose создает сеть для всех сервисов в файле.
Проблема: Порты уже заняты
Решение: Либо измени порты в docker-compose.yml, либо найди и убей процесс:
# Найти процесс, занимающий порт
sudo netstat -tulpn | grep :80
sudo kill -9 PID
Проблема: Контейнеры постоянно рестартуют
Решение: Проверь логи и добавь healthcheck:
docker-compose logs -f problematic_service
Интересные факты и нестандартные применения
- Docker Compose как тестовое окружение — можешь создать полную копию продакшена для интеграционных тестов
- Compose + Selenium Grid — автоматизация тестирования веб-приложений с браузерами в контейнерах
- Микросервисная архитектура — один Compose файл может содержать десятки сервисов с их зависимостями
- Compose как альтернатива Vagrant — для создания воспроизводимых окружений разработки
Неожиданное применение — использование Compose для создания изолированных сред разработки:
version: '3.8'
services:
dev-env:
image: ubuntu:20.04
volumes:
- ~/projects:/workspace
- ~/.ssh:/root/.ssh:ro
working_dir: /workspace
stdin_open: true
tty: true
command: /bin/bash
code-server:
image: codercom/code-server:latest
ports:
- "8080:8080"
volumes:
- ~/projects:/home/coder/projects
environment:
- PASSWORD=mypassword
Заключение и рекомендации
Docker Compose — это не просто инструмент, это философия. Он превращает хаос из десятков docker run команд в элегантное декларативное описание всей инфраструктуры. Для небольших и средних проектов это оптимальное решение — простое в освоении, мощное в использовании.
Когда использовать Docker Compose:
- Разработка и тестирование многокомпонентных приложений
- Staging-окружения
- Небольшие production-деплойменты на одном сервере
- Прототипирование микросервисной архитектуры
Когда НЕ использовать:
- Высоконагруженные системы, требующие горизонтального масштабирования
- Мульти-хостовые кластеры
- Системы с жесткими требованиями к availability
Если твой проект перерос возможности одного сервера, присмотрись к Kubernetes или Docker Swarm. Но для начала и развития проекта Compose — идеальный выбор.
Для комфортной работы с Docker Compose рекомендую взять VPS с минимум 4GB RAM и SSD дисками. Если планируешь серьезную нагрузку или много сервисов — лучше сразу выделенный сервер.
Compose делает контейнеризацию доступной и понятной. Начни с простых примеров, постепенно усложняй архитектуру и через пару недель будешь деплоить сложные системы одной командой. Это именно тот инструмент, который меняет подход к разработке навсегда.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.