sadrix logoSadriX
Минцифры готовит обязательную регистрацию IMEI смартфонов, купленных за границей
Гайды

Как запустить сайт в Docker Compose с нуля: пошаговый гайд

От установки Docker до работающего сайта с HTTPS за один вечер

09 760 просмотров5 мин
0
Поделиться:TelegramVK

Введение

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. Теперь вы можете легко масштабировать проект, добавлять новые сервисы и переносить его на другой сервер. Экспериментируйте, и контейнеризация станет вашим надёжным инструментом.

Читайте также

Комментарии

Комментарии доступны только зарегистрированным пользователям. Войти

  • Пока нет комментариев. Будьте первым.