Введение и проблемы ручного развертывания
Ручное развертывание проектов на серверах сопряжено с рисками и сложностями:
- Различия в ОС и окружении между локальной машиной и сервером.
- Необходимость повторной установки и настройки зависимостей на каждом сервере.
- Усложнение при масштабировании (добавлении новых серверов).
- Трудности при обновлении проекта на множестве серверов.
Виртуальные машины (ВМ) частично решали проблему, позволяя воспроизвести окружение, но имели недостатки:
- Требовали установки и настройки самой ВМ.
- Захватывали фиксированный объем ресурсов.
- Снижали производительность из-за наслоения ОС.
Docker как решение: образы и контейнеры
Docker (появился в 2013 г.) – технология, позволяющая изолированно запускать программы в своих ОС (контейнерах), используя ядро ОС хост-сервера напрямую.
- Преимущества Docker перед ВМ:
- Быстрое выполнение программ.
- Меньший размер ОС в контейнере.
- Эффективное использование ресурсов (контейнер – отдельный процесс, потребляет ресурсы по мере необходимости).
- Образ (image): Файл со всей информацией для создания и запуска изолированной оболочки (контейнера) с программными компонентами. Состоит из слоев:
- Облегченная версия ОС.
- Интерпретатор ЯП.
- Библиотеки.
- Файлы проекта.
- Настройки.
- Команда запуска приложения.
- Контейнер (container): Запущенный экземпляр образа. Изолированная среда со своей ОС, утилитами, библиотеками и проектом, работающая как отдельный процесс. Данные, генерируемые программой, хранятся внутри контейнера (если не используются тома).
- На основе одного образа можно создавать множество независимых контейнеров.
- Docker Hub: Облачный сервис для хранения и распространения образов.
Компоненты Docker
- Docker Engine (движок Docker):
- Docker daemon (dockerd): Фоновый процесс, управляющий образами, контейнерами, сетями, томами. Принимает команды от Docker клиента.
- Docker client (docker CLI): Интерфейс командной строки для взаимодействия с Docker daemon.
- Docker Desktop: Приложение, включающее Docker Engine, графический интерфейс и все необходимые компоненты. Для Windows и Mac часто единственный вариант установки. Работает через ВМ с Linux.
Установка Docker
- Скачивание с официального сайта: https://www.docker.com
-
Установка на Mac
Выбор установщика в зависимости от процессора (Intel/Apple silicon). Может потребоваться установка Rosetta. -
Установка на Linux
Возможна установка Docker Desktop (работает в изолированной оболочке) или отдельных компонентов Docker Engine и Docker Compose (потенциально быстрее). -
Установка на Windows
Рекомендуется использовать WSL (Windows Subsystem for Linux) версии 2.- Проверка наличия WSL:
wsl.exe -l -v. - Установка WSL:
wsl --installилиwsl --update. - Убедиться, что включен компонент “Подсистема Windows для Linux”.
- Может потребоваться активация виртуализации в BIOS.
- После установки Docker Desktop, команда
dockerдолжна быть доступна в терминале.
- Проверка наличия WSL:
Основные команды Docker: работа с образами и контейнерами
Загрузка образов (docker pull)
docker pull <имя_образа>:<тег>: Скачивает образ из Docker Hub.- Пример:
docker pull hello-world(по умолчанию используется тегlatest).
- Пример:
Просмотр образов (docker images)
docker images: Отображает список скачанных образов с информацией (репозиторий, тег, ID, время создания, размер).- Репозиторий: Имя группы образов (например,
python). - Тег: Конкретная версия или конфигурация образа в репозитории (например,
3.12-alpine,latest).
- Репозиторий: Имя группы образов (например,
Запуск контейнеров (docker run)
docker run <имя_образа>:<тег>: Создает и запускает новый контейнер на основе образа.- Если тег не указан, используется
latest. --name <имя_контейнера>: Задает имя контейнеру. Имена должны быть уникальны.-it: (Интерактивный режим + терминал)-i(interactive) +-t(pseudo-TTY). Позволяет взаимодействовать с контейнером.--rm: Автоматически удаляет контейнер после его завершения.-p: Настройка портов--link: Связывание названий контейнеров--network: Используемая сеть
- Если тег не указан, используется
Просмотр контейнеров (docker ps)
docker ps: Отображает только запущенные контейнеры.docker ps -a: Отображает все контейнеры (включая остановленные).- Информация: ID контейнера, образ, команда запуска, время создания, статус, порты, имя.
Запуск существующих контейнеров (docker start)
docker start <имя_или_ID_контейнера>: Запускает существующий остановленный контейнер.-i: Запуск в интерактивном режиме для привязки к стандартным потокам ввода/вывода.
Остановка контейнеров (docker stop, docker kill)
docker stop <имя_или_ID_контейнера>: Штатно останавливает работающий контейнер.docker kill <имя_или_ID_контейнера>: Принудительно завершает контейнер (если завис).
Удаление контейнеров и образов (docker rm, docker rmi, docker container prune)
docker rm <имя_или_ID_контейнера>: Удаляет остановленный контейнер.- Флаг
-fсначала останавливает а после удаляет контейнер
- Флаг
docker container prune: Удаляет все остановленные контейнеры.docker rmi <имя_образа>:<тег>илиdocker rmi <ID_образа>: Удаляет образ.- Образ можно удалить, только если с ним не связано ни одного контейнера.
- Если тег не указан, используется
latest.
Создание собственных образов (Dockerfile)
Dockerfile: Текстовый файл с инструкциями для сборки образа. Располагается в корне проекта.
Основные команды Dockerfile (FROM, WORKDIR, COPY, CMD, ENV, RUN)
FROM <базовый_образ>:<тег>: Определяет базовый образ, на основе которого строится новый. Первая команда в Dockerfile.WORKDIR /<путь_к_каталогу>: Устанавливает рабочий каталог внутри образа для последующих команд (COPY,RUN,CMD,ENTRYPOINT). Создает каталог, если его нет.COPY <источник_на_хосте> <пункт_назначения_в_образе>: Копирует файлы/каталоги с хост-машины в образ.- Пример:
COPY . .(копировать все из текущего каталога хоста в текущий рабочий каталог образа).
- Пример:
RUN <команда>: Выполняет команду в командной оболочке внутри образа во время его сборки (например, установка пакетов). КаждаяRUNсоздает новый слой.CMD ["исполняемый_файл", "параметр1", "параметр2"]: Задает команду по умолчанию, которая будет выполнена при запуске контейнера из образа. Может быть переопределена при запуске контейнера.ENV <ключ>=<значение>: Устанавливает переменные окружения.- Пример:
ENV PYTHONUNBUFFERED=1(отключает буферизацию вывода для Python).
- Пример:
Сборка образа (docker build)
docker build <путь_к_контексту_сборки> -t <имя_образа>:<тег><путь_к_контексту_сборки>: Обычно.(текущий каталог, где лежит Dockerfile).-t: Задает имя и тег образу. Если тег не указан, используетсяlatest.
Работа с зависимостями (requirements.txt)
- Для Python-проектов зависимости выносятся в
requirements.txt. - В Dockerfile:
COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . .- Разделение
COPYдляrequirements.txtи остального проекта оптимизирует кэширование слоев (слой с зависимостями пересобирается реже). --no-cache-dir: Опцияpipдля уменьшения размера образа.
- Разделение
Команды CMD и ENTRYPOINT
- CMD: Определяет команду по умолчанию. Легко переопределяется при
docker run. - ENTRYPOINT: Также определяет команду, но параметры, передаваемые при
docker run, добавляются кENTRYPOINT, а не заменяют его. Используется для создания “исполняемых” образов.
Дополнительные полезные команды: stats, exec, logs, commit
Помимо основных команд для управления жизненным циклом образов и контейнеров, Docker предоставляет ряд утилит для мониторинга, взаимодействия и сохранения состояния контейнеров.
docker stats
Команда docker stats отображает в реальном времени статистику использования ресурсов запущенными контейнерами. Это очень полезно для мониторинга производительности и потребления ресурсов.
-
Использование: docker stats [имена_или_ID_контейнеров…]
- Если имена или ID не указаны, отображается статистика по всем запущенным контейнерам.
-
Выводимая информация:
-
CONTAINER ID и NAME: Идентификатор и имя контейнера.
-
CPU %: Процент использования CPU.
-
MEM USAGE / LIMIT: Используемая память / Лимит памяти.
-
MEM %: Процент использования памяти.
-
NET I/O: Сетевой ввод/вывод (получено/отправлено).
-
BLOCK I/O: Дисковый ввод/вывод (прочитано/записано).
-
PIDS: Количество процессов.
-
docker exec
Команда docker exec позволяет выполнить команду внутри уже запущенного контейнера. Это основной способ взаимодействия с процессами внутри контейнера без необходимости переподключения или пересоздания.
-
Использование: docker exec [опции] <имя_или_ID_контейнера> <команда> [аргументы…]
-
Часто используемые опции:
-
-i (—interactive): Оставляет STDIN открытым, даже если не подключен.
-
-t (—tty): Выделяет псевдо-терминал (TTY).
-
-d (—detach): Запускает команду в фоновом режиме.
-
-e <КЛЮЧ>=<ЗНАЧЕНИЕ>: Устанавливает переменные окружения для выполняемой команды.
-
-w <путь>: Устанавливает рабочий каталог для команды внутри контейнера.
-
-
Примеры:
-
Запустить интерактивную оболочку bash в контейнере:
docker exec -it my_container bash -
Посмотреть список файлов в каталоге /app контейнера:
docker exec my_container ls /app -
Установить пакет внутри контейнера (если там есть менеджер пакетов):
docker exec my_container apt-get update && apt-get install -y some-package
-
-
Ключевой момент: docker exec запускает новый процесс в пространстве имен (namespaces) существующего контейнера.
docker logs
Команда docker logs извлекает логи (стандартный вывод STDOUT и стандартный вывод ошибок STDERR) указанного контейнера. Это основной способ отладки и мониторинга работы приложений внутри контейнеров.
-
Использование: docker logs [опции] <имя_или_ID_контейнера>
-
Часто используемые опции:
-
-f (—follow): Следовать за выводом логов в реальном времени (аналогично tail -f).
-
—tail <количество_строк>: Показать указанное количество последних строк лога (например, —tail 100).
-
—since <временная_метка_или_период>: Показать логи, начиная с указанного времени (например, —since “2023-10-26T10:00:00” или —since 10m для последних 10 минут).
-
—until <временная_метка_или_период>: Показать логи до указанного времени.
-
-t (—timestamps): Показать временные метки для каждой строки лога.
-
-
Пример:
docker logs -f --tail 50 my_app_container
docker commit
Команда docker commit создает новый образ из изменений, сделанных в файловой системе контейнера. По сути, она “замораживает” текущее состояние контейнера и сохраняет его как новый образ.
-
Использование: docker commit [опции] <имя_или_ID_контейнера> [репозиторий[:тег]]
-
Часто используемые опции:
-
-a (—author <строка>): Автор образа (например, “John Doe john.doe@example.com”).
-
-m (—message <строка>): Сообщение коммита, описывающее изменения.
-
-p (—pause): Приостановить контейнер во время создания образа (по умолчанию true).
-
-
Пример:
docker commit -m "Installed custom package and configured app" -a "My Name" my_modified_container my_new_image:1.0 -
Когда использовать (и когда нет):
-
Полезно для: Быстрого сохранения состояния после отладки или экспериментов; создания временного образа для переноса на другую машину.
-
Не рекомендуется для: Создания производственных образов. Для этого всегда следует использовать Dockerfile, так как он обеспечивает воспроизводимость, версионирование и прозрачность процесса сборки. Образы, созданные через docker commit, сложнее поддерживать и понимать, из чего они состоят (“черный ящик”).
-
Очистка кэша построения (docker builder prune)
docker builder prune: Удаляет неиспользуемый кэш построения.docker builder prune -a: Удаляет весь кэш построения.docker system prune: Удаляет остановленные контейнеры, неиспользуемые сети, образы без ссылок и кэш построения.docker system prune -a: То же, но удаляет все образы, с которыми не связан ни один контейнер, и весь кэш построения.
Расширенные команды Docker и фильтрация
Фильтрация контейнеров (docker ps -f)
docker ps -q: Выводит только ID контейнеров.docker ps -f <критерий>=<значение>: Фильтрует список контейнеров.status=exited: Завершенные контейнеры.status=running: Запущенные контейнеры.exited=<код_завершения>: Контейнеры, завершенные с определенным кодом.
Комбинирование команд
- Использование вывода одной команды в другой:
docker <команда> $(docker <другая_команда>)- Пример:
docker stop $(docker ps -q)(остановить все запущенные контейнеры). - Пример:
docker rm $(docker ps -qf status=exited)(удалить все остановленные контейнеры).
- Пример:
Фильтрация и удаление образов
docker images -aq: ID всех образов.docker images -f dangling=true: “Висячие” образы (неиспользуемые слои).docker rmi $(docker images -qf dangling=true): Удаление “висячих” образов.docker image prune -a: Удаление всех образов, не связанных с контейнерами.
Работа с сетью в Docker
- Docker создает свою внутреннюю изолированную сеть.
- Для взаимодействия с хостом и внешней сетью нужно “пробрасывать” порты.
Открытие портов (-p, -P)
-p <порт_хоста>:<порт_контейнера>: Связывает порт хоста с портом контейнера.- Пример:
docker run -p 8000:80 nginx(порт 8000 хоста на порт 80 контейнера).
- Пример:
-p <IP_хоста>:<порт_хоста>:<порт_контейнера>: Связывает порт контейнера с конкретным IP и портом хоста.- Пример:
docker run -p 127.0.0.1:8000:80 nginx.
- Пример:
-P(заглавная): Автоматически связывает все открытые (EXPOSEd) порты контейнера со случайными свободными портами на хосте.docker port <имя_контейнера>: Показывает маппинг портов для контейнера.docker container inspect <имя_контейнера>: Подробная информация о контейнере, включая сетевые настройки и IP-адрес во внутренней сети Docker.
Команда EXPOSE
EXPOSE <порт1> <порт2> ...: Инструкция в Dockerfile, информирующая о том, какие порты приложение внутри контейнера слушает. Не публикует порты автоматически, но используется флагом-P.
Создание нового пользователя в контейнере
- Для безопасности лучше запускать процессы в контейнере от имени непривилегированного пользователя.
- В Dockerfile (для Linux-образов):
RUN groupadd -r <имя_группы> && useradd -r -g <имя_группы> <имя_пользователя> # ... другие команды ... USER <имя_пользователя> CMD ["команда_запуска"]
Работа с томами (Volumes)
Тома (volumes): Механизм для сохранения данных за пределами жизненного цикла контейнера, обеспечивая их персистентность и возможность совместного использования.
Способы монтирования томов
- Bind mounts (связывание каталогов): Каталог хоста ←> каталог контейнера.
- Именованные тома: Управляются Docker, хранятся в специальной области файловой системы хоста.
- Безымянные (анонимные) тома: Управляются Docker, имена генерируются автоматически.
Монтирование каталог к каталогу
docker run -v <полный_путь_на_хосте>:<путь_в_контейнере> ...${PWD}(или$(pwd)) можно использовать для указания текущего каталога хоста.- При пустой папке на хосте данные из контейнера могут копироваться в нее.
- Изменения на хосте отражаются в контейнере и наоборот.
- Недостаток: Зависимость от структуры каталогов хоста, снижает переносимость.
Монтирование тома по имени
docker run -v <имя_тома>:<путь_в_контейнере> ...- Если том с таким именем не существует, Docker создает его.
- Если созданный том пуст, данные из указанного каталога контейнера копируются в том.
- Если том уже существует и содержит данные, копирования не происходит, контейнер использует данные из тома.
docker volume ls: Список томов.docker volume inspect <имя_тома>: Информация о томе.docker volume rm <имя_тома>: Удаление тома.docker volume create <имя_тома>: Создание тома.- Преимущество: Управляется Docker, сохраняет переносимость.
Note
Как вы могли заметить, при определении какого либо отношения в докере, оно работает по принципу <внешнее пространство>:<внутреннее пространство>
Монтирование безымянных томов (команда VOLUME)
docker run -v <путь_в_контейнере> ...: Docker создает том с автоматически сгенерированным именем.- Используются для временного хранения или совместного использования данных.
- При каждом запуске без указания существующего тома создается новый.
docker rm -v <имя_контейнера>: Удаляет контейнер вместе со связанными с ним безымянными томами.- Инструкция
VOLUMEв Dockerfile:VOLUME ["<путь_в_контейнере>"]- Автоматически создает безымянный том при запуске контейнера из образа, если не указано другое монтирование для этого пути.
- Команды в Dockerfile после
VOLUME, обращающиеся к этому каталогу, будут применяться к тому на момент сборки (что обычно бессмысленно, так как том создается при запуске контейнера).
Микросервисная архитектура с Docker
- Разбиение крупного приложения на независимо работающие модули (микросервисы), каждый в своем контейнере.
- Взаимодействие по сети.
- Преимущества: Независимая разработка и развертывание модулей, разные технологии для разных модулей, упрощенная замена модулей.
- Недостатки: Скорость обмена данными ниже, чем у монолита.
Создание пользовательской сети (docker network create)
docker network ls: Список сетей.docker network create <имя_сети>: Создает новую пользовательскую сеть (по умолчанию типаbridge).- Контейнеры в одной пользовательской сети могут обращаться друг к другу по именам контейнеров.
Связывание контейнеров (—link)
docker run --network <имя_сети> --link <имя_целевого_контейнера>:<алиас> ...- Создает алиас для доступа к целевому контейнеру внутри запускаемого контейнера.
- Примечание:
--linkсчитается устаревшим способом. Рекомендуется использовать пользовательские сети и обращение по именам контейнеров.
Docker Compose: оркестрация контейнеров
Docker Compose: Инструмент для определения и запуска многоконтейнерных Docker-приложений. Использует YAML-файл для конфигурации сервисов.
Файл compose.yml: секции services, networks, volumes
- Располагается в корне проекта.
version: (Устаревшее, но может встречаться) Версия синтаксиса файла.services: Определяет контейнеры (сервисы) приложения.<имя_сервиса>:image: <имя_образа>:<тег>: Используемый образ.build: <путь_к_контексту_сборки>: Если образ нужно собрать из Dockerfile.- Если
buildуказан,imageзадает имя создаваемому образу.
- Если
container_name: <имя_контейнера>: Имя создаваемого контейнера.ports: ["<порт_хоста>:<порт_контейнера>"]: Маппинг портов.volumes: ["<том_или_путь_хоста>:<путь_в_контейнере>"]: Монтирование томов.environment: ["<ключ>=<значение>"]илиVAR: value: Переменные окружения.env_file: ["<.env_файл>"]: Путь к файлу с переменными окружения.networks: ["<имя_сети>"]: Сети, к которым подключается сервис.links: ["<сервис>:<алиас>"]: (Устаревшее) Связывание с другими сервисами.depends_on: ["<сервис>"]: Зависимости запуска (сервис запустится после указанных).command: <команда_запуска>: Переопределяет CMD образа.restart: always(илиon-failure,unless-stopped): Политика перезапуска.
networks: Определяет пользовательские сети.<имя_сети>:driver: bridge(или другой драйвер).
volumes: Определяет именованные тома.<имя_тома>:(может быть пустым, если используется драйвер по умолчанию).
Основные команды (docker compose up, down, build)
docker compose up: Собирает (если нужно), создает и запускает контейнеры, определенные вcompose.yml.-d: Запуск в фоновом (detached) режиме.--build: Принудительно пересобирает образы перед запуском.-f: Указание названия yml файла
docker compose down: Останавливает и удаляет контейнеры, сети (но не тома по умолчанию).-v: Удаляет также именованные тома, определенные в секцииvolumes.
docker compose build: Собирает образы для сервисов, у которых указана секцияbuild.docker compose stop: Останавливает сервисы.docker compose start: Запускает остановленные сервисы.docker compose ps: Показывает статус сервисов.docker compose logs <имя_сервиса>: Показывает логи сервиса.docker compose exec <имя_сервиса> <команда>: Выполняет команду внутри работающего контейнера сервиса.
Переменные окружения (.env файл)
- Файл
.envв том же каталоге, что иcompose.yml, автоматически загружается Docker Compose. - Переменные из
.envможно использовать вcompose.ymlчерез${ПЕРЕМЕННАЯ}.
Развертывание Django-приложения с Docker Compose
Типичный стек: Django (Python), PostgreSQL (СУБД), Nginx (веб-сервер/прокси), Adminer (управление БД).
- PostgreSQL сервис:
- Использует официальный образ.
- Задает переменные окружения (
POSTGRES_DB,POSTGRES_USER,POSTGRES_PASSWORD). - Монтирует именованный том для персистентности данных БД.
- Adminer сервис:
- Использует официальный образ.
- Пробрасывает порт (например,
8080:8080). - Связывается с сервисом PostgreSQL.
- Django (web) сервис:
- Собирается из Dockerfile.
- Dockerfile: базовый образ Python, установка зависимостей из
requirements.txt, копирование проекта, создание пользователя, команда запуска (Gunicorn).
- Dockerfile: базовый образ Python, установка зависимостей из
requirements.txt: включаетdjango,psycopg2-binary(для PostgreSQL),gunicorn,gevent.- Использует переменные окружения из
.envдля настроек Django (SECRET_KEY,ALLOWED_HOSTS, настройки БД). - Монтирует каталог проекта с хоста для разработки (чтобы изменения кода сразу отражались).
- Запускает Django через Gunicorn.
- Собирается из Dockerfile.
- Nginx сервис:
- Использует официальный образ.
- Пробрасывает порт
80(и443для HTTPS). - Монтирует кастомный конфигурационный файл (например,
nginx/sitewomen.conf). - Монтирует каталоги со статикой (
static) и медиа (media) из Django-приложения. - Конфигурация Nginx: проксирует запросы к Gunicorn, отдает статику и медиа.
Настройка Nginx и Gunicorn
- Gunicorn: WSGI HTTP сервер для Python. Запускает Django-приложение.
- Конфигурационный файл
gunicorn.py(задаетсяbindна0.0.0.0:<порт>,workers,worker_class='gevent').
- Конфигурационный файл
- Nginx: Выступает как reverse proxy перед Gunicorn.
- Отдает статические файлы и медиа напрямую.
- Перенаправляет динамические запросы к Django (Gunicorn).
- Может обрабатывать SSL/TLS.
Развертывание на реальном сервере и настройка HTTPS
Установка Docker на сервер (Ubuntu)
- Обновление пакетов:
apt update && apt upgrade -y. - Установка зависимостей:
apt install apt-transport-https ca-certificates curl software-properties-common -y. - Добавление GPG ключа Docker:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | 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" | tee /etc/apt/sources.list.d/docker.list > /dev/null - Установка Docker Engine и Docker Compose plugin:
apt update apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y - Проверка статуса:
systemctl status docker.
Перенос проекта и запуск
- Перенести проект на сервер (например, через
git cloneилиscp). - Настроить файл
.env(например,DJANGO_ALLOWED_HOSTSуказать домен сервера). - Запустить проект:
docker compose up --build -d. - Выполнить миграции и загрузить данные (если нужно) внутри контейнера Django:
docker compose exec <имя_django_сервиса> python manage.py migrate docker compose exec <имя_django_сервиса> python manage.py loaddata db.json
Настройка HTTPS с Certbot
- Certbot: Инструмент для автоматического получения и установки SSL/TLS сертификатов от Let’s Encrypt.
- Добавление сервиса
certbotвcompose.yml:services: # ... другие сервисы ... certbot: image: certbot/certbot volumes: - ./certbot/conf:/etc/letsencrypt # для хранения сертификатов - ./certbot/www:/var/www/certbot # для webroot-проверки # команда для получения сертификата (замените email и домен) command: certonly --webroot --webroot-path=/var/www/certbot/ --email your_email@example.com --agree-tos --no-eff-email -d your_domain.com depends_on: - nginx # чтобы nginx был запущен для webroot-проверки - Модификация сервиса
nginxвcompose.yml:- Добавить монтирование томов для
certbot:volumes: # ... другие тома ... - ./certbot/conf:/etc/letsencrypt - ./certbot/www:/var/www/certbot - Добавить порт
443:ports: - "80:8088" # или порт, который слушает nginx - "443:443" # порт для https
- Добавить монтирование томов для
- Создание каталогов на хосте:
mkdir -p certbot/conf certbot/www. - Модификация конфигурации Nginx (
nginx/sitewomen.conf):- Добавить location для
.well-known/acme-challenge(необходимо дляcertbotпри webroot-проверке):server { listen 8088; # порт, который слушает nginx для http # ... location /.well-known/acme-challenge/ { root /var/www/certbot; } # ... (можно добавить редирект на https здесь, после получения сертификата) }
- Добавить location для
- Первый запуск:
docker compose up --build. Certbot должен получить сертификат. - Остановить:
docker compose down. - Обновить конфигурацию Nginx для использования HTTPS и редиректа с HTTP:
server { listen 8088; server_name your_domain.com; # ... location для acme-challenge если нужно автоматическое обновление ... location / { return 301 https://$host$request_uri; } } server { listen 443 ssl; server_name your_domain.com; ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem; # ... остальная конфигурация proxy_pass к Django, static, media ... location /adminer/ { # Пример прокси для Adminer proxy_pass http://adminer:8080; # имя сервиса adminer и его внутренний порт } } - Финальный запуск:
docker compose up --build -d. Сайт должен быть доступен по HTTPS.
〰〰〰 𓆝 𓆟 𓆞 𓆝 𓆟 𓆝 𓆟 𓆞 〰〰〰