Home » Установка и использование Docker Compose на Ubuntu 24
Установка и использование Docker Compose на Ubuntu 24

Установка и использование Docker Compose на Ubuntu 24

Сегодня поговорим о Docker Compose на Ubuntu 24 — инструменте, который изменил мою жизнь как админа и разработчика. Если вы устали от ручного запуска контейнеров и хотите автоматизировать развёртывание многокомпонентных приложений, эта статья для вас. Мы разберём установку с нуля, рассмотрим практические примеры и узнаем, как Docker Compose может упростить вашу работу с серверами.

В этой статье мы ответим на три ключевых вопроса: как работает Docker Compose и почему он лучше обычного Docker для сложных проектов, как быстро настроить его на Ubuntu 24 с первого раза, и какие есть подводные камни и лучшие практики использования.

Что такое Docker Compose и зачем он нужен

Docker Compose — это инструмент для определения и управления многоконтейнерными приложениями. Представьте: у вас есть веб-приложение, база данных, Redis для кеширования и Nginx как reverse proxy. Без Compose вам нужно запускать каждый контейнер отдельно, помнить все параметры, настраивать сети вручную. С Compose всё это описывается в одном YAML-файле.

Главные преимущества:

  • Декларативный подход — описываете что хотите, а не как это сделать
  • Воспроизводимость — одинаковое окружение на dev, staging и production
  • Простота масштабирования — можно запустить несколько копий сервиса одной командой
  • Изоляция проектов — каждый проект имеет свою сеть и volumes

Установка Docker Compose на Ubuntu 24

Хорошая новость — в Ubuntu 24 процесс установки стал ещё проще. Docker Compose v2 теперь входит в состав Docker Desktop, но для серверов лучше использовать отдельную установку.

Сначала убедимся, что у нас есть Docker:

# Обновляем пакеты
sudo apt update

# Устанавливаем необходимые пакеты
sudo apt install apt-transport-https ca-certificates curl software-properties-common

# Добавляем GPG ключ Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Добавляем репозиторий Docker
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Обновляем список пакетов
sudo apt update

# Устанавливаем Docker Engine
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Добавляем текущего пользователя в группу docker
sudo usermod -aG docker $USER

# Перезапускаем сессию или делаем newgrp docker
newgrp docker

Проверяем установку:

# Проверяем Docker
docker --version

# Проверяем Docker Compose
docker compose version

Если нужен VPS для тестирования, рекомендую взять сервер с минимум 2GB RAM — Docker Compose может быть требователен к ресурсам.

Первый проект: веб-приложение с базой данных

Создадим простой проект для понимания основ. Это будет WordPress с MySQL — классический пример для изучения.

# Создаём директорию проекта
mkdir ~/wordpress-compose
cd ~/wordpress-compose

# Создаём docker-compose.yml
cat > docker-compose.yml << 'EOF'
version: '3.8'

services:
  db:
    image: mysql:8.0
    container_name: wordpress_db
    restart: unless-stopped
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress_password
      MYSQL_ROOT_PASSWORD: root_password
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    container_name: wordpress_app
    restart: unless-stopped
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress_password
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp_data:/var/www/html
    networks:
      - wordpress

volumes:
  db_data:
  wp_data:

networks:
  wordpress:
    driver: bridge
EOF

# Запускаем проект
docker compose up -d

# Проверяем статус
docker compose ps

Теперь WordPress доступен по адресу http://ваш-сервер:8080. Магия в том, что всё настроилось автоматически!

Разбор структуры docker-compose.yml

Давайте разберём, что происходит в файле:

  • version — версия формата Compose файла
  • services — описание контейнеров
  • depends_on — зависимости между сервисами
  • volumes — постоянное хранилище данных
  • networks — изолированные сети для проекта
  • environment — переменные окружения
  • ports — проброс портов
  • restart — политика перезапуска

Полезные команды для работы

Вот команды, которые я использую ежедневно:

# Запуск в фоновом режиме
docker compose up -d

# Просмотр логов
docker compose logs -f

