Docker — отличная платформа для упаковки и запуска веб-приложений, особенно в сочетании с одним из многих предложений «Платформа как услуга» (PaaS), предоставляемых облачными платформами. NGINX уже давно предоставляет командам DevOps возможность размещать веб-приложения в Linux, а также предоставляет официальный образ Docker для использования в качестве основы для пользовательских веб-приложений.
В этом посте я объясняю, как команды DevOps могут использовать образ NGINX Docker для создания и запуска веб-приложений в Docker.
Начало работы с базовым образом
NGINX — это универсальный инструмент с множеством применений, включая балансировщик нагрузки, обратный прокси и сетевой кэш. Однако при запуске NGINX в контейнере Docker большинство этих высокоуровневых функций делегируется другим специализированным платформам или другим экземплярам NGINX. Обычно NGINX выполняет функцию веб-сервера при запуске в контейнере Docker.
Чтобы создать контейнер NGINX с веб-сайтом по умолчанию, выполните следующую команду:
docker run -p 8080:80 nginx
Эта команда загрузит nginx
образ (если он еще не был загружен) и создаст контейнер, предоставляющий доступ к порту 80 в контейнере порту 8080 на хост-компьютере. Затем вы можете открыть http://localhost:8080/index.html, чтобы просмотреть веб-сайт по умолчанию «Добро пожаловать на nginx!».
Чтобы позволить контейнеру NGINX предоставлять пользовательские веб-ресурсы, вы можете смонтировать локальный каталог внутри контейнера Docker.
Сохраните следующий HTML-код в файл с именем index.html:
<html>
<body>
Hello from DockerHosting!
</body>
</html>
Затем выполните следующую команду, чтобы смонтировать текущий каталог под /usr/share/nginx/html внутри контейнера NGINX с доступом только для чтения:
docker run -v $(pwd):/usr/share/nginx/html:ro -p 8080:80 nginx
Откройте http://localhost:8080/index.html снова, и вы увидите пользовательскую HTML-страницу.
Одним из преимуществ образов Docker является возможность объединения всех связанных файлов в единый распространяемый артефакт. Чтобы реализовать это преимущество, необходимо создать новый образ Docker на основе образа NGINX.
Создание пользовательских образов на основе NGINX
Чтобы создать свой собственный образ Docker, сохраните следующий текст в файле с именем Dockerfile:
FROM nginx
COPY index.html /usr/share/nginx/html/index.html
Dockerfile
содержит инструкции по созданию пользовательского образа Docker. Здесь вы используете FROM
команду, чтобы создать свой образ на основе образа NGINX, а затем используете COPY
команду, чтобы скопировать свой index.html
файл в новый образ в /usr/share/nginx/html
каталоге.
Создайте новый образ с помощью команды:
docker build . -t mynginx
При этом создается новый образ с именем mynginx
. Запустите новый образ с помощью команды:
docker run -p 8080:80 mynginx
Обратите внимание, что на этот раз вы не монтировали никаких каталогов. Однако при открытии http://localhost:8080/index.html отображается ваша пользовательская HTML-страница, поскольку она была встроена в ваш пользовательский образ.
NGINX способен на гораздо большее, чем просто размещение статических файлов. Чтобы разблокировать эту функциональность, вы должны использовать пользовательские файлы конфигурации NGINX.
Расширенная конфигурация NGINX
NGINX предоставляет свою функциональность с помощью файлов конфигурации. Образ NGINX по умолчанию поставляется с простым файлом конфигурации по умолчанию, предназначенным для размещения статического веб-контента. Этот файл находится по адресу /etc/nginx/nginx.conf
в образе по умолчанию и имеет следующее содержимое:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
Нет необходимости подробно разбираться в этом файле конфигурации, но есть одна интересная строка, которая инструктирует NGINX загрузить дополнительные файлы конфигурации из /etc/nginx/conf.d
каталога:
include /etc/nginx/conf.d/*.conf;
Файл по умолчанию /etc/nginx/conf.d
настраивает NGINX для работы в качестве веб-сервера. В частности, location /
блокировка загрузки файлов с /usr/share/nginx/html
является причиной того, что вы ранее монтировали свои HTML-файлы в этот каталог:
server {
listen 80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
Вы можете воспользоваться инструкцией по загрузке любых *.conf
файлов конфигурации в /etc/nginx
для настройки NGINX. В этом примере вы добавляете проверку работоспособности через пользовательское местоположение, прослушивающее порт 90, который отвечает на запросы к /nginx-health
пути с HTTP 200 OK.
Сохраните следующий текст в файл с именем health-check.conf
:
server {
listen 90;
server_name localhost;
location /nginx-health {
return 200 "healthy\n";
add_header Content-Type text/plain;
}
}
Измените Dockerfile
, чтобы скопировать файл конфигурации в /etc/nginx/conf.d
:
FROM nginx
COPY index.html /usr/share/nginx/html/index.html
COPY health-check.conf /etc/nginx/conf.d/health-check.conf
Создайте образ с помощью команды:
docker build . -t mynginx
Запустите новый образ с помощью команды. Обратите внимание на новый порт, открытый в 9090:
docker run -p 8080:80 -p 9090:90 mynginx
Теперь открыто http://localhost:9090/nginx-health
. Возвращается ответ на проверку работоспособности, указывающий на то, что веб-сервер запущен.
В приведенных выше примерах ваши пользовательские изображения основаны на образе по умолчанию nginx
. Но есть и другие варианты, которые обеспечивают изображения гораздо меньшего размера без ущерба для какой-либо функциональности.
Выбор вариантов NGINX
По умолчанию nginx
образ основан на Debian. Однако NGINX также предоставляет образы на основе Alpine.
Alpine часто используется в качестве облегченной основы для образов Docker. Чтобы просмотреть размеры образов Docker, их сначала необходимо перенести на локальную рабочую станцию:
docker pull nginx
docker pull nginx:stable-alpine
Затем вы можете найти размеры изображения с помощью команды:
docker image ls
Из этого вы можете видеть, что образ Debian весит около 140 МБ, в то время как образ Alpine весит около 24 МБ. Это значительная экономия в размерах образа.
Чтобы основывать свои образы на варианте Alpine, вам необходимо обновить Dockerfile
:
FROM nginx:stable-alpine
COPY index.html /usr/share/nginx/html/index.html
COPY health-check.conf /etc/nginx/conf.d/health-check.conf
Создайте и запустите образ с помощью команд:
docker build . -t mynginx
docker run -p 8080:80 -p 9090:90 mynginx
Еще раз откройте http://localhost:9090/nginx-health или http://localhost:8080/index.html для просмотра веб-страниц. Все продолжает работать, как и раньше, но ваш пользовательский образ теперь намного меньше.
Заключение
NGINX — мощный веб-сервер, а официальный образ NGINX Docker позволяет командам DevOps размещать пользовательские веб-приложения в Docker. NGINX также поддерживает расширенные сценарии благодаря своей способности считывать файлы конфигурации, скопированные в пользовательский образ Docker.
В этом посте вы узнали, как создать пользовательский образ Docker, в котором размещается статическое веб-приложение, добавили расширенные файлы конфигурации NGINX для обеспечения конечной точки проверки работоспособности и сравнили размеры образов Debian и Alpine NGINX.