Проект предназначен для подготовки контейнеризованного nginx
с модулями, на основе только исходного кода и официальных образов Docker. В данном репозитории продемонстрировано добавление модуля nginx-module-vts, предназначенного для получения метрик nginx
, в т.ч. для prometheus
. Однако приведённые подходы позволяют собирать контейнеры nginx
с любыми модулями, как динамическими (обе приведённых методики), так и подключаемыми при сборке (Способ 2).
- Публичный образ, собранный по первому способу https://hub.docker.com/r/ornstein89/nginx-1.24.0-module-vts-1.
- Сборка Nginx с модулями в Docker
build_separate
- каталог сDockerfile
для многоступенчатой сборки динамического модуля иnginx
(Методика 1).build_with_nginx
- каталог сDockerfile
для сборкиnginx
с модулем в одном контейнере (Методика 2).
Преимущества:
- ступени сборки просты по отдельности и не требуют высокой экспертизы,
- нет необходимости воспроизводить сложный процесс сборки (и компактирования) всего контейнера
nginx
, можно использовать как основу компактный официальный образnginx
и дополнить его отдельно собранным модулем, - используется только исходный код (
nginx OSS
и модуля) и официальный образnginx
(в данном репозитории -nginx:1.24.0-alpine-slim
), без сторонних пользовательских образов Docker Hub.
Недостатки:
- необходимо соблюдать синхронность версий
nginx
и зависимостей в целевом и сборочном контейнерах.
-
Перейти в каталог
build_separate
. Расположенный тамDockerfile
содержит две ступени сборки:- на первой во временном сборочном образе
alpine
собирается динамический модульnginx-module-vts
из исходного кода со всеми необходимыми зависимостями, - на втором - модуль копируется в целевой контейнер (официальная сборка
nginx:1.24.0-alpine-slim
).
При желании в
Dockerfile
можно изменить- тип дистрибутива
linux
(для обеих ступеней сборки должен быть одинаковый), - версию
nginx
в аргументеARG_NGINX_VERSION
(при этом образnginx
для финальной ступени сборки выбирать той же вресии!), - собираемые модули (организовать скачивание исходного кода и подключение модуля в
./configure ... --add-dynamic-module=...
), - файлы конфигурации
nginx.conf
иdefault.conf
.
- на первой во временном сборочном образе
-
Собрать образ из
Dockerfile
.Ubuntu:
sudo docker build -t ornstein89/nginx-1.24.0-module-vts-1 .
WSL (Windows + WSL2 + Docker desktop):
docker.exe build -t ornstein89/nginx-1.24.0-module-vts-1 .
-
Запустить контейнер из собранного образа. Убедиться, что статистика, выдаваемая модулем
nginx-module-vts
, доступна по URL http://localhost/status.Ubuntu:
sudo docker run --name nginx-1.24.0-module-vts-1 -p 80:80 -p 443:443 ornstein89/nginx-1.24.0-module-vts-1
WSL (Windows + WSL2 + Docker desktop):
docker.exe run --name nginx-1.24.0-module-vts-1 -p 80:80 -p 443:443 ornstein89/nginx-1.24.0-module-vts-1
Преимущества этого подхода:
- используется только исходный код
nginx
и модулей, и официальный образlinux
(в данном репозитории -alpine
), без сторонних пользовательских образов Docker Hub.
Недостатки:
- при сборке
nginx
из исходного кода сложно обеспечить компактность контейнера, сравнимую с официальными сборками; для уменьшения размера образа после сборки требуется высокая экспертность в дистрибутивахlinux
и зависимостяхnginx
.
-
Перейти в каталог
build_with_nginx
. ВDockerfile
в переменнойNGINX_BUILD_VERSION
задать желаемую версиюnginx
(на 30 апреля 2023 года - версия1.24.0
). -
Сборка образа
nginx
с модулем.Ubuntu:
sudo docker build -t ornstein89/nginx-1.24.0-module-vts-2 .
WSL (Windows + WSL2 + Docker desktop):
docker.exe build -t ornstein89/nginx-1.24.0-module-vts-2 .
-
Запуск. Убедиться, что статистика, выдаваемая модулем
nginx-module-vts
, доступна по URL http://localhost/status.Ubuntu:
sudo docker run --name nginx-1.24.0-module-vts-2 ornstein89/nginx-1.24.0-module-vts-2
WSL (Windows + WSL2 + Docker desktop):
docker.exe run --name nginx-1.24.0-module-vts-2 ornstein89/nginx-1.24.0-module-vts-2
-
Диагностический запуск с переходом в терминал контейнера:
Ubuntu:
sudo docker run --name nginx_with_modules -a stdin -a stdout -it ornstein89/nginx_with_modules sh
WSL (Windows + WSL2 + Docker desktop):
docker.exe run --name nginx_with_modules -a stdin -a stdout -it ornstein89/nginx_with_modules sh
- Использовать
apk --virtual NAME add && apk del NAME
для уменьшения объёма (350Мб → 100Мб). - Собирать динамический модуль на отдельном контейнере, а затем перенести на контейнер
nginx
. - Multi-stage build для метода 1.
- Метод 2, перейти на основу из https://github.com/nginxinc/docker-nginx и https://hg.nginx.org/pkg-oss/, сократить объём образа.
- Internationalization.
- Compose для метода 1.
- Решение проблем с отсутствием библиотек на alpine https://artem.services/?p=1093.
- Сборка nginx https://stackoverflow.com/questions/60324262/compiling-nginx-on-alpine-linux-3-11.
- Сборка nginx https://github.com/LoicMahieu/alpine-nginx.
- Документация по конфигурированию и сборке
nginx
из исходников https://nginx.org/en/docs/configure.html. - Сборка модуля и nginx в одном контейнере https://wiki.hydra-billing.ru/pages/viewpage.action?pageId=69173413.
- Сборка динамического модуля https://habr.com/ru/companies/nixys/articles/473578/.
- Статья Nginx Inc по сборке динамического модуля https://www.nginx.com/blog/compiling-dynamic-modules-nginx-plus/.
- Сборка модуля в отдельном контейнере https://gist.github.com/hermanbanken/96f0ff298c162a522ddbba44cad31081.