Home » Установка и использование Docker Compose на последний CentOS
Установка и использование Docker Compose на последний CentOS

Установка и использование 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 делает контейнеризацию доступной и понятной. Начни с простых примеров, постепенно усложняй архитектуру и через пару недель будешь деплоить сложные системы одной командой. Это именно тот инструмент, который меняет подход к разработке навсегда.


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

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

Leave a reply

Your email address will not be published. Required fields are marked