# Логи конкретного сервиса
docker compose logs -f wordpress

# Остановка проекта
docker compose down

# Остановка с удалением volumes
docker compose down -v

# Пересборка образов
docker compose build

# Масштабирование сервиса
docker compose up -d --scale wordpress=3

# Выполнение команды в контейнере
docker compose exec wordpress bash

# Просмотр использования ресурсов
docker compose top

Продвинутый пример: полный web-stack

Теперь создадим более сложный проект — полноценный веб-стек с Nginx, PHP-FPM, MySQL, Redis и мониторингом:

# Создаём новый проект
mkdir ~/web-stack
cd ~/web-stack

# Создаём docker-compose.yml
cat > docker-compose.yml << 'EOF'
version: '3.8'

services:
  nginx:
    image: nginx:alpine
    container_name: web_nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./app:/var/www/html
    depends_on:
      - php
    networks:
      - webstack

  php:
    image: php:8.2-fpm
    container_name: web_php
    restart: unless-stopped
    volumes:
      - ./app:/var/www/html
    depends_on:
      - mysql
      - redis
    networks:
      - webstack

  mysql:
    image: mysql:8.0
    container_name: web_mysql
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: webdb
      MYSQL_USER: webuser
      MYSQL_PASSWORD: webpass
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - webstack

  redis:
    image: redis:7-alpine
    container_name: web_redis
    restart: unless-stopped
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data
    networks:
      - webstack

  adminer:
    image: adminer
    container_name: web_adminer
    restart: unless-stopped
    ports:
      - "8080:8080"
    depends_on:
      - mysql
    networks:
      - webstack

volumes:
  mysql_data:
  redis_data:

networks:
  webstack:
    driver: bridge
EOF

# Создаём директории
mkdir -p nginx/conf.d app

