Статьи

Развертывание NGINX и NGINX Plus с помощью Docker

Вступление

Открытая платформа Docker включает в себя Docker Engine — среду выполнения с открытым исходным кодом, которая создает, запускает и организует контейнеры — и

Контейнеры Docker позволяют разработчикам сосредоточить свои усилия на «контенте» приложений, отделяя приложения от ограничений инфраструктуры. Dockerized-приложения мгновенно переносятся на любую инфраструктуру — ноутбук, сервер с открытым исходным кодом, виртуальную машину или облако — превращая их в модульные компоненты, которые могут быть легко собраны и повторно собраны в полнофункциональные распределенные приложения и постоянно обновляться в режиме реального времени.

Для получения дополнительной информации о Docker см.  Что такое Docker?  или полная  документация Docker .

Использование NGINX Docker Image

Вы можете создать экземпляр NGINX в контейнере Docker, используя  образ NGINX  из Docker Hub.

Давайте начнем с очень простого примера. Чтобы запустить экземпляр NGINX, работающий в контейнере и использующий конфигурацию NGINX по умолчанию, выполните следующую команду:

# docker run --name mynginx1 -P -d nginx \
fcd1fb01b14557c7c9d991238f2558ae2704d129cf9fb97bb4fadf673a58580d

Эта команда создает контейнер с именем  mynginx1  на основе образа NGINX. Команда возвращает длинную форму идентификатора контейнера, которая используется в имени файлов журнала; см.  Управление ведением журнала .

В  -d параметре указует , что она работает в отдельном режиме, что означает , что контейнер продолжает работать , пока не будет остановлен , но не реагирует на команды выполняются в командной строке. Позже мы обсудим, как взаимодействовать с контейнером.

-P Опция говорит Docker для отображения портов выставленных в контейнере по изображению Nginx — порты 80 и 443 — к портам на хосте Докера, которые случайным образом выбраны из диапазона между 49153 и 65535. Мы делаем это потому , что в противном случае будет возникать конфликты на порты 80 и 443, если позже мы создадим несколько контейнеров NGINX на одном хосте Docker. Отображения портов являются динамическими и устанавливаются каждый раз, когда контейнер запускается или перезапускается. Если вам нужны статические сопоставления портов, используйте  -p опцию, чтобы установить их вручную.

Чтобы убедиться, что контейнер был создан и запущен, и чтобы увидеть сопоставления портов, мы запускаем  docker ps. (Здесь мы разбили вывод на несколько строк, чтобы его было легче читать.)

# docker ps
CONTAINER ID  IMAGE         COMMAND               CREATED         STATUS         
fcd1fb01b145  nginx:latest  "nginx -g 'daemon of  16 seconds ago  Up 15 seconds  

PORTS                                         NAMES
0.0.0.0:49166->443/tcp, 0.0.0.0:49167->80/tcp mynginx1

PORTS Поле в выходных отчетов, порт 49167 на хосте Докер отображается на порт 80 в контейнере. Другой способ проверить, работает ли NGINX, — сделать HTTP-запрос к этому порту. Появится код страницы приветствия NGINX по умолчанию:

# curl http://localhost:49167
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
 body {
 width: 35em;
 margin: 0 auto;
 font-family: Tahoma, Verdana, Arial, sans-serif;
 }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="https://www.nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Работа с контейнером NGINX Docker

Итак, теперь у нас есть рабочий контейнер NGINX Docker, но как нам управлять контентом и конфигурацией NGINX? А как насчет регистрации?

Примечание о SSH

Обычно доступ SSH к экземплярам NGINX разрешен, но в образе NGINX не установлен OpenSSH, поскольку контейнеры Docker обычно предназначены для одной цели (в данном случае для запуска NGINX), а для обычных операций нет необходимости иметь доступ к оболочке непосредственно к контейнеру NGINX. Вместо этого мы будем использовать другие методы, поддерживаемые Docker. Подробное обсуждение альтернатив SSH-доступу смотрите в разделе  Почему вам не нужно запускать SSHd в ваших контейнерах Docker .

Управление контентом и файлами конфигурации

Существует несколько способов управления контентом, обслуживаемым NGINX и файлами конфигурации NGINX. Здесь мы рассмотрим несколько вариантов.

  • Вариант 1. Сохранение содержимого и конфигурации на хосте Docker Когда контейнер создан, мы можем указать Docker смонтировать локальный каталог на хосте Docker в каталог в контейнере. Образ NGINX использует конфигурацию NGINX по умолчанию, которая использует / usr / share / nginx / html  в качестве корневого каталога контейнера и помещает файлы конфигурации в  / etc / nginx . Для хоста Docker с содержимым в локальном каталоге  / var / www  и файлами конфигурации в / var / nginx / conf выполните эту команду:
    # docker run --name mynginx2 -v /var/www:/usr/share/nginx/html:ro \
      -v /var/nginx/conf:/etc/nginx:ro -P -d nginx

    Теперь любые изменения, внесенные в файлы в локальных каталогах  / var / www  и  / var / nginx / conf  на хосте Docker, отражаются в каталогах  / usr / share / nginx / html  и  / etc / nginx  в контейнере.  :ro Опция означает , что эти директора считываются только внутри контейнера.

  • Вариант 2: Копирование файлов с хоста Docker Другой вариант заключается в том, чтобы Docker копировал содержимое и файлы конфигурации из локального каталога на хосте Docker во время создания контейнера. После создания контейнера файлы поддерживаются путем создания нового контейнера при изменении файлов или путем изменения файлов в контейнере. Простой способ скопировать файлы — это создать  Dockerfile  с командами, которые запускаются во время генерации нового образа Docker на основе образа NGINX из Docker Hub. Для COPYкоманд file-copy ( ) в  Dockerfile путь к локальному каталогу относительно контекста сборки, в котором находится  Dockerfile  . В нашем примере контент находится в  контенте каталог и файлы конфигурации находятся в  каталоге conf , оба подкаталоги каталога, в котором находится  Dockerfile  . Образ NGINX содержит файлы конфигурации NGINX по умолчанию, включая  default.conf  и  example_ssl.conf  в  каталоге /etc/nginx/conf.d . Поскольку вместо этого мы хотим использовать файлы конфигурации с хоста, мы включаем  RUN команды, которые удаляют файлы по умолчанию:
    FROM nginx
    RUN rm /etc/nginx/conf.d/default.conf
    RUN rm /etc/nginx/conf.d/example_ssl.conf
    COPY content /usr/share/nginx/html
    COPY conf /etc/nginx

    Мы создаем наш собственный образ NGINX, выполняя следующую команду из каталога, в котором находится Dockerfile  . Обратите внимание на точку («.») В конце команды. Он определяет текущий каталог как контекст сборки, который содержит  Dockerfile  и каталоги, которые нужно скопировать.

    # docker build -t mynginx_image1 .

    Теперь мы запускаем эту команду, чтобы создать контейнер с именем  mynginx3  на  основе изображения mynginx_image1 :

    # docker run --name mynginx3 -P -d mynginx_image1

    Если мы хотим внести изменения в файлы в контейнере, мы используем вспомогательный контейнер, как описано в варианте 3.

  • Вариант 3: Поддержание файлов в контейнере Как уже упоминалось ранее в  заметке о SSH , мы не можем использовать SSH для доступа к контейнеру NGINX, поэтому, если мы хотим редактировать содержимое или файлы конфигурации напрямую, нам нужно создать вспомогательный контейнер, который имеет доступ к оболочке. Чтобы вспомогательный контейнер имел доступ к файлам, мы должны создать новый образ, который имеет надлежащие  объемы данных Docker,  определенные для этого образа. Предполагая, что мы хотим копировать файлы, как в варианте 2, а также определяем тома, мы используем следующий  Dockerfile :
    FROM nginx
    COPY content /usr/share/nginx/html
    COPY conf /etc/nginx
    VOLUME /usr/share/nginx/html
    VOLUME /etc/nginx

    Затем мы создаем новый образ NGINX, выполнив следующую команду (снова обратите внимание на последний период):

    # docker build -t mynginx_image2 .

    Теперь мы запускаем эту команду для создания контейнера NGINX на основе изображения:

    # docker run --name mynginx4 -P -d mynginx_image2

    Затем мы запускаем эту команду, чтобы запустить вспомогательный контейнер  mynginx4_files  , имеющий оболочку, позволяющую нам получить доступ к каталогам содержимого и конфигурации   контейнера mynginx4, который мы только что создали:

    # docker run -i -t --volumes-from mynginx4 --name mynginx4_files debian /bin/bash
    root@b1cbbad63dd1:/#

    Новый   вспомогательный контейнер mynginx4_files работает на переднем плане с постоянным стандартным вводом ( -i опция) и tty (  -t опция). Все тома, определенные в  mynginx4  , монтируются как локальные каталоги в вспомогательном контейнере. В  debian аргумент означает , что вспомогательный контейнер использует образ Debian из Докер Hub. Поскольку образ NGINX также использует Debian (и все наши примеры пока используют образ NGINX), наиболее эффективно использовать Debian для вспомогательного контейнера, вместо того, чтобы Docker загружал другую операционную систему. В  /bin/bash аргумент означает , что  Баш shell запускается в вспомогательном контейнере, представляя приглашение оболочки, которое вы можете использовать для изменения файлов по мере необходимости. Вы также можете установить в контейнер другие инструменты для управления этими файлами, такие как Puppet или Chef. Чтобы запустить и остановить контейнер, выполните следующие команды:

    # docker start mynginx4_files
    
    # docker stop mynginx4_files

    Чтобы выйти из оболочки, но оставить контейнер работающим, нажмите,  Ctrl-p а затем  Ctrl-q. Чтобы восстановить доступ оболочки к работающему контейнеру, выполните следующую команду:

    # docker attach mynginx4_files

    Чтобы выйти из оболочки и завершить работу контейнера, выполните  exit команду.

