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

Объяснение Docker: как контейнеризовать и использовать Nginx в качестве прокси


Статус: устарело

Эта статья устарела и больше не поддерживается.

Причина

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

Смотрите вместо этого

  • Экосистема Docker: введение в общие компоненты
  • Как запустить Nginx в контейнере Docker в Ubuntu 14.04

Введение

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

В этой статье DigitalOcean мы узнаем о быстрой настройке докера, создании контейнера докера из базового образа и построении его для запуска Nginx слой за слоем. После этого, следуя нашим шагам с самого начала, мы создадим Dockerfile для автоматизации всего этого процесса. В конце концов, используя этот образ докера Nginx, вы сможете создавать автономные песочницы, работающие под управлением Nginx, которые можно использовать для обслуживания ваших «докеризированных» приложений.

Глоссарий

1. Докер вкратце

2. Кратко о Nginx

3. Установка Docker на Ubuntu

4. Основные команды Docker

  1. Запуск демона Docker и использование CLI
  2. Команды Docker

5. Создание контейнера Docker с установленным Nginx

  1. Создание базового контейнера Docker из Ubuntu
  2. Подготовка базового контейнера к установке Nginx
  3. Установка Nginx
  4. Настройка Nginx

6. Создание Dockerfile для автоматической сборки образа

  1. Основные сведения о файле Docker
  2. Обзор команд Dockerfile
  3. Создание Dockerfile
  4. Определение основ
  5. Инструкции по установке Nginx
  6. Самозагрузка
  7. Окончательный файл Docker
  8. Использование Dockerfile для автоматической сборки контейнеров Nginx

Докер вкратце

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

Docker достигает этого путем создания безопасных сред на основе LXC (то есть контейнеров Linux) для приложений, называемых «контейнерами докеров». Эти контейнеры создаются с использованием образов докеров, которые можно создавать либо путем выполнения команд вручную, либо автоматически через файлы Dockerfiles.

Примечание. Чтобы узнать больше о докере и его частях (например, демоне докеров, интерфейсе командной строки, изображениях и т. д.), ознакомьтесь с нашей вводной статьей к проекту: Объяснение докера: Начало работы.

Коротко о Nginx

Nginx — очень производительный веб-сервер/(обратный)-прокси). Он достиг своей популярности благодаря небольшому весу, относительной простоте работы и легкости расширения (с помощью надстроек/плагинов). Благодаря своей архитектуре он способен обрабатывать множество запросов (практически неограниченных), с которыми, в зависимости от загрузки вашего приложения или веб-сайта, может быть очень сложно справиться, используя более старые альтернативы. Его можно рассматривать как инструмент для обслуживания статических файлов, таких как изображения, сценарии или таблицы стилей.

Установка Docker на Ubuntu (последняя версия)

В своем последнем выпуске (0.7.1. от 5 декабря) Docker можно развернуть в различных операционных системах Linux, включая Ubuntu/Debian и CentOS/RHEL.

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

Мы быстро рассмотрим процесс установки Ubuntu (последней версии).

Инструкции по установке для Ubuntu

Обновите свою каплю:

sudo aptitude    update
sudo aptitude -y upgrade

Убедитесь, что поддержка aufs доступна:

sudo aptitude install linux-image-extra-`uname -r`

Добавьте ключ репозитория докеров в apt-key для проверки пакета:

sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"

Добавьте репозиторий докеров в исходники aptitude:

sudo sh -c "echo deb http://get.docker.io/ubuntu docker main\
> /etc/apt/sources.list.d/docker.list"

Обновите репозиторий новым дополнением:

sudo aptitude    update

Наконец, скачайте и установите докер:

sudo aptitude install lxc-docker

Брандмауэр Ubuntu по умолчанию (UFW: Uncomplicated Firewall) по умолчанию запрещает весь пересылаемый трафик, который необходим докеру.

Включите переадресацию с помощью UFW:

Отредактируйте конфигурацию UFW с помощью текстового редактора nano.

sudo nano /etc/default/ufw

Прокрутите вниз и найдите строку, начинающуюся с DEFAULT_FORWARD_POLICY.

Заменять:

DEFAULT_FORWARD_POLICY="DROP"

С:

DEFAULT_FORWARD_POLICY="ACCEPT"

Нажмите CTRL+X и подтвердите с помощью Y, чтобы сохранить и закрыть.

Наконец, перезагрузите UFW:

sudo ufw reload

Основные команды Docker

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

Запуск демона Docker и использование CLI

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

Запуск демона докера:

sudo docker -d &

Докер CLI Использование:

sudo docker [option] [command] [arguments]

Примечание: для работы докеру необходимы привилегии sudo.

Докер-команды

Вот сводка доступных в настоящее время (версия 0.7.1) команд docker:

