Поиск по сайту:

Как запустить Nginx в контейнере Docker в Ubuntu 14.04


Введение

В этом руководстве показано, как развернуть Nginx в контейнере Docker.

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

Nginx описывает себя как:

nginx [engine x] — это HTTP и обратный прокси-сервер, почтовый прокси-сервер и универсальный прокси-сервер TCP, изначально написанный Игорем Сысоевым.

На практике многие системные администраторы используют Nginx для обслуживания веб-контента, от веб-сайтов с плоскими файлами до вышестоящих API-интерфейсов в NodeJS. В этом руководстве мы будем обслуживать базовую веб-страницу, поэтому мы можем сосредоточиться на настройке Nginx с контейнером Docker.

Контейнеры Docker — это популярная форма относительно старой практики операций: контейнеризация. Контейнеризация отличается от виртуализации тем, что виртуализация абстрагирует аппаратное обеспечение, а контейнеризация также абстрагирует базовую операционную систему. С практической точки зрения это означает, что мы можем взять приложение (или группу приложений) и поместить их в контейнер (или контейнеры), чтобы сделать их модульными, переносимыми, составными и легкими.

Эта переносимость означает, что вы можете установить Docker Engine (также называемый Docker Core и даже просто Docker) в самых разных операционных системах, и любой функциональный контейнер, написанный кем-либо, будет работать на нем.

Если вы хотите узнать больше о Docker, вы можете ознакомиться с вводным руководством по Docker.

Для целей этой статьи мы будем устанавливать Docker Engine на Ubuntu 14.04.

Мы будем устанавливать текущую стабильную версию Docker для Ubuntu — 1.8.1.

Это руководство предназначено для пользователей Nginx, которые плохо знакомы с Docker. Если вам нужны только простые команды для настройки контейнера Nginx, вы можете выполнить шаг 1, а затем перейти к шагу 5.

Если вы хотите шаг за шагом создать свой контейнер и узнать о сопоставлении портов и автономном режиме, следуйте всему руководству.

Предпосылки

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

  • Настройте ключи SSH для обеспечения безопасности
  • Настроить пользователя sudo
  • Проверьте версию ядра

Docker 1.8.1 опирается на некоторые довольно свежие функции ядра, поэтому убедитесь, что ядро версии 3.10 или выше. Свежий образ будет работать с довольно новым ядром, но если вам нужно проверить, просто запустите uname -r.

  1. uname -r

Ниже мы включили вывод свежей капли Ubuntu 14.04, которая старше 3.10, поэтому вам не о чем беспокоиться, если вы не используете это на более старом образе.

Output
3.13.0-57-generic

Шаг 1 — Установка Докера

Docker размещает сценарий запуска, чтобы запустить Docker на вашем компьютере. Мы можем просто запустить команду:

  1. sudo curl -sSL https://get.docker.com/ | sh

Как правило, вам не следует направлять случайные сценарии из Интернета в вашу оболочку ( | sh), так как они могут делать что угодно. Загляните на get.docker.com, если хотите знать, во что вы ввязываетесь.

Как только это будет завершено, вы увидите установленную версию, как показано ниже (ваши показания могут быть новее; это нормально) и некоторые инструкции для запуска без полномочий root/без sudo. Тем не менее, мы проходим этот учебник как пользователь sudo, поэтому не нужно беспокоиться об этом для целей этого руководства.

Output
Client: Version: 1.8.3 API version: 1.20 Go version: go1.4.2 Git commit: f4bf5c7 Built: Mon Oct 12 05:37:18 UTC 2015 OS/Arch: linux/amd64 Server: Version: 1.8.3 API version: 1.20 Go version: go1.4.2 Git commit: f4bf5c7 Built: Mon Oct 12 05:37:18 UTC 2015 OS/Arch: linux/amd64

Необязательно: запустите контейнер hello-world, чтобы убедиться, что все работает должным образом.

  1. sudo docker run hello-world

Вы должны увидеть вывод, аналогичный показанному ниже.

Output
$ docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 535020c3e8ad: Pull complete af340544ed62: Already exists library/hello-world:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security. Digest: sha256:d5fbd996e6562438f7ea5389d7da867fe58e04d581810e230df4cc073271ea52 Status: Downloaded newer image for hello-world:latest Hello from Docker. This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker Hub account: https://hub.docker.com For more examples and ideas, visit: https://docs.docker.com/userguide/

После этого мы можем погрузиться в основы Docker.

(Необязательно) Шаг 2 — Обзор основ контейнера: запуск, список, удаление

В этом разделе показано, как запустить базовый контейнер, а затем удалить его. Если вы уже знаете, как использовать Docker в целом, и хотите перейти к части Nginx, перейдите к шагу 5.

