Установка nginx в контейнере на Docker



Хочу в своей статье «Установка nginx в контейнере на Docker» описать процесс установки nginx внутри Docker. Надеюсь что у Вас уже установлен  Docker.

Есть несколько способов как это можно сделать:
1-й способ. 
Это использование файла  Dockerfile  для создания конфигурационного файла, который создаст контейнер. В этом файле можно указать почти все параметры и так же любые команды. Я расскажу как можно это сделать, но поговорим немного о самой структуре данного файла.
Dockerfile
Этот файл похож на Gemfile, Vagrantfile или Berksfile. Это центральный кусок для создания контейнера Докер. Конечно, можно Docker запустить «docker run -i -t foo /bin/bash», а затем настроить контейнер. Но это не сильно удобно и не знаешь как оно все работает + с конфигурационном файлом вы можете воспроизвести тот же контейнер, снова и снова без возможного отклонения.
Я возьму сейчас минимальную конфигурацию для Dockerfile, которая даст возможность установить nginx  который будет работает в контейнере. Я объясню основы, пожалуйста, обратитесь к официальной документации Dockerfile для полного обзора (если потребуется).
FROM
Должна быть первая запись в вашем Dockerfile. Эта строчка сообщает Docker на базе которого дистрибутива  будит создан новой образ.
FROM centos
MAINTAINER
Если Вы вылаживаете (публикуете) свои образы, то стоит прописать данную строку. Она даст возможность видеть кто автор данного образа или контейнера.
MAINTAINER Vitaly Natarov <solo.metal@bigmir.net>
ADD
Я поддерживаю кастомную сборку Nginx + ModSecurity для своих потребностей. Мне нужно извлечь файл конфигурации хранилища. Я буду все ставить именно с данного репозитория.
ADD http://static.theroux.ca/repository/failshell.repo /etc/yum.repos.d/
В основном, «ADD» позволяет извлекать файлы и скопировать их куда-нибудь в вашем контейнере.
RUN
Используется для настройки вашего контейнера. Вы можете установить столько, сколько вы хотите в вашем Dockerfile.
ПРИМЕЧАНИЕ: На данный момент, я не уверен, но, как я буду интегрировать Chef с Докер. Т.к не сильно много пользовательских конфигураций.
RUN yum -y install nginx
Обратите вниманиена foreground vs background
По пути к докеру, на вашем контейнере должна работать только одна служба. Вот и вся цель использования контейнеров в конце концов. Таким образом вы запускаете ваши услуги на передний план (foreground), но не наbackground. Вы в основном работаете с одной командой, это единственная цель вашего контейнера. Очень простодушный контейнер 
Таким образом, мы должны сказать Nginx-у, чтобы он выполнил это!
RUN echo «daemon off;» >> /etc/nginx/nginx.conf
EXPOSE
Пробрасывает порты наружу.
EXPOSE 80
ПРИМЕЧАНИЕ: Это внутренний порт. Это будет отличаться один, который будет использоваться снаружи. Это назначается динамически Докер.
CMD
Сердце и душа вашего контейнера. Что он делает. Это цель жизни!
CMD /usr/sbin/nginx -c /etc/nginx/nginx.conf
Теперь я соберу все до  кучи:
sh
1 lines

# vim·Dockerfile
Содержимое моего докерфайла:
sh
35 lines

FROM centos:centos7MAINTAINER Vitaly Natarov <solo.metal@bigmir.net># Configure my repo to use my custom Nginx with modsecRUN mkdir -p /usr/local/srcRUN cd /usr/local/srcRUN yum -y install wget vim htop tar# install repo for centos# epel repoRUN rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm# remi repoRUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpmRUN yum repolist# install nginxRUN yum -y install nginx# tell Nginx to stay foregroundedADD nginx.conf /etc/nginx/nginx.confRUN echo "daemon off;" >> /etc/nginx/nginx.confRUN mkdir -p /var/wwwRUN curl https://git.centos.org/sources/httpd/c7/acf5cccf4afaecf3afeb18c50ae59fd5c6504910 \| tar -xz -C /var/www \--strip-components=1RUN sed -i -e 's/Apache/nginx/g' -e '/apache_pb.gif/d' \/var/www/index.html# expose HTTPEXPOSE 80EXPOSE 8080EXPOSE 443# RunCMD [ "/usr/sbin/nginx" ]

Так же нужен конфиг с nginx. Я советую просто скачать мои конфиги, и, если не нравиться что-то, то просто поменять:
https://github.com/SebastianUA/Docker/tree/master/docker_nginx_centos7
PS: ссылки на репозитории могут уже не работать. По этому, их нужно будет поправить!

Сборка контейнера.

Когда все необходимое прописать в файл Dockerfile, можно приступить к сборке контейнера:
sh
1 lines





$ docker build -t nginx:base .
Я использую:
sh
1 lines





$·docker build -rm -t captain/nginx:centos7 .
captain- пользователь (чтобы понимать кто создал контейнер).
nginx- говорит нам что в ОС есть nginx (чтобы не забыть).
centos7 — ОС.
После данной команды, начнется скачивание образа на CentOS и установки в него nginx. После завершения Вы должны увидеть ваш новый докер в имеющихся образах:
sh
1 lines





$ docker images
doker imagesdoker images
Как видно на рисунке, что образ создан и готов к первому тестовому запуску.  Итак, запустим его:
sh
1 lines





$ docker run -d nginx:base
be8bc473c989a860225ca32fd96197e7dce5b8eeb3249ccac09820aa3bdc8f49
Но лучше указывать еще порт (можно так же указать и ИП адрес), но перед этим я указал имя:
sh
1 lines





$·docker run --name test-nginx -p 8080:80·-d nginx:base ·/bin/bash
Я выполняю:
sh
1 lines





$·docker run -d -p 80:80 captain/nginx:centos7
Но есть одно но, необходимо переопределять (желательно):
  • /var/log/nginx/  -это логи самого  nginx.
  • /var/www/ — это домашняя папка для сайтов.
  • /etc/nginx/conf.d/ -папка с виртуальными хостами
То есть, должно запускаться следующим образом:
sh
1 lines





$·docker run -d -p 80:80 -v/var/log/nginx:/var/log/nginx/ captain/nginx:centos7
Как вы можете видеть, каждый раз когда вы запустите контейнер, Docker генерирует новый идентификатор для этого. Давайте посмотрим, если это действительно работает:
sh
1 lines





$·docker ps -a
docker ps -adocker ps -a
На рисунке видны все созданные контейнера, чтобы увидеть запущенные контейнера, выполните:
sh
1 lines





$ docker ps
Наша контейнер  работает. С помощью curl проверим работу:
sh
1 lines





$ curl http://192.168.103.193
2-й способ.
Это использование готового контейнера на ОС (например, CentOS  или Debian\Ubuntu).
Суть такова:
  • Скачивается контейнер с ОС;
  • Запускается данный контейнер с bash желательно с проброшенным портом ( но можно исправить если забыли);
  • Устанавливается внутри самого контейнера nginx;
  • После чего можно сохранить данный образ для дальнейшего использования.
Этот способ самы простой, но он имеет достаточно большой обьем образа ( пока не нашел как его уменьшить).
Для сравнения :
  • Готовый образ контейнера с nginx ~92 Мб.
  • Готовый образ контейнера с  nginx (мой)~ 340Мб.
Я не думаю что нужно рассказывать как это сделать для данного примера ( я описывал в своей предыдущей статье).
Тема «Установка nginx в контейнере на Docker» завершина.
Добавить комментарий

Оставить комментарий