- Home »

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