Мы установили клиент Docker как часть нашей установки Docker, поэтому у нас есть доступ к инструменту командной строки, который позволяет нам взаимодействовать с нашими контейнерами.

Если мы запустим следующую команду;

  1. sudo docker ps -a

Вы должны получить вывод, подобный следующему;

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a3b149c3ddea hello-world "/hello" 3 minutes ago Exited (0) 3 minutes ago nostalgic_hopper

Мы можем увидеть некоторую основную информацию о нашем контейнере.

Вы заметите, что у него бессмысленное имя, например nostalgic_hopper; эти имена генерируются автоматически, если вы не укажете их при создании контейнера.

Мы также можем видеть, что пример контейнера hello-world был запущен 3 минуты назад и закрылся 3 минуты назад.

Если мы снова запустим этот контейнер с помощью этой команды (заменив nostalgic_hopper на ваше собственное имя контейнера):

  1. sudo docker start nostalgic_hopper

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

  1. sudo docker ps -a

Теперь мы должны увидеть, что контейнер недавно запускался;

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a3b149c3ddea hello-world "/hello" 4 minutes ago Exited (0) 9 seconds ago nostalgic_hopper

По умолчанию контейнеры Docker запускают назначенные им команды, а затем завершают работу.

Некоторые контейнеры будут настроены на выполнение списка задач и их завершение, в то время как другие будут работать бесконечно.

Теперь, когда мы рассмотрели некоторые основы Docker, давайте удалим изображение hello-world, так как оно нам больше не понадобится (не забудьте заменить nostalgic_hopper с именем вашего контейнера или используйте идентификатор контейнера).

  1. sudo docker rm nostalgic_hopper

Далее мы начнем использовать Nginx.

(Необязательно) Шаг 3 — Изучение того, как открыть порт

В этом разделе мы загрузим образ Nginx Docker и покажем, как запустить контейнер, чтобы сделать его общедоступным в качестве веб-сервера.

По умолчанию контейнеры недоступны из Интернета, поэтому нам нужно сопоставить внутренний порт контейнера с портом дроплета. Вот чему вас научит этот раздел!

Однако сначала мы получим образ Nginx.

Шаг 5 содержит последние команды для развертывания полного контейнера, поэтому, если вас не слишком интересуют детали реализации, вы можете сразу пропустить его.

Выполните следующую команду, чтобы получить образ Nginx Docker:

  1. sudo docker pull nginx

Это загрузит все необходимые компоненты для контейнера. Docker будет кэшировать их, поэтому, когда мы запускаем контейнер, нам не нужно каждый раз загружать образ(ы) контейнера.

Docker поддерживает сайт под названием Dockerhub, общедоступный репозиторий файлов Docker (включая как официальные, так и предоставленные пользователями изображения). Скачанный образ является официальным Nginx, что избавляет нас от необходимости создавать собственный образ.

Давайте запустим наш контейнер Nginx Docker с помощью этой команды:

  1. sudo docker run --name docker-nginx -p 80:80 nginx

  • run – это команда для создания нового контейнера.
  • Флаг --name — это то, как мы указываем имя контейнера (если оставить его пустым, он назначается нам, например, nostalgic_hopper из шага 2)
  • -p указывает порт, который мы предоставляем, в формате -p локальный-машинный-порт:внутренний-контейнерный-порт. В этом случае мы сопоставляем порт 80 в контейнере с портом 80 на сервере
  • nginx — это имя образа на dockerhub (мы загрузили его раньше с помощью команды pull, но Docker сделает это автоматически, если образ отсутствует)

Это все, что нам нужно для запуска Nginx! Вставьте IP-адрес вашей капли в веб-браузер, и вы должны увидеть Nginx «Добро пожаловать в nginx!» страница.

Вы также заметите в своем сеансе оболочки, что журнал для Nginx обновляется, когда вы делаете запросы к своему серверу, потому что мы запускаем наш контейнер в интерактивном режиме.

Давайте нажмем клавишу разрыва CTRL+C, чтобы вернуться к нашему сеансу оболочки.

Если вы попытаетесь загрузить страницу сейчас, вы получите страницу «отказ в соединении». Это потому, что мы закрыли наш контейнер. Мы можем проверить это с помощью этой команды:

  1. sudo docker ps -a

Вы должны увидеть что-то похожее на вывод, показанный ниже.

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05012ab02ca1 nginx "nginx -g 'daemon off" 57 seconds ago Exited (0) 47 seconds ago docker-nginx

Мы видим, что наш контейнер Docker вышел.

Nginx не будет очень полезен, если нам нужно подключиться к образу контейнера, чтобы он работал, поэтому на следующем шаге мы покажем вам, как отсоединить контейнер, чтобы он мог работать независимо.

