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

Установка и использование Docker Compose на Ubuntu 24 — Под хостинг

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

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

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

Docker Compose — это инструмент для определения и запуска многоконтейнерных приложений. Вместо того чтобы запускать каждый контейнер отдельно, ты описываешь всю архитектуру в YAML-файле и управляешь всем стеком одной командой. Это как дирижёр оркестра — он знает, когда какой инструмент должен заиграть.

Основные преимущества:

  • Декларативный подход — описал один раз, запускай где угодно
  • Автоматическое создание сетей между контейнерами
  • Управление зависимостями между сервисами
  • Простое масштабирование и обновление
  • Изоляция окружений (dev, staging, prod)

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

Начнём с установки. В Ubuntu 24.04 есть несколько способов установить Docker Compose, но я покажу самый надёжный.

Способ 1: Через пакетный менеджер (рекомендуется)

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

sudo apt update
sudo apt install docker.io docker-compose-plugin
sudo systemctl enable docker
sudo systemctl start docker
sudo usermod -aG docker $USER

После выполнения команд перелогинься или выполни:

newgrp docker

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

docker compose version

Способ 2: Установка через официальный репозиторий Docker

Этот способ даёт более свежую версию:

# Удаляем старые версии
sudo apt remove docker docker-engine docker.io containerd runc

# Устанавливаем зависимости
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release

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

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

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

Основы работы с Docker Compose

Вся магия Docker Compose заключается в файле `docker-compose.yml`. Это твой план действий, который описывает, какие контейнеры запустить, как они связаны и какие ресурсы им нужны.

Структура docker-compose.yml

Базовая структура выглядит так:

version: '3.8'
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    depends_on:
      - db
  db:
    image: postgres:13
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

Основные команды Docker Compose

# Запуск всех сервисов
docker compose up

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

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

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

# Перезапуск определённого сервиса
docker compose restart web

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

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

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

Практические примеры для хостинга

Пример 1: LAMP стек (Linux, Apache, MySQL, PHP)

Создадим классический LAMP стек для хостинга PHP-приложений:

version: '3.8'
services:
  web:
    image: php:8.2-apache
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./www:/var/www/html
      - ./apache-config:/etc/apache2/sites-available
    depends_on:
      - db
    environment:
      - APACHE_DOCUMENT_ROOT=/var/www/html
    networks:
      - lamp-network

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: webapp
      MYSQL_USER: webuser
      MYSQL_PASSWORD: webpass
    volumes:
      - mysql_data:/var/lib/mysql
      - ./mysql-config:/etc/mysql/conf.d
    ports:
      - "3306:3306"
    networks:
      - lamp-network

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
      - "8080:80"
    environment:
      PMA_HOST: db
      PMA_PORT: 3306
    depends_on:
      - db
    networks:
      - lamp-network

volumes:
  mysql_data:

networks:
  lamp-network:
    driver: bridge

Пример 2: Современный стек с Nginx, Node.js и PostgreSQL

version: '3.8'
services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./ssl:/etc/nginx/ssl
      - static_files:/var/www/static
    depends_on:
      - app
    networks:
      - app-network

  app:
    build: .
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://user:password@db:5432/myapp
      - REDIS_URL=redis://redis:6379
    depends_on:
      - db
      - redis
    volumes:
      - static_files:/app/static
    networks:
      - app-network

  db:
    image: postgres:15
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      - app-network

  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data
    networks:
      - app-network

volumes:
  postgres_data:
  redis_data:
  static_files:

networks:
  app-network:
    driver: bridge

Конфигурация для production окружения

Для продакшена нужно учесть несколько важных моментов:

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

version: '3.8'
services:
  app:
    image: myapp:latest
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
      interval: 30s
      timeout: 10s
      retries: 3
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.2'
          memory: 256M
    restart: unless-stopped

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./ssl:/etc/nginx/ssl:ro
    restart: unless-stopped

Управление секретами

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

# .env файл
POSTGRES_PASSWORD=your_secure_password
REDIS_PASSWORD=another_secure_password
JWT_SECRET=your_jwt_secret
# docker-compose.yml
version: '3.8'
services:
  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    env_file:
      - .env

