- Home »

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