Удалите существующий контейнер docker-nginx с помощью этой команды:

  1. sudo docker rm docker-nginx

На следующем шаге мы покажем вам, как запустить его в автономном режиме.

(Необязательно) Шаг 4 — Обучение работе в автономном режиме

Создайте новый отдельный контейнер Nginx с помощью этой команды:

  1. sudo docker run --name docker-nginx -p 80:80 -d nginx

Мы добавили флаг -d для запуска этого контейнера в фоновом режиме.

Вывод должен быть просто идентификатором нового контейнера.

Если мы запустим команду списка:

  1. sudo docker ps

Мы увидим на выходе пару вещей, которых раньше не видели.

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b91f3ce26553 nginx "nginx -g 'daemon off" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, 443/tcp docker-nginx

Мы видим, что вместо Вышел (0) X минут назад теперь у нас есть В работе около минуты, и мы также можем видеть сопоставление портов.

Если мы снова перейдем к IP-адресу нашего сервера в нашем браузере, мы сможем увидеть «Добро пожаловать в nginx!» На этот раз он работает в фоновом режиме, потому что мы указали флаг -d, который указывает Docker запускать этот контейнер в автономном режиме.

Теперь у нас есть работающий экземпляр Nginx в отдельном контейнере!

Однако это еще недостаточно полезно, потому что мы не можем редактировать файл конфигурации, а контейнер не имеет доступа ни к одному из файлов нашего веб-сайта.

Остановите контейнер, выполнив следующую команду:

  1. sudo docker stop docker-nginx

Теперь, когда контейнер остановлен (вы можете проверить с помощью sudo docker ps -a, если хотите быть уверенным), мы можем удалить его, выполнив следующую команду;

  1. sudo docker rm docker-nginx

Теперь мы перейдем к окончательной версии нашего контейнера с быстрой остановкой для создания пользовательского файла веб-сайта.

Шаг 5 — Создание веб-страницы для обслуживания на Nginx

На этом этапе мы создадим пользовательскую индексную страницу для нашего веб-сайта. Эта настройка позволяет нам иметь постоянный контент веб-сайта, размещенный за пределами (временного) контейнера.

Давайте создадим новый каталог для содержимого нашего веб-сайта в нашем домашнем каталоге и перейдем к нему, выполнив команды, показанные ниже.

  1. mkdir -p ~/docker-nginx/html
  2. cd ~/docker-nginx/html

Теперь давайте создадим HTML-файл (мы показываем команды для Vim, но вы можете использовать любой текстовый редактор).

  1. vim index.html

Войдите в режим вставки, нажав i. Вставьте содержимое, показанное ниже (или добавьте собственную HTML-разметку).

<html>
  <head>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" integrity="sha256-MfvZlkHCEqatNoGiOXveE8FIwMzZg4W85qfrfIFBfYc= sha512-dTfge/zgoMYpP7QbHy4gWMEGsbsdZeCXz7irItjcC3sPUFtf0kuFbDz/ixG7ArTxmDjLXDmezHubeNikyKGVyQ==" crossorigin="anonymous">
    <title>Docker nginx Tutorial</title>
  </head>
  <body>
    <div class="container">
      <h1>Hello Digital Ocean</h1>
      <p>This nginx page is brought to you by Docker and Digital Ocean</p>
    </div>
  </body>
</html>

Если вы знакомы с HTML, вы увидите, что это очень простая веб-страница. Мы включили тег <link>, указывающий на CDN для Bootstrap (структура CSS, которая предоставляет вашей веб-странице набор адаптивных стилей). Вы можете прочитать больше о Bootstrap.

Теперь мы можем сохранить этот файл, нажав ESC, а затем :wq и ENTER:

  • write (w) указывает Vim записать изменения в файл
  • quit (q) указывает Vim выйти

Теперь у нас есть простая индексная страница, которая заменит целевую страницу Nginx по умолчанию.

Шаг 6 — Связывание контейнера с локальной файловой системой

В этом разделе мы соберем все вместе. Мы запустим наш контейнер Nginx, чтобы он был доступен в Интернете через порт 80, и подключим его к содержимому нашего веб-сайта на сервере.

Справочная информация о томах; то есть ссылка на постоянный серверный контент из вашего контейнера:

Docker позволяет нам связать каталоги из локальной файловой системы нашей виртуальной машины с нашими контейнерами.

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

Мы могли бы скопировать файлы в контейнер как часть Dockerfile или скопировать их в контейнер постфактум, но оба этих метода оставляют наш сайт в статическом состоянии внутри контейнера. Используя функцию томов данных Docker, мы можем создать символическую ссылку между файловой системой дроплета и файловой системой контейнера. Это позволяет нам редактировать существующие файлы веб-страниц и добавлять новые в каталог, и наш контейнер будет автоматически получать к ним доступ. Если вы хотите узнать больше о Docker и томах, ознакомьтесь с документацией по томам данных.