Управление журналированием

Вы можете настроить или по умолчанию или настраиваемое ведение журнала.

  • Использование ведения журнала по умолчанию Образ NGINX по умолчанию настроен на отправку основного доступа и журналов ошибок NGINX сборщику журналов Docker. Это делается путем связывания их с  stdout и  stderr; все сообщения из обоих журналов затем записываются в файл  / Var / Библиотека / грузчик / контейнеры / контейнер-ID / контейнер-ID -json.log  на хосте Докер. Идентификатор  контейнера  — это длинный идентификатор, возвращаемый при создании контейнера. Чтобы отобразить это, выполните эту команду:
    # docker inspect --format '{{ .Id }}' container-name

    Вы можете использовать как командную строку Docker, так и  Docker Remote API  для извлечения сообщений журнала. В командной строке выполните эту команду:

    # docker logs container-name

    Чтобы включить Docker Remote API, добавьте следующую строку в файл  / etc / default / docker :

    DOCKER_OPTS='-H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock'

    Перезапустите Docker, который начинает прослушивать запросы HTTP API на порту 4243 (можно указать другой порт), а также на сокете. Чтобы получить все сообщения, выполните запрос GET:

    http://Docker-host:4243/containers/container-name/logs?stdout=1&stderr=1

    Чтобы включить в вывод только сообщения журнала доступа, включите только  stdout=1; чтобы ограничить вывод сообщениями журнала ошибок, включите только  stderr=1. Чтобы узнать о других доступных параметрах, см. документацию Docker

  • Использование настраиваемых журналов Если вы хотите реализовать другой метод сбора журналов или если вы хотите настроить журналирование по-разному в определенных блоках конфигурации (например,  server{} и l ocation{}), определите том Docker для каталога или каталогов, в которых будут храниться файлы журналов. контейнер, создайте вспомогательный контейнер для доступа к файлам журнала и используйте любые инструменты ведения журнала, которые вам нравятся. Для этого создайте новый образ, содержащий том или тома для файлов журналов. Например, чтобы настроить NGINX для хранения файлов журнала в  / var / log / nginx / log , мы можем начать с Dockerfile  из варианта 3 и просто добавить  VOLUME определение для этого каталога:
    FROM nginx
    COPY content /usr/share/nginx/html
    COPY conf /etc/nginx
    VOLUME /var/log/nginx/log

    Затем мы можем создать изображение, как описано выше, и использовать его для создания контейнера NGINX и вспомогательного контейнера, которые имеют доступ к каталогу журналирования. Во вспомогательном контейнере могут быть установлены любые необходимые инструменты регистрации.

Управление NGINX

Поскольку у нас нет прямого доступа к командной строке контейнера NGINX, мы не можем использовать nginx команду для управления NGINX. К счастью, мы можем использовать  сигналы  для управления NGINX, и Docker предоставляет  kill команду для отправки сигналов в контейнер.

Чтобы перезагрузить конфигурацию NGINX, выполните эту команду:

# docker kill -s HUP container-name

Чтобы перезапустить NGINX, выполните эту команду, чтобы перезапустить контейнер:

# docker restart container-name

Развертывание NGINX Plus с помощью Docker

До сих пор мы обсуждали Docker для продукта NGINX с открытым исходным кодом, но вы также можете использовать его с коммерческой версией NGINX Plus. Разница в том, что сначала вам нужно создать образ NGINX Plus, поскольку в качестве коммерческого предложения NGINX Plus не доступен в Docker Hub. К счастью, это довольно легко сделать.

Создание образа Docker NGINX Plus

Чтобы создать образ NGINX Plus, сначала создайте  Dockerfile . Здесь мы приводим примеры для Ubuntu 14.04 и CentOS 7.0, которые вы можете использовать в качестве шаблонов для других операционных систем. Как для Ubuntu, так и для CentOS вам необходимо загрузить свои версии файлов  nginx-repo-crt  и  nginx-repo-key  с http://cs.nginx.com , портала для клиентов NGINX Plus, которые приобрели или оценивают NGINX. Плюс. Скопируйте файлы в каталог, где находится  Dockerfile  (контекст сборки Docker).

Как и в случае с открытым исходным кодом NGINX, по умолчанию журналы доступа и ошибок NGINX Plus связаны с сборщиком журналов Docker. Тома не указаны, но вы можете добавить их, если хотите, или эти  файлы Dockerfile можно использовать для создания базовых образов, из которых вы можете создавать новые образы с указанными томами, как описано ранее.

По умолчанию файлы не копируются с хоста Docker при создании контейнера. Вы можете добавить  COPYопределения в  Dockerfile , или созданное вами изображение можно использовать в качестве основы для другого изображения, как описано выше.

Dockerfile для Ubuntu

FROM ubuntu:14.04

MAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com"

# Set the debconf front end to Noninteractive
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections

RUN apt-get update && apt-get install -y -q wget apt-transport-https

# Download certificate and key from the customer portal (https://cs.nginx.com)
# and copy to the build context
ADD nginx-repo.crt /etc/ssl/nginx/
ADD nginx-repo.key /etc/ssl/nginx/

# Get other files required for installation
RUN wget -q -O /etc/ssl/nginx/CA.crt https://cs.nginx.com/static/files/CA.crt
RUN wget -q -O - http://nginx.org/keys/nginx_signing.key | apt-key add -
RUN wget -q -O /etc/apt/apt.conf.d/90nginx https://cs.nginx.com/static/files/90nginx

RUN printf "deb https://plus-pkgs.nginx.com/ubuntu `lsb_release -cs` nginx-plus\n" >/etc/apt/sources.list.d/nginx-plus.list

# Install NGINX Plus
RUN apt-get update && apt-get install -y nginx-plus

# forward request logs to Docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log
RUN ln -sf /dev/stderr /var/log/nginx/error.log

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]

Докер-файл для CentOS

FROM centos:centos7

MAINTAINER NGINX Docker Maintainers "docker-maint@nginx.com"

RUN yum install -y wget

# Download certificate and key from the customer portal (https://cs.nginx.com)
# and copy to the build context
ADD nginx-repo.crt /etc/ssl/nginx/
ADD nginx-repo.key /etc/ssl/nginx/

# Get other files required for installation
RUN wget -q -O /etc/ssl/nginx/CA.crt https://cs.nginx.com/static/files/CA.crt
RUN wget -q -O /etc/yum.repos.d/nginx-plus-7.repo https://cs.nginx.com/static/files/nginx-plus-7.repo

# Install NGINX Plus
RUN yum install -y nginx-plus

# forward request logs to Docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log
RUN ln -sf /dev/stderr /var/log/nginx/error.log

EXPOSE 80 443

CMD ["nginx", "-g", "daemon off;"]

Создание образа NGINX Plus

С  файлами Dockerfilenginx-repo-crt и  nginx-repo.key  в одном и том же каталоге выполните следующую команду, чтобы создать образ Docker с именем  nginxplus  (как и ранее, обратите внимание на последний период):

# docker build --no-cache -t nginxplus .

Обратите внимание на  --no-cache параметр, который указывает Docker создавать образ с нуля и обеспечивает установку последней версии NGINX Plus. Если  Dockerfile  ранее использовался для создания образа, и вы не включили  --no-cache опцию, новый образ использует версию NGINX Plus из кеша Docker. (Мы намеренно не указываем версию в < Dockerfile,  чтобы файл не нужно было менять при каждом новом выпуске NGINX Plus.) Опустите  --no-cache опцию, если допустимо использовать версию NGINX Plus из ранее созданного образа.

Вывод, подобный следующему из  docker images ngxinplus команды, указывает, что изображение было успешно создано:

# # docker images nginxplus
REPOSITORY  TAG     IMAGE ID      CREATED        VIRTUAL SIZE
nginxplus   latest  ef2bf65931cf  6 seconds ago  281.3 MB

Чтобы создать контейнер с именем  mynginxplus  на основе этого контейнера, выполните следующую команду:

# docker run --name mynginxplus -P -d nginxplus

Контейнеры NGINX Plus можно контролировать и управлять так же, как контейнеры NGINX.

Резюме

NGINX, NGINX Plus и Docker отлично работают вместе. Используете ли вы образ NGINX с открытым исходным кодом из репозитория Docker Hub или создаете свой собственный образ NGINX Plus, вы можете легко раскрутить новые экземпляры NGINX и NGINX Plus в контейнерах Docker. Вы также можете легко создавать новые образы Docker из базовых образов, что делает ваши контейнеры еще проще для контроля и управления. Следует иметь в виду, что NGINX Plus продается на индивидуальной основе, поэтому для каждого контейнера Docker, на котором работает NGINX Plus, требуется отдельная подписка.

В Docker есть гораздо больше, чем мы смогли рассказать в этой статье. Более подробная информация доступна на  www.docker.com .

По  Рик Нельсон  для Nginx блога .