С момента моей прошлой заметки про MongoDB в Docker прошло довольно много времени. С тех пор я уже не запускаю руками напрямую docker в CLI с указанием всех его аргументов, так как я нашёл способ поудобнее. О нём я и поведаю в этой заметке на примере запуска веб-сервера nginx для отладки статического сайта. Кстати, при отладке этого блога используется как раз такой метод.

docker-compose

Итак, главный герой, docker-compose. Эта утилита помогает специфицировать контейнеры в декларативном виде, то есть запуск, остановка и другие задачи выполняются посредством конфигурационного файла (по умолчанию docker-compose.yml). Давайте взглянем, каким образом нужно его оформить, чтобы запустить официальный контейнер веб-сервера nginx, который будет отдавать статику из указанной директории. В моём случае я располагаю файл docker-compose.yml в корневой директории проекта.

version: '3'
services:
  nginx:
    image: "nginx:latest"
    ports:
      - "127.0.0.1:8080:80"
    volumes:
      - "./build:/usr/share/nginx/html:ro"

Выглядит просто, но давайте разберём всё по порядку.

version

version: '3' указывает версию конфигурационного файла, на момент написания заметки, 3-я версия является наиболее актуальной.

services

Каждый элемент раздела services отвечает за конкретный сервис. В нашем случае он один, где nginx это просто имя сервиса, ничего более.

image

image: "nginx:latest" специфицирует, из какого образа будет создан контейнер, в данном случае это официальный образ веб-сервера nginx, а :latest это тег образа, который чаще всего отвечает за версию.

ports

- "127.0.0.1:8080:80" отвечает за маппинг 80 порта контейнера на интерфейс 127.0.0.1 и порт 8080 хостовой машины. Иными словами, nginx, слушающий 80-й порт внутри контейнера, позволит нам работать с ним, открывая в браузере адрес 127.0.0.1:8080, или, даже проще, localhost:8080.

volumes

- "./build:/usr/share/nginx/html:ro" определяет маппинг разделов.

  • ./build — директория нашего проекта, в которой лежит собранная версия сайта, то есть статика, которую и необходимо отдавать через веб-сервер.
  • /usr/share/nginx/html — директория внутри контейнера, в которую будет примонтирован раздел с содержимым ./build. Если задаётесь вопросом, почему именно /usr/share/nginx/html, то всё просто, эта директория указана в конфигурации nginx, а конфигурация в свою очередь зашита в базовом образе nginx:latest. Чтобы не собирать руками свой образ со своей конфигурацией, мы просто опираемся на официальный, конфигурация которого уже готова отдавать статику именно из этой директории.
  • ro в конце декларации отвечает за то, что раздел будет работать в режиме read-only для нашего контейнера.

Запуск контейнера

Итак, файл конфигурации готов, осталось только запустить. Заходим в корневую директорию проекта и выполняем:

docker-compose up

При первом запуске docker-compose скачает образ nginx, а затем на его основе создаст новый контейнер. При последующих запусках скачивание больше не потребуется, запуск контейнера будет происходить весьма быстро.

Что дальше

Если продолжать развивать тему, то можно увидеть, что docker-compose.yml вполне может отвечать не за один сервис, а за несколько. Это крайне удобно, когда у вас есть проект, требующий сразу несколько серверов (например, веб-сервер и сервер БД). В таком случае, при помощи простой команды docker-compose up достаточно легко подготовить комплексный рантайм зависимостей вашего проекта.

Итак, в итоге мы разобрались, как пользоваться docker-compose в примитивном случае отдачи статического сайта через nginx. Благодарен за ваше внимание, за сим откланиваюсь.

Ссылки

  1. Документация по файлу docker-compose.yml
  2. Официальный образ nginx в репозитории докера, стоит обратить внимание на примеры