attach:	Attach to a running container
build:	Build a container from a Dockerfile
commit:	Create a new image from a container's changes
cp:		Copy files/folders from the containers filesystem to the host path
diff:		Inspect changes on a container's filesystem
events:	Get real time events from the server
export:	Stream the contents of a container as a tar archive
history:	Show the history of an image
images:	List images
import:	Create a new filesystem image from the contents of a tarball
info:	Display system-wide information
insert:	Insert a file in an image
inspect:	Return low-level information on a container
kill:		Kill a running container
load:	Load an image from a tar archive
login:	Register or Login to the docker registry server
logs:	Fetch the logs of a container
port:	Lookup the public-facing port which is NAT-ed to PRIVATE_PORT
ps:		List containers
pull:		Pull an image or a repository from the docker registry server
push:	Push an image or a repository to the docker registry server
restart:	Restart a running container
rm:		Remove one or more containers
rmi:		Remove one or more images
run:		Run a command in a new container
save:	Save an image to a tar archive
search:	Search for an image in the docker index
start:	Start a stopped container
stop:	Stop a running container
tag:		Tag an image into a repository
top:		Lookup the running processes of a container
version:	Show the docker version information

Давай начнем!

===

Создание контейнера Docker с установленным Nginx

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

Примечание. Хотя после выполнения этого раздела у нас будет работающий док-контейнер с установленным Nginx, это определенно не рекомендуемый метод из-за его сложности. Однако здесь мы предлагаем вам возможность научиться работать с живым контейнером и ознакомиться с командами, которые нам нужно будет определить позже для автоматизации процесса. Чтобы создать образ Docker с установленным Nginx намного лучше, см. следующий раздел: Создание файла Docker для автоматической сборки образа Nginx.

Создание базового контейнера Docker из Ubuntu

Используя команду docker RUN, мы начнем с создания нового контейнера на основе образа Ubuntu. Мы собираемся присоединить к нему терминал с помощью флага \-t.

sudo docker run -i -t -p 80:80 ubuntu /bin/bash

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

Помните: вы будете привязаны к созданному вами контейнеру. Чтобы отсоединиться и вернуться к основной точке доступа к терминалу, выполните escape-последовательность: CTRL+P, затем CTRL+Q. Присоединение к контейнеру докеров похоже на подключение к новой капле внутри другой.

Чтобы снова прикрепиться к этому контейнеру:

  1. Вывести список всех запущенных контейнеров с помощью sudo docker ps
  2. Найти его идентификатор
  3. Используйте sudo docker attach [id] для обратного подключения к терминалу

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

Подготовка базового контейнера к установке Nginx

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

Давайте добавим universe Ubuntu в список по умолчанию базового образа.

echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list

Обновите список новым добавленным источником.

apt-get update

Прежде чем мы приступим к установке Nginx, необходимо установить некоторые инструменты, такие как nano, на всякий случай.

apt-get install -y nano \
                   wget \
                   dialog \
                   net-tools    

Установка Nginx

Благодаря тому, что он доступен в репозитории, мы можем просто использовать apt-get для загрузки и установки nginx.

apt-get install -y nginx

Настройка Nginx

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

# Delete the default configuration
rm -v /etc/nginx/nginx.conf

# Create a blank one using nano text editor
nano /etc/nginx/nginx.conf

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

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

Начните со следующего в качестве первой строки nginx.conf:

daemon off;

Мы будем использовать простой образец конфигурации, чтобы запустить Nginx в качестве обратного прокси-сервера. Скопируйте и вставьте следующее после инструкции daemon off;.

worker_processes 1;

events { worker_connections 1024; }

http {

    sendfile on;

    gzip              on;
    gzip_http_version 1.0;
    gzip_proxied      any;
    gzip_min_length   500;
    gzip_disable      "MSIE [1-6]\.";
    gzip_types        text/plain text/xml text/css
                      text/comma-separated-values
                      text/javascript
                      application/x-javascript
                      application/atom+xml;

    # List of application servers
    upstream app_servers {
    
        server 127.0.0.1:8080;
    
    }

    # Configuration for the server
    server {

        # Running port
        listen 80;

        # Proxying the connections connections
        location / {

            proxy_pass         http://app_servers;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;

        }
    }
}

Сохраните и выйдите, нажав CTRL+X и подтвердив Y.

Чтобы запустить Nginx, вы можете выполнить следующее:

service nginx start

Вот и все! Теперь у нас есть Nginx, работающий в док-контейнере, доступный из внешнего мира через порт 80, как мы установили с помощью флага -p 80:80.

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

Создание Dockerfile для автоматической сборки образа

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

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

Прежде чем мы начнем работать с Dockerfile, давайте быстро рассмотрим основы.

Основы Dockerfile

Файлы Docker — это скрипты, содержащие команды, объявленные последовательно, которые должны выполняться в этом порядке докером для автоматического создания нового образа докера. Они очень помогают при развертывании.

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

Использование:

# Build an image using the Dockerfile at current location
# Tag the final image with [name] (e.g. *nginx*)
# Example: sudo docker build -t [name] .
sudo docker build -t nginx_img . 