Контейнер Nginx по умолчанию настроен на поиск индексной страницы в /usr/share/nginx/html, поэтому в нашем новом контейнере Docker нам нужно предоставить ему доступ к нашим файлам в этом месте. .

Делаем ссылку:

Для этого мы используем флаг -v для сопоставления папки с нашего локального компьютера (~/docker-nginx/html) относительному пути в контейнере (/usr/share/nginx/html).

Мы можем сделать это, выполнив следующую команду:

  1. sudo docker run --name docker-nginx -p 80:80 -d -v ~/docker-nginx/html:/usr/share/nginx/html nginx

Мы видим, что новое дополнение к команде -v ~/docker-nginx/html:/usr/share/nginx/html — это наша ссылка на объем.

  • -v указывает, что мы связываем том
  • часть слева от : — это расположение нашего файла/каталога на нашей виртуальной машине (~/docker-nginx/html)
  • часть справа от : — это место, на которое мы ссылаемся в нашем контейнере (/usr/share/nginx/html)

После выполнения этой команды, если вы сейчас укажете в своем браузере IP-адрес вашей капли DigitalOcean, вы должны увидеть первый заголовок Hello Digital Ocean (или любую другую веб-страницу, которую вы создали на шаге 5).

Если вас устраивают другие настройки Nginx по умолчанию, все готово.

Вы можете загрузить дополнительный контент в каталог ~/docker-nginx/html/, и он будет добавлен на ваш работающий веб-сайт.

Например, если мы изменим наш индексный файл и перезагрузим окно браузера, мы сможем увидеть его обновление в реальном времени. Таким образом, мы могли бы создать целый сайт из плоских файлов HTML, если бы захотели. Например, если бы мы добавили страницу about.html, мы могли бы получить к ней доступ по адресу http://ваш_сервер_ip/about.html без необходимости взаимодействие с контейнером.

(Необязательно) Шаг 7 — Использование собственного файла конфигурации Nginx

Этот раздел предназначен для опытных пользователей, которые хотят использовать свой собственный файл конфигурации Nginx со своим контейнером Nginx. Пропустите этот шаг, если у вас нет пользовательского файла конфигурации, который вы хотите использовать.

Давайте вернемся в каталог, чтобы не писать в наш общедоступный HTML-каталог:

  1. cd ~/docker-nginx

Если вы хотите взглянуть на файл конфигурации по умолчанию, просто скопируйте его с помощью команды копирования Docker:

  1. sudo docker cp docker-nginx:/etc/nginx/conf.d/default.conf default.conf

Поскольку мы собираемся использовать собственный файл .conf для Nginx, нам потребуется пересобрать контейнер.

Сначала остановите контейнер:

  1. sudo docker stop docker-nginx

Удалите его с помощью:

  1. sudo docker rm docker-nginx

Теперь вы можете редактировать файл по умолчанию локально (для обслуживания нового каталога или использования proxy_pass для перенаправления трафика в другое приложение/контейнер, как при обычной установке Nginx). Вы можете прочитать о файле конфигурации Nginx в нашем руководстве по файлам конфигурации Nginx.

После того, как вы сохранили свой собственный файл конфигурации, пришло время создать контейнер Nginx. Просто добавьте второй флаг -v с соответствующими путями, чтобы дать новому контейнеру Nginx соответствующие ссылки для запуска из вашего собственного файла конфигурации.

  1. sudo docker run --name docker-nginx -p 80:80 -v ~/docker-nginx/html:/usr/share/nginx/html -v ~/docker-nginx/default.conf:/etc/nginx/conf.d/default.conf -d nginx

Эта команда также по-прежнему связывает настраиваемые страницы веб-сайта с контейнером.

Обратите внимание, что вам нужно будет перезапустить контейнер с помощью команды docker restart, если вы вносите какие-либо изменения в файл конфигурации после запуска контейнера, поскольку Nginx не выполняет горячую перезагрузку, если его файл конфигурации изменен:

  1. sudo docker restart docker-nginx

Заключение

Теперь у вас есть работающий контейнер Nginx, обслуживающий пользовательскую веб-страницу.

Отсюда мы рекомендуем прочитать о связывании контейнеров Docker, если вы хотите узнать о связывании контейнеров вместе для целей использования Nginx в качестве обратного прокси-сервера для обслуживания других веб-приложений на основе контейнеров.

Если вы хотите управлять группой контейнеров, например контейнером приложения, контейнером базы данных и этим контейнером Nginx, взгляните на Docker Compose.