Вступление
Открытая платформа 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{}
и location{}
), определите том 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 "[email protected]"
# 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 "[email protected]"
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
С файлами Dockerfile , nginx-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 блога .