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

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

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

Установка Docker на CentOS/RedHat/Fedora

Есть несколько способов как это можно сделать:

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

Теперь я соберу все до  кучи:

# vim Dockerfile

Содержимое моего докерфайла:

FROM centos:centos7
MAINTAINER Vitaly Natarov <solo.metal@bigmir.net>

# Configure my repo to use my custom Nginx with modsec
RUN mkdir -p /usr/local/src
RUN cd /usr/local/src
RUN yum -y install wget vim htop tar

# install repo for centos
# epel repo
RUN rpm -Uvh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
# remi repo
RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
RUN yum repolist

# install nginx
RUN yum -y install nginx

# tell Nginx to stay foregrounded
ADD nginx.conf /etc/nginx/nginx.conf
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN mkdir -p /var/www
RUN curl https://git.centos.org/sources/httpd/c7/acf5cccf4afaecf3afeb18c50ae59fd5c6504910 \
| tar -xz -C /var/www \
--strip-components=1
RUN sed -i -e 's/Apache/nginx/g' -e '/apache_pb.gif/d' \
/var/www/index.html

# expose HTTP
EXPOSE 80
EXPOSE 8080
EXPOSE 443

# Run
CMD [ "/usr/sbin/nginx" ]

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

PS: ссылки на репозитории могут уже не работать. По этому, их нужно будет поправить!

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

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

$ docker build -t nginx:base .

Я использую:

$ docker build -rm -t captain/nginx:centos7 .

captain- пользователь (чтобы понимать кто создал контейнер).
nginx- говорит нам что в ОС есть nginx (чтобы не забыть).
centos7 — ОС.

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

$ docker images
doker images

doker images

Как видно на рисунке, что образ создан и готов к первому тестовому запуску.  Итак, запустим его:

$ docker run -d nginx:base

be8bc473c989a860225ca32fd96197e7dce5b8eeb3249ccac09820aa3bdc8f49

Но лучше указывать еще порт (можно так же указать и ИП адрес), но перед этим я указал имя:

$ docker run --name test-nginx -p 8080:80 -d nginx:base  /bin/bash

Я выполняю:

$ docker run -d -p 80:80 captain/nginx:centos7

Но есть одно но, необходимо переопределять (желательно):

  • /var/log/nginx/  -это логи самого  nginx.
  • /var/www/ — это домашняя папка для сайтов.
  • /etc/nginx/conf.d/ -папка с виртуальными хостами

То есть, должно запускаться следующим образом:

$ docker run -d -p 80:80 -v/var/log/nginx:/var/log/nginx/ captain/nginx:centos7

Как вы можете видеть, каждый раз когда вы запустите контейнер, Docker генерирует новый идентификатор для этого. Давайте посмотрим, если это действительно работает:

$ docker ps -a
docker ps -a

docker ps -a

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

$ docker ps

Наша контейнер  работает. С помощью curl проверим работу:

$ curl http://192.168.103.193

2-й способ.

Это использование готового контейнера на ОС (например, CentOS  или Debian\Ubuntu).

Суть такова:

  • Скачивается контейнер с ОС;
  • Запускается данный контейнер с bash желательно с проброшенным портом ( но можно исправить если забыли);
  • Устанавливается внутри самого контейнера nginx;
  • После чего можно сохранить данный образ для дальнейшего использования.

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

Для сравнения :

  • Готовый образ контейнера с nginx ~92 Мб.
  • Готовый образ контейнера с  nginx (мой)~ 340Мб.

Я не думаю что нужно рассказывать как это сделать для данного примера ( я описывал в своей предыдущей статье).

Тема «Установка nginx в контейнере на Docker» завершина.

One thought on “Установка nginx в контейнере на Docker

  1. docker run -d —restart=unless-stopped —name nginx nginx:alpine

    REPOSITORY TAG IMAGE ID CREATED SIZE
    nginx alpine 36f3464a2197 2 weeks ago 18.6MB

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.