- Home »

Как установить Docker Compose на Ubuntu 24
Если вы развёртываете приложения на серверах, то наверняка сталкивались с тем, что контейнеризация — это не просто модная штука, а реальная необходимость. Docker Compose позволяет определять и запускать многоконтейнерные приложения одной командой, что кардинально упрощает жизнь девопсам и разработчикам. На Ubuntu 24 (последней LTS) процесс установки имеет свои нюансы, особенно после того, как Docker изменил подход к распространению своих инструментов.
В этой статье разберём три ключевых момента: как работает Docker Compose в контексте современной экосистемы Docker, пошаговую установку на Ubuntu 24 с учётом всех подводных камней, и практические примеры использования с реальными кейсами. Если вам нужен VPS для тестирования или выделенный сервер для продакшена, то эта информация будет особенно полезна.
Как работает Docker Compose: от V1 к V2
Docker Compose прошёл серьёзную эволюцию. Если раньше это была отдельная утилита docker-compose
(написанная на Python), то теперь это плагин для Docker CLI — docker compose
. Разница не только в синтаксисе, но и в архитектуре:
- V1 (legacy): Отдельный бинарник, устанавливался через pip или curl
- V2 (current): Плагин Docker CLI, написанный на Go, более быстрый и интегрированный
Важный момент: с версии Docker Desktop и современных установок Docker Engine, Compose V2 идёт в комплекте. Но на серверных дистрибутивах это не всегда так, поэтому нужно знать, как правильно это настроить.
Установка Docker Engine: фундамент для Compose
Прежде чем устанавливать Compose, убедимся, что у нас есть свежий Docker Engine. Ubuntu 24 поставляется с устаревшей версией Docker в стандартных репозиториях, поэтому используем официальный репозиторий:
# Обновляем систему
sudo apt update && sudo apt upgrade -y
# Устанавливаем зависимости
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
# Добавляем 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=amd64 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-compose-plugin -y
# Добавляем пользователя в группу docker
sudo usermod -aG docker $USER
# Перезапускаем сессию или используем newgrp
newgrp docker
Обратите внимание на пакет docker-compose-plugin
— это и есть Compose V2. После установки проверим:
# Проверяем версию Docker
docker --version
# Проверяем версию Compose
docker compose version
Альтернативные способы установки Docker Compose
Если по каким-то причинам плагин не установился или вам нужна специфическая версия, есть несколько альтернатив:
Метод 1: Ручная установка плагина
# Создаём директорию для плагинов
mkdir -p ~/.docker/cli-plugins/
# Скачиваем последнюю версию Compose
curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
# Делаем файл исполняемым
chmod +x ~/.docker/cli-plugins/docker-compose
# Проверяем установку
docker compose --version
Метод 2: Установка Compose V1 (legacy)
Иногда для совместимости со старыми скриптами нужен именно V1:
# Устанавливаем через pip
sudo apt install python3-pip -y
pip3 install docker-compose
# Или через curl
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# Проверяем
docker-compose --version
Практические примеры и кейсы
Теперь, когда у нас всё настроено, давайте разберём реальные сценарии использования.
Кейс 1: Веб-приложение с базой данных
Создадим простой стек NGINX + PostgreSQL:
# Создаём рабочую директорию
mkdir ~/docker-test && cd ~/docker-test
# Создаём docker-compose.yml
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- db
networks:
- webnet
db:
image: postgres:15
environment:
POSTGRES_DB: myapp
POSTGRES_USER: admin
POSTGRES_PASSWORD: secure_password
volumes:
- db_data:/var/lib/postgresql/data
networks:
- webnet
volumes:
db_data:
networks:
webnet:
driver: bridge
EOF
# Создаём простую HTML страницу
mkdir html
echo "Hello from Docker Compose!
" > html/index.html
# Запускаем
docker compose up -d
# Проверяем статус
docker compose ps
Кейс 2: Мониторинг стек (Prometheus + Grafana)
Это более сложный пример для мониторинга инфраструктуры:
cat > docker-compose-monitoring.yml << 'EOF'
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana_data:/var/lib/grafana
depends_on:
- prometheus
volumes:
prometheus_data:
grafana_data:
EOF
# Создаём конфиг для Prometheus
cat > prometheus.yml << 'EOF'
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
EOF
# Запускаем мониторинг
docker compose -f docker-compose-monitoring.yml up -d
Сравнение методов установки
Метод | Плюсы | Минусы | Рекомендация |
---|---|---|---|
Docker Plugin (V2) | Интегрирован с Docker CLI, быстрый, официальный | Может требовать обновления Docker Engine | Для новых проектов |
Standalone V1 | Независимый от Docker Engine, привычный синтаксис | Устаревший, медленнее, больше зависимостей | Только для legacy проектов |
Через pip | Простая установка | Зависимость от Python, версия может отставать | Для разработки |
Продвинутые возможности и автоматизация
Docker Compose открывает множество возможностей для автоматизации. Вот несколько интересных паттернов:
Профили для разных окружений
services:
web:
image: nginx:alpine
# Базовый сервис всегда запускается
db:
image: postgres:15
# Базовый сервис всегда запускается
redis:
image: redis:alpine
profiles:
- development
- testing
monitoring:
image: grafana/grafana
profiles:
- production
# Запуск только для разработки
# docker compose --profile development up
# Запуск для продакшена
# docker compose --profile production up
Использование переменных окружения
# Создаём .env файл
cat > .env << 'EOF'
APP_PORT=8080
DB_PASSWORD=super_secure_password
COMPOSE_PROJECT_NAME=myapp
EOF
# В docker-compose.yml используем переменные
services:
web:
ports:
- "${APP_PORT}:80"
db:
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
Healthchecks и зависимости
services:
db:
image: postgres:15
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
web:
image: nginx:alpine
depends_on:
db:
condition: service_healthy
Интеграция с CI/CD и скриптами
Docker Compose отлично интегрируется с системами автоматизации:
#!/bin/bash
# Скрипт для автоматического деплоя
set -e
echo "Pulling latest images..."
docker compose pull
echo "Building custom images..."
docker compose build
echo "Running database migrations..."
docker compose run --rm web python manage.py migrate
echo "Starting services..."
docker compose up -d
echo "Waiting for services to be ready..."
sleep 10
echo "Running health checks..."
docker compose ps
echo "Deployment completed!"
Troubleshooting: частые проблемы и решения
- Ошибка "permission denied": Убедитесь, что пользователь добавлен в группу docker
- Порты заняты: Используйте
docker compose ps
иnetstat -tulpn
для диагностики - Проблемы с DNS: Проверьте настройки сети в compose файле
- Медленный старт: Используйте
docker compose up --parallel
Полезные команды для диагностики:
# Логи всех сервисов
docker compose logs -f
# Логи конкретного сервиса
docker compose logs web
# Выполнение команд в контейнере
docker compose exec web bash
# Пересоздание сервисов
docker compose up --force-recreate
# Очистка неиспользуемых ресурсов
docker system prune -a
Альтернативы Docker Compose
Хотя Docker Compose является стандартом де-факто, стоит знать об альтернативах:
- Podman Compose: Совместимая с Docker альтернativa без демона
- Kubernetes: Для более сложных сценариев оркестрации
- Nomad: Простая альтернатива от HashiCorp
- Swarm Mode: Встроенная в Docker оркестрация
Статистика показывает, что 65% разработчиков используют Docker Compose для локальной разработки, а 40% — для продакшен деплоймента малых и средних приложений.
Интересные факты и нестандартное использование
Docker Compose можно использовать не только для веб-приложений:
- Desktop приложения: Запуск GUI приложений через X11 forwarding
- Тестирование: Создание изолированных тестовых окружений
- Машинное обучение: Оркестрация Jupyter notebooks с GPU поддержкой
- Сетевые лаборатории: Эмуляция сложных сетевых топологий
Пример запуска GUI приложения:
services:
firefox:
image: jlesage/firefox
ports:
- "5800:5800"
volumes:
- /tmp/.X11-unix:/tmp/.X11-unix
environment:
- DISPLAY=${DISPLAY}
Заключение и рекомендации
Docker Compose на Ubuntu 24 — это мощный инструмент, который должен быть в арсенале каждого системного администратора и разработчика. Рекомендую:
- Используйте Docker Compose V2 для всех новых проектов
- Структурируйте проекты с помощью профилей и переменных окружения
- Не забывайте про мониторинг и логирование в production
- Изучите Docker Swarm для более сложных сценариев
- Автоматизируйте деплойменты с помощью CI/CD
Для тестирования и разработки идеально подойдёт VPS, а для продакшена с высокими нагрузками лучше использовать выделенные серверы.
Docker Compose значительно упрощает управление контейнерами и позволяет сосредоточиться на разработке, а не на конфигурировании инфраструктуры. Официальную документацию можно найти на docs.docker.com/compose/.
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.