Найти тему
Default Web development

Docker nginx

Для начала, получим актуальную версию официального docker образа nginx.

docker pull nginx

Затем, создадим новую bridge сеть докера, чтобы контейнеры могли "видеть" друг друга по присвоенным именам.

docker network create mynet

Создадим где-нибудь папку, например ~/nginx. В ней будут храниться конфигурационные файлы и логи. Для более тонкой настройки, вынесем из контейнера файл nginx.conf наружу.

docker run -it --rm -d --name tmp-nginx nginx bash

Мы запустили контейнер nginx. Теперь достанем интересующий нас файл.

cd ~/nginx
docker cp tmp-nginx:/etc/nginx/nginx.conf ./nginx.conf
docker stop tmp-nginx

Подготовим полную структуру конфигураций.

Создаем следующий набор директорий:

~/nginx/common
~/nginx/conf.d
~/nginx/logs
~/nginx/certs

common будет содержать подключаемые файлы конфигураций. Например, кладем туда файл gzip, помещаем конфигурацию:

gzip on;
gzip_proxied any;
[...]

Теперь в конфигурации достаточно прописать строку

include common/gzip;

conf.d - сюда будем класть наши конфигурации приложений.

logs - логи работы nginx

certs - папка для хранения ssl сертификатов

Запустим наш контейнер с nginx:

docker run -i \
--network mynet \
-p 80:80 -p 443:443 \
-v /home/user/nginx/logs:/var/log/nginx \
-v /home/user/nginx/conf.d:/etc/nginx/conf.d \
-v /home/user/nginx/common:/etc/nginx/common \
-v /home/user/nginx/certs:/etc/nginx/certs \
-v /var/www:/var/www \
-v /home/user/nginx/nginx.conf:/etc/nginx/nginx.conf \
--name nginx nginx

Провешиваем все папки, биндим порты. /var/www - предполагаемое место хранения Ваших приложений. Необходимо для отдачи статики.

Контейнер запущен. Самое время начать отдавать наше первое приложение.

Кладем в conf.d файл resolver.conf следующего содержания:

resolver 127.0.0.11;

ВАЖНО! Чтобы все работало правильно, контейнеры приложений также должны запускаться с параметром --network mynet. Тогда, nginx будет обращаться к 127.0.0.1 и стандартный dns resolver docker позволит правильно работать с другими контейнерами по их именам. И не забываем указать --name для всех контейнеров.

Предположим, у Вас работает приложение с именем my-awesome-app и оно прицеплено к сети mynet. Внутри этого контейнера используется php-fpm, а вебрутом выступает /var/www/public. Вне контейнера файлы лежат по пути /var/www/myapp.

Создадим в папке ~/nginx/conf.d файл myapp.ru.conf и наполним следующим содержимым:

-2

https://pastebin.com/tLpbajAc - ссылка на код

Осталось проверить, что все нормально и перезапустить сервер:

docker exec -it nginx nginx -t

Провели валидацию конфигов. Если здесь есть какие-то ошибки, необходимо их исправить.

docker exec nginx /usr/sbin/nginx -s reload

Перезагрузили nginx и применили наши настройки. Делать это необходимо каждый раз, при изменении файлов в conf.d

Все, мы получили рабочий сервер nginx, который переадресует запросы к myapp.ru в контейнер, если это php и отдает статику самостоятельно.