Для начала, получим актуальную версию официального 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 и наполним следующим содержимым:
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 и отдает статику самостоятельно.