# Конфигурация Nginx
cat > nginx/conf.d/default.conf << 'EOF'
server {
    listen 80;
    server_name localhost;
    root /var/www/html;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
EOF

# Простое PHP приложение
cat > app/index.php << 'EOF'

EOF

# Запускаем стек
docker compose up -d

Мониторинг и логирование

Для production-серверов критически важен мониторинг. Добавим в наш стек Prometheus и Grafana:

# Добавляем в docker-compose.yml
cat >> docker-compose.yml << 'EOF'

  prometheus:
    image: prom/prometheus:latest
    container_name: web_prometheus
    restart: unless-stopped
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    networks:
      - webstack

  grafana:
    image: grafana/grafana:latest
    container_name: web_grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
    volumes:
      - grafana_data:/var/lib/grafana
    networks:
      - webstack
EOF

# Добавляем volume для grafana
echo "  grafana_data:" >> docker-compose.yml

# Создаём конфигурацию Prometheus
mkdir prometheus
cat > prometheus/prometheus.yml << 'EOF'
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
EOF

Управление переменными окружения

Никогда не храните пароли в docker-compose.yml! Используйте .env файлы:

# Создаём .env файл
cat > .env << 'EOF'
MYSQL_ROOT_PASSWORD=supersecretroot
MYSQL_DATABASE=webdb
MYSQL_USER=webuser
MYSQL_PASSWORD=supersecretpass
REDIS_PASSWORD=redispassword
GRAFANA_PASSWORD=grafanapass
EOF

# Обновляем docker-compose.yml
# Заменяем хардкод на переменные
environment:
  MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
  MYSQL_DATABASE: ${MYSQL_DATABASE}
  MYSQL_USER: ${MYSQL_USER}
  MYSQL_PASSWORD: ${MYSQL_PASSWORD}

Не забудьте добавить .env в .gitignore!

Сравнение с альтернативами

Решение Сложность Масштабируемость Подходит для
Docker Compose Низкая Одиночные хосты Dev, небольшие проекты
Kubernetes Высокая Кластеры Enterprise, микросервисы
Docker Swarm Средняя Кластеры Простая оркестрация
Podman Compose Низкая Одиночные хосты Rootless контейнеры

Автоматизация и CI/CD

Docker Compose отлично интегрируется с CI/CD пайплайнами. Вот пример автоматического деплоя:

# Скрипт деплоя
cat > deploy.sh << 'EOF'
#!/bin/bash
set -e

# Обновляем код
git pull origin main

# Пересобираем изменённые сервисы
docker compose build

# Обновляем контейнеры без простоя
docker compose up -d

# Удаляем неиспользуемые образы
docker image prune -f

echo "Деплой завершён!"
EOF

chmod +x deploy.sh

Подводные камни и лучшие практики

За годы работы я наступил на множество граблей. Вот самые важные:

  • Не используйте latest теги — фиксируйте версии образов
  • Всегда используйте restart: unless-stopped для production сервисов
  • Не забывайте про health checks для критичных сервисов
  • Используйте named volumes для важных данных
  • Логируйте правильно — настройте log rotation
  • Следите за ресурсами — устанавливайте limits для контейнеров

Пример с health checks и ограничениями:

services:
  web:
    image: nginx:1.21
    restart: unless-stopped
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 3
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

Интересные фишки и нестандартные способы использования

Docker Compose можно использовать не только для веб-приложений. Вот несколько интересных кейсов:

  • Локальная разработка — полная копия production окружения
  • Микросервисы — каждый сервис в отдельном контейнере
  • Data science — Jupyter, PostgreSQL, Redis для ML пайплайнов
  • Тестирование — изолированные окружения для тестов
  • Backup системы — автоматические бэкапы баз данных

Пример для data science:

services:
  jupyter:
    image: jupyter/scipy-notebook:latest
    ports:
      - "8888:8888"
    environment:
      - JUPYTER_ENABLE_LAB=yes
    volumes:
      - ./notebooks:/home/jovyan/work
    depends_on:
      - postgres
      - redis

  postgres:
    image: postgres:13
    environment:
      POSTGRES_DB: analytics
      POSTGRES_USER: analyst
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_data:/var/lib/postgresql/data

  redis:
    image: redis:6-alpine
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data

Производительность и оптимизация

Для production серверов важна производительность. Несколько советов:

  • Используйте multi-stage builds для уменьшения размера образов
  • Настройте правильные health checks
  • Используйте volume drivers для лучшей производительности IO
  • Настройте лимиты ресурсов для предотвращения "съедания" всей памяти

Для серверов с высокой нагрузкой рекомендую выделенные серверы — они дают максимальную производительность для Docker Compose.

Резервное копирование и восстановление

Автоматизируем бэкапы с помощью дополнительного контейнера:

# Добавляем в docker-compose.yml
  backup:
    image: alpine:latest
    container_name: backup_service
    restart: unless-stopped
    volumes:
      - mysql_data:/backup/mysql:ro
      - ./backups:/backups
    command: >
      sh -c "
        apk add --no-cache dcron &&
        echo '0 2 * * * tar -czf /backups/mysql_backup_$$(date +%Y%m%d_%H%M%S).tar.gz -C /backup mysql' | crontab - &&
        crond -f
      "
    depends_on:
      - mysql

Заключение и рекомендации

Docker Compose — это мощный инструмент, который должен быть в арсенале каждого системного администратора и разработчика. Он значительно упрощает развёртывание и управление многокомпонентными приложениями.

Когда использовать Docker Compose:

  • Разработка локальных окружений
  • Небольшие и средние production проекты
  • Прототипирование архитектуры
  • Автоматизация тестирования

Когда НЕ использовать:

  • Большие кластеры (лучше Kubernetes)
  • Проекты, требующие сложной оркестрации
  • Высоконагруженные системы с автоскейлингом

Docker Compose на Ubuntu 24 работает стабильно и предсказуемо. Главное — следовать лучшим практикам, не забывать про безопасность и мониторинг. Начните с простых проектов, постепенно усложняя конфигурацию.

Полезные ссылки:

Удачи в настройке ваших проектов! Docker Compose сделает вашу жизнь проще, обещаю.


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

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

Leave a reply

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