Проект предназначен для подготовки контейнеризованного 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.