Перейти к содержимому
Главная страница » Запуск Nginx в Docker

Запуск Nginx в Docker

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.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *