Как запустить сайт в Docker Compose с нуля: пошаговый гайд
От установки Docker до работающего сайта с HTTPS за один вечер
Введение
Docker Compose — это инструмент, который позволяет описать все компоненты вашего сайта (веб-сервер, базу данных, кэш, приложение) в одном YAML-файле и запустить их одной командой. Если вы никогда не работали с контейнерами, этот гайд проведёт вас от установки Docker до работающего сайта с HTTPS.
Мы рассмотрим типичный стек: Nginx как reverse proxy, приложение на Node.js (или любом другом языке), база данных PostgreSQL и Certbot для автоматического получения SSL-сертификатов. Все шаги проверены на Ubuntu 22.04, но подойдут и для других Linux-дистрибутивов.
Требования
Сервер или локальная машина с Linux (Ubuntu 20.04+), macOS или Windows с WSL2.
Права sudo.
Базовые навыки работы в терминале.
Доменное имя (для настройки HTTPS) — опционально, но рекомендуется.
Установленный Git для клонирования репозитория.
Шаг 1. Установка Docker и Docker Compose
Самый простой способ — использовать официальный скрипт установки:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.shПосле установки добавьте своего пользователя в группу docker, чтобы не использовать sudo каждый раз:
sudo usermod -aG docker $USER
newgrp dockerПроверьте версии:
docker --version
docker compose versionСовременный Docker включает плагин Compose как docker compose (без дефиса). Если у вас старая версия, установите отдельно docker-compose.
Шаг 2. Подготовка структуры проекта
Создайте папку для проекта и перейдите в неё:
mkdir my-site && cd my-siteВнутри будут следующие файлы и папки:
docker-compose.yml— основной файл конфигурации.app/— исходный код вашего приложения.nginx/— конфигурация Nginx.certbot/— для сертификатов Let's Encrypt..env— переменные окружения (пароли, ключи).
Создайте их:
mkdir -p app nginx certbot/conf certbot/wwwШаг 3. Написание docker-compose.yml
Создайте файл docker-compose.yml в корне проекта. Пример для стека Nginx + Node.js + PostgreSQL:
version: '3.8'
services:
db:
image: postgres:15-alpine
restart: always
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: ${DB_NAME}
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- app-network
app:
build: ./app
restart: always
environment:
DATABASE_URL: postgres://${DB_USER}:${DB_PASSWORD}@db:5432/${DB_NAME}
depends_on:
- db
networks:
- app-network
nginx:
image: nginx:alpine
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
depends_on:
- app
networks:
- app-network
certbot:
image: certbot/certbot
volumes:
- ./certbot/conf:/etc/letsencrypt
- ./certbot/www:/var/www/certbot
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
volumes:
postgres_data:
networks:
app-network:
driver: bridgeОбратите внимание: переменные ${DB_USER} и т.д. берутся из файла .env. Создайте его:
cat > .env <<EOF
DB_USER=myuser
DB_PASSWORD=mypassword
DB_NAME=mydb
EOFШаг 4. Создание Dockerfile для приложения
В папке app/ создайте Dockerfile для вашего приложения. Пример для Node.js:
FROM node:18-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "index.js"]Если у вас Python, PHP или другой язык — замените базовый образ и команды соответственно.
Шаг 5. Настройка Nginx как reverse proxy
В папке nginx/conf.d/ создайте файл default.conf:
server {
listen 80;
server_name example.com www.example.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://app:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}Замените example.com на ваш домен. На данном этапе сертификатов ещё нет, поэтому Nginx может не запуститься. Мы получим их на следующем шаге.
Шаг 6. Запуск контейнеров
Сначала запустите только Nginx и приложение без HTTPS, закомментировав блок с 443 в конфиге Nginx. Затем выполните:
docker compose up -dПроверьте статус:
docker compose psЕсли всё хорошо, Nginx будет слушать порт 80.
Шаг 7. Получение SSL-сертификата Let's Encrypt
Убедитесь, что домен указывает на IP вашего сервера. Затем выполните команду для получения сертификата:
docker compose run --rm certbot certonly --webroot --webroot-path /var/www/certbot -d example.com -d www.example.com --email your@email.com --agree-tos --no-eff-emailПосле успешного получения сертификата раскомментируйте блок 443 в конфиге Nginx и перезапустите Nginx:
docker compose exec nginx nginx -s reloadТеперь сайт должен открываться по HTTPS.
Шаг 8. Настройка автоматического обновления сертификатов
Сервис certbot в нашем compose-файле уже настроен на периодическое обновление (каждые 12 часов). Убедитесь, что контейнер запущен:
docker compose up -d certbotПроверить логи можно так:
docker compose logs certbotШаг 9. Управление контейнерами
Основные команды:
docker compose up -d— запустить все сервисы в фоне.docker compose down— остановить и удалить контейнеры.docker compose logs -f— смотреть логи в реальном времени.docker compose exec app sh— зайти в контейнер приложения.docker compose build— пересобрать образы после изменений.docker compose restart nginx— перезапустить отдельный сервис.
Шаг 10. Обновление приложения
Когда вы измените код, нужно пересобрать образ и перезапустить контейнер:
docker compose build app
docker compose up -d appЕсли изменения только в конфигурации Nginx, достаточно перезагрузить его:
docker compose exec nginx nginx -s reloadШаг 11. Работа с базой данных
Для подключения к PostgreSQL из контейнера:
docker compose exec db psql -U myuser -d mydbДля создания дампа базы:
docker compose exec db pg_dump -U myuser mydb > backup.sqlВосстановление:
cat backup.sql | docker compose exec -T db psql -U myuser -d mydbШаг 12. Мониторинг и логи
Просмотр логов всех сервисов:
docker compose logs -fЛоги конкретного сервиса:
docker compose logs -f appДля мониторинга ресурсов используйте docker stats.
Типичные ошибки
1. Порт уже занят. Если порт 80 или 443 занят другим процессом, контейнер не запустится. Проверьте sudo lsof -i :80 и остановите конфликтующий сервис. 2. Неправильные права на файлы. При монтировании томов убедитесь, что у пользователя внутри контейнера есть доступ к файлам. 3. Ошибки в YAML. Следите за отступами, используйте пробелы, а не табы. 4. Забыли про .env. Переменные окружения не подхватятся, если файл .env отсутствует или назван иначе. 5. Nginx не видит сертификаты. Убедитесь, что пути к сертификатам в конфиге Nginx совпадают с путями внутри контейнера. 6. Контейнеры не видят друг друга. Проверьте, что все сервисы находятся в одной сети (в нашем случае app-network).
FAQ
Можно ли использовать Docker Compose на Windows? Да, через WSL2 или Docker Desktop. Рекомендуется WSL2 для лучшей производительности.
Как изменить порт, на котором доступен сайт? В секции ports сервиса nginx измените левую часть, например "8080:80".
Что делать, если сертификат не получается? Убедитесь, что домен указывает на ваш сервер, порт 80 открыт, и Nginx отдаёт файлы из /.well-known/acme-challenge/.
Как обновить Docker Compose? Обычно он обновляется вместе с Docker. Для отдельной установки используйте официальную документацию.
Можно ли запустить несколько сайтов на одном сервере? Да, создайте отдельные docker-compose проекты с разными портами и настройте Nginx как общий reverse proxy.
Итог
Docker Compose значительно упрощает развёртывание и управление сайтом. Вы описали инфраструктуру в одном файле, запустили её одной командой и получили работающий сайт с HTTPS. Теперь вы можете легко масштабировать проект, добавлять новые сервисы и переносить его на другой сервер. Экспериментируйте, и контейнеризация станет вашим надёжным инструментом.
Читайте также
Комментарии
Комментарии доступны только зарегистрированным пользователям. Войти
- Пока нет комментариев. Будьте первым.



