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

Thank you for reading this post, don't forget to subscribe!

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

1-й способ. 

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

Dockerfile

Это цен­траль­ный кусок для созда­ния кон­тей­не­ра Докер. Конеч­но, мож­но Docker запу­стить «docker run -i -t foo /bin/bash», а затем настро­ить кон­тей­нер. Но это не силь­но удоб­но и не зна­ешь как оно все рабо­та­ет + с кон­фи­гу­ра­ци­он­ном фай­лом вы може­те вос­про­из­ве­сти тот же кон­тей­нер, сно­ва и сно­ва без воз­мож­но­го отклонения.

Я возь­му сей­час мини­маль­ную кон­фи­гу­ра­цию для Dockerfile, кото­рая даст воз­мож­ность уста­но­вить nginx  кото­рый будет рабо­та­ет в кон­тей­не­ре. Я объ­яс­ню осно­вы, пожа­луй­ста, обра­ти­тесь к офи­ци­аль­ной доку­мен­та­ции Dockerfile для пол­но­го обзо­ра (если потребуется).

FROM

Долж­на быть пер­вая запись в вашем Dockerfile. Эта строч­ка сооб­ща­ет Docker на базе кото­ро­го дис­три­бу­ти­ва  будит создан новой образ.

FROM centos

MAINTAINER

Если Вы выла­жи­ва­е­те (пуб­ли­ку­е­те) свои обра­зы, то сто­ит про­пи­сать дан­ную стро­ку. Она даст воз­мож­ность видеть кто автор дан­но­го обра­за или контейнера.

MAINTAINER mid  <mid@sidmid.ru>

ADD

Я под­дер­жи­ваю кастом­ную сбор­ку Nginx + ModSecurity для сво­их потреб­но­стей. Мне нуж­но извлечь файл кон­фи­гу­ра­ции хра­ни­ли­ща. Я буду все ста­вить имен­но с дан­но­го репозитория.

ADD http://static.theroux.ca/repository/failshell.repo /etc/yum.repos.d/

В основ­ном, «ADD» поз­во­ля­ет извле­кать фай­лы и ско­пи­ро­вать их куда-нибудь в вашем контейнере.

RUN

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

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

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

Так же нужен кон­фиг с nginx

vim nginx.conf

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

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

Когда все необ­хо­ди­мое про­пи­сать в файл 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

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

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

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

curl http://192.168.103.193

2-й способ.

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

Суть тако­ва:

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

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

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

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