Установка 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
Как видно на рисунке, что образ создан и готов к первому тестовому запуску. Итак, запустим его:
$ 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
Наша контейнер работает. С помощью curl проверим работу:
$ curl http://192.168.103.193
2-й способ.
Это использование готового контейнера на ОС (например, CentOS или Debian\Ubuntu).
Суть такова:
- Скачивается контейнер с ОС;
- Запускается данный контейнер с bash желательно с проброшенным портом ( но можно исправить если забыли);
- Устанавливается внутри самого контейнера nginx;
- После чего можно сохранить данный образ для дальнейшего использования.
Этот способ самы простой, но он имеет достаточно большой обьем образа ( пока не нашел как его уменьшить).
Для сравнения :
- Готовый образ контейнера с nginx ~92 Мб.
- Готовый образ контейнера с nginx (мой)~ 340Мб.
Я не думаю что нужно рассказывать как это сделать для данного примера ( я описывал в своей предыдущей статье).
Тема «Установка nginx в контейнере на Docker» завершина.
docker run -d —restart=unless-stopped —name nginx nginx:alpine
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx alpine 36f3464a2197 2 weeks ago 18.6MB