Оптимизация и лучшие практики

Сравнение подходов к развёртыванию

Характеристика Docker Compose Kubernetes Systemd
Сложность настройки Низкая Высокая Средняя
Масштабирование Ограниченное Отличное Ручное
Подходит для Малые и средние проекты Крупные проекты Системные сервисы
Кривая обучения Пологая Крутая Средняя

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

  • Используй многоэтапные билды для уменьшения размера образов
  • Настрой health checks для всех критичных сервисов
  • Ограничь ресурсы контейнерам, чтобы избежать проблем с памятью
  • Используй volumes для данных, которые должны пережить перезапуск
  • Настрой logrotate для логов контейнеров

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

Docker Compose отлично интегрируется с системами автоматизации. Вот пример скрипта для автоматического развёртывания:

#!/bin/bash
# deploy.sh

set -e

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

# Собираем новые образы
docker compose build

# Обновляем сервисы без downtime
docker compose up -d --no-deps --build web

# Проверяем health status
sleep 10
docker compose ps

# Очищаем старые образы
docker image prune -f

Интеграция с GitHub Actions

# .github/workflows/deploy.yml
name: Deploy
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Deploy to server
        uses: appleboy/ssh-action@v0.1.5
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          key: ${{ secrets.SSH_KEY }}
          script: |
            cd /path/to/your/app
            git pull origin main
            docker compose up -d --build

Решение частых проблем

Проблема: Контейнеры не могут общаться друг с другом

Решение: Убедись, что все сервисы находятся в одной сети. Docker Compose автоматически создаёт сеть, но если ты используешь внешние сети, нужно их явно указать.

Проблема: Данные исчезают после перезапуска

Решение: Используй именованные volumes вместо bind mounts для критичных данных:

volumes:
  - postgres_data:/var/lib/postgresql/data  # Именованный volume
  - ./config:/app/config:ro                 # Bind mount только для чтения

Проблема: Высокое потребление ресурсов

Решение: Установи лимиты ресурсов:

services:
  app:
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 1G

Мониторинг и отладка

Для мониторинга твоих контейнеров можешь добавить Prometheus и Grafana:

version: '3.8'
services:
  prometheus:
    image: prom/prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus

  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
    volumes:
      - grafana_data:/var/lib/grafana

  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    ports:
      - "8080:8080"
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro

volumes:
  prometheus_data:
  grafana_data:

Альтернативы Docker Compose

Хотя Docker Compose — отличный инструмент, стоит знать об альтернативах:

  • Podman Compose — drop-in замена для работы с Podman
  • Docker Swarm — встроенная оркестрация от Docker
  • Kubernetes — для более сложных сценариев
  • Nomad — простая альтернатива Kubernetes от HashiCorp

Интересные факты и нестандартные применения

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

  • Локальная разработка — создавай идентичные окружения для команды
  • Тестирование — быстро поднимай тестовые окружения
  • Микросервисы — управляй сложными архитектурами
  • ML/AI пайплайны — оркестрируй обучение моделей
  • Бэкапы — создавай сервисы для автоматического бэкапа

Где взять сервер для экспериментов

Для тестирования Docker Compose тебе понадобится сервер. Рекомендую начать с VPS с минимум 2GB RAM и 20GB дискового пространства. Для более серьёзных проектов стоит рассмотреть выделенный сервер.

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

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

  • Быстрого развёртывания приложений
  • Создания reproducible окружений
  • Упрощения управления многоконтейнерными приложениями
  • Автоматизации процессов развёртывания

Начни с простых примеров, постепенно усложняя конфигурацию. Не забывай про безопасность — используй переменные окружения для секретов, настраивай health checks и мониторинг. И помни: лучший docker-compose.yml — это тот, который работает стабильно и понятен твоим коллегам.

Удачи в containerization! И не забудь сделать бэкап перед первым `docker compose down` в продакшене — все мы через это прошли 😉


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

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

Leave a reply

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