Примечание. Чтобы узнать больше о файлах Docker, ознакомьтесь с нашей статьей: Объяснение Docker: использование файлов Docker для автоматизации создания образов.

Обзор команд Dockerfile

  • ДОБАВИТЬ: скопировать файл с хоста в контейнер
  • CMD: установка команд по умолчанию для выполнения или передачи в ENTRYPOINT.
  • ENTRYPOINT: установите приложение точки входа по умолчанию внутри контейнера.
  • ENV: установка переменной среды (например, ключ=значение)
  • EXPOSE: сделать порт доступным снаружи.
  • ОТ: укажите используемое базовое изображение.
  • MAINTAINER: укажите данные автора/владельца файла Dockerfile.
  • RUN: запустить команду и зафиксировать образ конечного результата (контейнера).
  • ПОЛЬЗОВАТЕЛЬ: настройте пользователя для запуска контейнеров из образа.
  • VOLUME: подключение каталога с хоста к контейнеру
  • WORKDIR: укажите каталог для выполнения директив CMD

Создание Dockerfile

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

sudo nano Dockerfile

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

Определение основ

Давайте начнем наш Dockerfile с определения основ (основ), таких как образ FROM (т. е. Ubuntu) и MAINTAINER.

############################################################
# Dockerfile to build Nginx Installed Containers
# Based on Ubuntu
############################################################

# Set the base image to Ubuntu
FROM ubuntu

# File Author / Maintainer
MAINTAINER Maintaner Name

Инструкции по установке Nginx

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

# Install Nginx

# Add application repository URL to the default sources
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list

# Update the repository
RUN apt-get update

# Install necessary tools
RUN apt-get install -y nano wget dialog net-tools

# Download and Install Nginx
RUN apt-get install -y nginx    

Начальная загрузка

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

# Remove the default Nginx configuration file
RUN rm -v /etc/nginx/nginx.conf

# Copy a configuration file from the current directory
ADD nginx.conf /etc/nginx/

# Append "daemon off;" to the beginning of the configuration
RUN echo "daemon off;" >> /etc/nginx/nginx.conf

# Expose ports
EXPOSE 80

# Set the default command to execute
# when creating a new container
CMD service nginx start

Окончательный файл Docker

В итоге Dockerfile должен выглядеть так:

############################################################
# Dockerfile to build Nginx Installed Containers
# Based on Ubuntu
############################################################

# Set the base image to Ubuntu
FROM ubuntu

# File Author / Maintainer
MAINTAINER Maintaner Name

# Install Nginx

# Add application repository URL to the default sources
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list

# Update the repository
RUN apt-get update

# Install necessary tools
RUN apt-get install -y nano wget dialog net-tools

# Download and Install Nginx
RUN apt-get install -y nginx  

# Remove the default Nginx configuration file
RUN rm -v /etc/nginx/nginx.conf

# Copy a configuration file from the current directory
ADD nginx.conf /etc/nginx/

# Append "daemon off;" to the beginning of the configuration
RUN echo "daemon off;" >> /etc/nginx/nginx.conf

# Expose ports
EXPOSE 80

# Set the default command to execute
# when creating a new container
CMD service nginx start

Снова сохраните и выйдите из файла, нажав CTRL+X и подтвердив Y.

Использование Dockerfile для автоматической сборки контейнеров Nginx

Как мы впервые рассмотрели в разделе «Основы», использование Dockerfiles состоит в их вызове с помощью команды «docker build».

Поскольку мы указываем Docker скопировать конфигурацию (например, nginx.conf) из текущего каталога, чтобы заменить конфигурацию по умолчанию, нам нужно убедиться, что она есть вместе с этим файлом Docker, прежде чем начинать процесс сборки.

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

Создайте образец nginx.conf с помощью текстового редактора nano:

sudo nano nginx.conf

И замените его содержимое, чтобы использовать его в качестве прямого прокси для тестирования:

worker_processes 1;

events { worker_connections 1024; }

http {

    sendfile on;
    
    server {

        listen 80;
        
        location / {
            proxy_pass http://httpstat.us/;
            proxy_set_header  X-Real-IP  $remote_addr;
        }
    }
}

Давайте сохраним и выйдем из nginx.conf таким же образом, нажав CTRL+X и подтвердив Y.

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

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

sudo docker build -t nginx_img_1 . 

И используя этот образ, который мы пометили как nginx_img_1, мы можем запустить новый контейнер:

sudo docker run -name nginx_cont_1 -p 80:80 -i -t nginx_img_1

Теперь вы можете посетить IP-адрес вашего дроплета, и ваш работающий док-контейнер Nginx выполнит свою работу, перенаправив вас на страницу проверки состояния HTTP.

Пример:

# Usage: Visit http://[my droplet's ip]
http://95.85.10.236/200

Пример ответа:

200 OK

Полный набор инструкций по установке Docker (включая другие ОС) см. в документации по установке Docker на docker.io.

Прислано: