Docker-compose для создания nginx entrypoint

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

Рас­смот­рим при­мер фай­ла docker-compose для прок­си­ро­ва­ния запро­сов на дру­гие кон­тей­не­ры и воз­мож­но­стью полу­че­ния сер­ти­фи­ка­тов от Let's Encrypt.

Подготовка

Выпол­ним пред­ва­ри­тель­ные дей­ствия. Пред­по­ла­га­ет­ся, что мы будем хра­нить наш файл docker-compose в ката­ло­ге /opt/nginx.

Созда­ем каталог:

mkdir /opt/nginx

Перей­дем в него:

cd /opt/nginx

Созда­ем файл docker-compose.yml:

vi docker-compose.yml

Мы гото­вы к напи­са­нию сценария.

Docker-compose

При­мер наше­го фай­ла compose:

Описание сценария

1 - 19 Под­ни­ма­ем кон­тей­нер с nginx прокси.
13 Основ­ной кон­фи­гу­ра­ци­он­ный файл nginx.
14 Допол­ни­тель­ные кон­фи­гу­ра­ци­он­ные фай­лы, кото­рые будут под­гру­жать­ся к основ­но­му. В них мы будем хра­нить настрой­ки для вир­ту­аль­ных доменов.
15 Хра­не­ние само­под­пи­сан­ных или плат­ных сертификатов.
16 Ката­лог обме­на кон­тен­том, кото­рый нужен для вали­да­ции доме­на. Исполь­зу­ет­ся при полу­че­нии бес­плат­ных сер­ти­фи­ка­тов от Let's Encrypt.
17 Бес­плат­ные сер­ти­фи­ка­ты, полу­чен­ные от Let's Encrypt.
21 - 24 Общая сеть. Ее мы будем добав­лять к дру­гим служ­бам дру­гих кон­тей­не­ров для обес­пе­че­ния сете­вой доступ­но­сти меж­ду дан­ным кон­тей­не­ра­ми и нашим entrypoint.

Запуск

Преж­де чем запу­стить кон­тей­нер с entrypoint, созда­ем базо­вый кон­фи­гу­ра­ци­он­ный файл для nginx:

mkdir conf

vi conf/nginx.conf

* это, более или менее, стан­дарт­ный кон­фи­гу­ра­ци­он­ный файл nginx. Но при жела­нии, вы може­те его пере­де­лать под себя.
** для нас осо­бую важ­ность име­ет дирек­ти­ва include со зна­че­ни­ем /etc/nginx/conf.d/*.conf — это наш ката­лог для под­гру­жа­е­мых конфигов.

Про­дол­жая нахо­дить­ся в ката­ло­ге с фай­лом docker-compose, выпол­ним команду:

docker-compose up -d

При пер­вом запус­ке систе­ма загру­зит образ с nginx и запу­стит кон­тей­нер. Посмот­реть его состо­я­ние мож­но командой:

docker ps

Пример конфигурации виртуального домена

Рас­смот­рим про­стой при­мер созда­ния кон­фи­гу­ра­ци­он­но­го фай­ла для прок­си­ро­ва­ния http запросов.

Убе­дим­ся, что мы нахо­дим­ся в рабо­чем каталоге:

cd /opt/nginx

Созда­ем кон­фи­гу­ра­ци­он­ный файл:

vi conf/conf.d/test.domain.ru.conf

* обя­за­тель­но, что­бы назва­ние фай­ла закан­чи­ва­лось на .conf.

* nginx с дан­ной кон­фи­гу­ра­ци­ей будет пере­во­дить запро­сы на кон­тей­нер my_site_container для запро­сов к сай­ту test.domain.ru.
** обра­ти­те вни­ма­ние, что мы преду­смот­ре­ли в буду­щем воз­мож­ность исполь­зо­вать https, но что­бы нам опции не меша­ли, пока оста­ви­ли их закомментированными.

Что­бы наш кон­фи­гу­ра­ци­он­ный файл рабо­тал, кон­тей­нер nginx-entrypoint дол­жен видеть сер­вис my_site_container (из наше­го при­ме­ра). Созда­дим его для теста:

docker run --rm -d --name my_site_container --network dnet nginx

* наш кон­тей­нер будет с име­нем my_site_container, рабо­тать в сети dnet.

Теперь мож­но при­ме­нить кон­фи­гу­ра­цию nginx, но для нача­ла, про­ве­рим кор­рект­ность конфига:

docker exec nginx-entrypoint nginx -t

Если видим:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

… пере­чи­ты­ва­ем конфигурацию:

docker exec nginx-entrypoint nginx -s reload

Мож­но про­ве­рять — при обра­ще­нии к наше­му доме­ну в бра­у­зе­ре мы долж­ны полу­чить стра­ни­цу при­вет­ствия nginx:

После завер­ше­ния про­вер­ки мож­но уда­лить тесто­вый контейнер:

docker rm -f my_site_container

И уже рабо­тать со сво­и­ми образами.

Настройка других docker-compose

Так­же рас­смот­рим неболь­шой при­мер кус­ка сце­на­рия для дру­гих фай­лов docker-compose, где будут опи­са­ны сер­ви­сы, кото­рые долж­ны вза­и­мо­дей­ство­вать с нашим nginx-entrypoint. Послед­ний рабо­та­ет в создан­ной сети dnet — это зна­чит, что для сер­ви­са нуж­но ука­зать такую настройку:

* ито­го, что­бы все рабо­та­ло, сре­ди переч­ня сетей долж­на быть пере­чис­ле­на та, в кото­рой нахо­дит­ся nginx-entrypoint (в нашем при­ме­ре это dnet).

Получение сертификата

Ну и напо­сле­док, рас­смот­рим про­цесс полу­че­ния сер­ти­фи­ка­та от Let's Encrypt

Для полу­че­ния сер­ти­фи­ка­та в docker мы будем исполь­зо­вать образ certbot/certbot

* в дан­ном при­ме­ре мы задей­ству­ем пути, кото­рые опи­са­ли выше в сце­на­рии — ката­лог /opt/letsencrypt, куда будут сохра­не­ны полу­чен­ные сер­ти­фи­ка­ты и /opt/nginx/well-known для раз­ме­ще­ния вре­мен­ных фай­лов, необ­хо­ди­мых при про­вер­ке домена.
** Мы полу­чим сер­ти­фи­ка­ты для хостов test.domain.ru и www.test.domain.ru. Важ­но, что­бы дан­ные име­на вели на наш сер­вер с nginx.

Если все прой­дет успеш­но, мы увидим:

Теперь нуж­но вер­нуть­ся к кон­фи­гу­ра­ци­он­но­му фай­лу для вир­ту­аль­но­го доме­на и раз­ре­шить исполь­зо­ва­ние ssl (снять комментарии):

vi /opt/nginx/conf/conf.d/test.domain.ru.conf

Про­ве­ря­ем кон­фи­гу­ра­цию и пере­чи­ты­ва­ем ее:

docker exec nginx-entrypoint nginx -t

docker exec nginx-entrypoint nginx -s reload

Сно­ва откры­ва­ем в бра­у­зе­ре наш сайт — запрос дол­жен быть пере­бро­шен на https.