Как запустить 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, вы можете ознакомиться с introductory Docker учебником.

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

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

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

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

Предпосылки

Для контейнерирования Nginx, пожалуйста, выполните следующие действия:

  • Настройте сервер Ubuntu 14.04, предпочтительно с https: //www.digitalocean. ru / community / руководства / как использовать ssh-keys-with-digitalocean-droplets [SSH-ключи] для безопасности

  • Настроить sudo user

  • Проверьте версию своего ядра

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

uname -r

Мы включили вывод свежей дроплеты Ubuntu 14.04 ниже, которая превышает 3.10, поэтому вам не о чем беспокоиться, если вы не запускаете это на https://www.digitalocean.com/community/tutorials / Как обновить цифровой сервер-ядро [старое изображение].

Output3.13.0-57-generic

Шаг 1 - Установка Docker

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

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

Как только это завершится, вы увидите установленную версию, как показано ниже (ваше считывание может быть новее; это нормально) и некоторые инструкции для запуска без полномочий 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 +, чтобы убедиться, что все работает должным образом.

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 Client как часть нашей установки Docker, поэтому у нас есть доступ к инструменту командной строки, который позволяет нам взаимодействовать с нашими контейнерами.

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

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

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

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

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

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

sudo docker start

Затем выполните команду для вывода списка контейнеров:

sudo docker ps -a

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

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

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

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

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

sudo docker rm

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

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

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

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

Во-первых, мы получим изображение Nginx.

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

sudo docker pull nginx

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

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

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

sudo docker run --name docker-nginx -p 80:80 nginx
  • + run + - команда для создания нового контейнера

  • Флаг + - name + - это то, как мы указываем имя контейнера (если оставить его пустым, нам будет назначено, как на шаге 2)

  • + -p + определяет порт, который мы представляем в формате + -p local-machine-port: internal-container-port +. В этом случае мы сопоставляем порт 80 в контейнере с портом 80 на сервере

  • + nginx - это имя образа на dockerhub (мы загружали его раньше с помощью команды pull, но Docker сделает это автоматически, если образ отсутствует)

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

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

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

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

sudo docker ps -a

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

OutputCONTAINER 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 + с помощью этой команды:

sudo docker rm docker-nginx

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

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

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

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

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

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

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

sudo docker ps

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

OutputCONTAINER 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

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

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

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

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

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

sudo docker stop docker-nginx

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

sudo docker rm docker-nginx

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

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

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

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

mkdir -p ~/docker-nginx/html
cd ~/docker-nginx/html

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

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, мы можем создать символическую связь между файловой системой Droplet и файловой системой контейнера. Это позволяет нам редактировать наши существующие файлы веб-страниц и добавлять новые в каталог, и наш контейнер автоматически получит к ним доступ. Если вы хотите узнать больше о Docker и томах, ознакомьтесь с data томами документация.

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

  • Оформление ссылки: *

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

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

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 Droplet, вы должны увидеть первый заголовок * Hello Digital Ocean * (или любую другую веб-страницу, созданную на шаге 5).

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

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

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

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

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

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

cd ~/docker-nginx

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

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

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

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

sudo docker stop docker-nginx

Удалите это с:

sudo docker rm docker-nginx

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

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

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 не выполняет горячую перезагрузку, если его файл конфигурации был изменен:

sudo docker restart docker-nginx

Заключение

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

Отсюда, мы рекомендуем прочитать на https://docs.docker.com/userguide/dockerlinks/[container link докера, если вы хотите узнать о связывании контейнеров вместе для целей использования Nginx в качестве обратного прокси-сервера для обслуживания другого контейнера веб-приложения.

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

Related