Введение и проблемы ручного развертывания
Ручное развертывание проектов на серверах сопряжено с рисками и сложностями:
- Различия в ОС и окружении между локальной машиной и сервером.
- Необходимость повторной установки и настройки зависимостей на каждом сервере.
- Усложнение при масштабировании (добавлении новых серверов).
- Трудности при обновлении проекта на множестве серверов.
Виртуальные машины (ВМ) частично решали проблему, позволяя воспроизвести окружение, но имели недостатки:
- Требовали установки и настройки самой ВМ.
- Захватывали фиксированный объем ресурсов.
- Снижали производительность из-за наслоения ОС.
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, сохраняет переносимость.
Монтирование безымянных томов (команда 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
: Принудительно пересобирает образы перед запуском.
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.
〰〰〰 𓆝 𓆟 𓆞 𓆝 𓆟 𓆝 𓆟 𓆞 〰〰〰