Полное руководство по развертыванию приложений с помощью Docker Compose: простота самохостинга
Узнайте, как легко развертывать приложения на своем сервере с помощью Docker Compose. Пошаговое руководство для новичков и опытных пользователей. Полное руководство по самохостингу приложений.
Введение в Docker Compose
Docker Compose — это инструмент для определения и запуска многоконтейнерных приложений Docker. С помощью простого YAML-файла можно описать всю инфраструктуру вашего приложения: веб-сервер, базу данных, кэш и другие компоненты. Это позволяет запускать все приложение одной командой.
Установка Docker Compose
Установка Docker Compose на разных операционных системах
# Ubuntu/Debian
sudo apt update
sudo apt install docker.io
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# CentOS/RHEL/Fedora
sudo yum install docker
sudo systemctl start docker
sudo systemctl enable docker
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# macOS
brew install docker-compose
# Windows
# Установите Docker Desktop for Windows
# Проверка установки
docker-compose --versionОсновные концепции Docker Compose
Docker Compose — это инструмент оркестровки контейнеров, который позволяет определять и запускать многоконтейнерные приложения с помощью одного YAML-файла. Ключевые компоненты: сервисы, сети, тома, переменные окружения, сборка образов.
Структура docker-compose.yml
Базовая структура файла docker-compose.yml и пример конфигурации для веб-приложения
version: '3.8'
services:
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
- ./ssl:/etc/nginx/ssl
depends_on:
- app
networks:
- app-network
app:
build: ./app
expose:
- "8000"
environment:
- NODE_ENV=production
- DB_HOST=db
- DB_PORT=5432
- DB_NAME=myapp
- DB_USER=user
- DB_PASSWORD=password
volumes:
- ./app:/app
depends_on:
- db
networks:
- app-network
db:
image: postgres:13
environment:
POSTGRES_DB: myapp
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db-data:/var/lib/postgresql/data
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
db-data:Расширенные возможности Docker Compose
Работа с переменными окружения, сетями, томами, ограничениями ресурсов и другими продвинутыми функциями
# Работа с переменными окружения
version: '3.8'
services:
db:
image: postgres:${POSTGRES_VERSION:-13}
environment:
POSTGRES_USER: ${DB_USER:-user}
POSTGRES_PASSWORD: ${DB_PASSWORD:-password}
volumes:
- db-data:/var/lib/postgresql/data
# Управление сетями
networks:
frontend:
driver: bridge
backend:
driver: bridge
ipam:
config:
- subnet: 172.16.238.0/24
# Работа с томами
services:
db:
image: postgres:13
volumes:
# Использование именованного тома
- pgdata:/var/lib/postgresql/data
# Или привязка хост-директории
- ./data:/var/lib/postgresql/data:rw
# Установка ограничений ресурсов
services:
app:
image: myapp:latest
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.2'
memory: 256MОсновные команды Docker Compose
Основные команды для работы с Docker Compose: запуск сервисов, просмотр статуса, работа с логами, управление контейнерами и т.д.
# Запуск всех сервисов
docker-compose up -d
# Параметры:
# -d — запустить в фоновом режиме
# --build — пересобрать образы перед запуском
# --force-recreate — пересоздать контейнеры даже если конфигурация не изменилась
# Просмотр статуса сервисов
docker-compose ps
# Пересобрать образы
docker-compose build
# Просмотр логов
docker-compose logs
docker-compose logs -f web # Следить за логами в реальном времени
docker-compose logs --tail=50 web # Показать последние N строк
# Перезапуск сервисов
docker-compose restart app
# Остановка и удаление контейнеров
docker-compose down # Остановить и удалить контейнеры, сети, но не тома
docker-compose down -v # Остановить и удалить всё, включая тома
# Масштабирование сервисов
docker-compose up -d --scale app=3Развертывание приложений с помощью Docker Compose
Особенности использования Docker Compose для разработки и продакшена, использование в CI/CD
# Для разработки
version: '3.8'
services:
app:
build: .
volumes:
- .:/app # Монтирование всего проекта
environment:
- NODE_ENV=development
command: npm run dev
# Для продакшена
version: '3.8'
services:
app:
image: mycompany/myapp:${TAG:-latest}
restart: unless-stopped
environment:
- NODE_ENV=production
- DATABASE_URL=postgres://user:pass@db:5432/mydb
depends_on:
db:
condition: service_healthy
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- db-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5Решение распространенных проблем
Как решать типичные проблемы при работе с Docker Compose: конфликты портов, проблемы с подключением к базе данных, проблемы с правами доступа и др.
# Проблема 1: Конфликт портов
# Решение: Измените пробрасываемые порты
services:
web:
ports:
- "8080:80" # Используйте другой порт хоста
# Проблема 2: Не удается подключиться к базе данных
# Проверьте сетевое взаимодействие
docker-compose exec app ping db
# Проверьте логи сервиса базы данных
docker-compose logs db
# Проблема 3: Проблемы с правами доступа
# Для настройки прав на хост-системе:
sudo chown -R 1000:1000 ./app
# Проблема 4: Не обновляются изменения в коде
# Используйте пересборку образа:
docker-compose up -d --build app
# Проблема 5: Недостаточно памяти
# Проверьте использование памяти:
docker stats
# Установите ограничения для сервисов:
services:
app:
deploy:
resources:
limits:
memory: 1GЛучшие практики и рекомендации
Рекомендации по организации проектов, оптимизации образов, безопасности и мониторингу при работе с Docker Compose
# Организация проекта
project/
├── docker-compose.yml
├── docker-compose.dev.yml
├── docker-compose.prod.yml
├── .env
├── services/
│ ├── web/
│ │ ├── Dockerfile
│ │ ├── package.json
│ │ └── ...
│ ├── app/
│ │ ├── Dockerfile
│ │ ├── package.json
│ │ └── ...
│ └── db/
│ ├── Dockerfile
│ └── ...
└── nginx/
├── nginx.conf
└── ...
# Оптимизация образов - многостадийная сборка
# Dockerfile.prod
FROM node:16 as builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:16-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
RUN npm run build
CMD ["npm", "start"]
# Безопасность - использование .env файлов для секретов
version: '3.8'
services:
app:
image: myapp:latest
environment:
- DATABASE_URL=${DATABASE_URL}