Какую роль играет nginx при докеризации приложения? - PullRequest
0 голосов
/ 05 октября 2019

Я новичок в докере, и я работаю над докеризацией и развертыванием моего приложения на внутреннем сервере на работе.

Структура состоит в том, что у меня есть Dockerfile для моего сервера реагирования + nginx и флягибэкенд. Затем я использую docker-compose для объединения этих Dockerfiles. Я следовал формату, который ранее написали другие люди на моей работе, поэтому я не до конца понимаю все аспекты. Меня особенно смущает роль nginx. Dockerfile, который содержит и response, и nginx, выглядит следующим образом:

FROM node:latest as building

RUN npm config set proxy <proxy for my company>
RUN npm config set https-proxy <proxy for my company>

WORKDIR /app
ENV PATH /node_modules/.bin:$PATH
COPY package.json /app/
COPY ./ /app/
RUN npm install
RUN npm install react-scripts@3.0.1 -g
RUN npm run build

FROM nginx
RUN rm -rf /etc/nginx/conf.d
COPY deployment/nginx.conf /etc/nginx/nginx.conf
COPY --from=building /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

, а мой настроенный файл nginx.conf выглядит как

user  root;
worker_processes auto;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    server {
      server_name <internal_server_box>
                  ;
      listen [::]:80;
      listen 80;
      root /usr/share/nginx/html;
      location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html =404;
      }
      location /v1 {
        proxy_pass <backend_container>:5000;
      }
    }
    client_max_body_size 2M;
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;
}

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

Ответы [ 2 ]

0 голосов
/ 05 октября 2019

У nginx есть две важные роли. (Ни один из них не является специфическим для Docker.) Как вы говорите, это не является строго обязательным, но для меня это похоже на настройку звука.

Стандартный инструментарий сборки Javascript (например, Webpack) в конечном итоге компилируется в набор статическихфайлы, которые отправляются в браузер. Если у вас есть контейнер "frontend", он никогда не запускает ваш код React, он просто обслуживает его. Хотя большинство фреймворков имеют встроенный сервер разработки, они также имеют большой отказ от ответственности «не для использования в производственных целях». Вы можете увидеть это в своем Dockerfile: сборка первого этапа компилирует приложение, а на втором этапе он просто копирует встроенные артефакты.

Существуют некоторые практические проблемы, которые решаются, если браузер может видетькод Javascript и базовый API на одном и том же сервисе. (Код браузера может просто включать ссылки на /v1/... без необходимости знать имя хоста; вам не нужно делать трюки, чтобы обойти ограничения CORS.) Это то, что делает строка proxy_pass в конфигурации nginx.

Я считаю, что общий шаблон этого Dockerfile является очень стандартной установкой Docker. Сначала это COPY s некоторый код в;это компилирует или упаковывает это;а затем он устанавливает минимальный пакет времени выполнения, который содержит только то, что необходимо для запуска или обслуживания приложения. Ваши инструменты сборки и локальные настройки прокси-сервера HTTP не отображаются на конечном изображении. Вы можете запустить получившееся изображение без каких-либо прикрепленных томов. Это соответствует типу настроек Docker, которые я построил для других языков.

0 голосов
/ 05 октября 2019

В общем случае нет необходимости или требования устанавливать nginx, если вы хотите что-то докернизировать.

Если то, что вы докертизируете, это какое-то веб-приложение (в широком смысле,то есть что-то, с чем люди будут использовать свои браузеры или HTTP API для взаимодействия), и он может обрабатывать только одно клиентское соединение за раз, преимущество веб-сервера в том, чтобы обеспечивать поддержку нескольких одновременных клиентов.

Многие веб-фреймворки позволяют обслуживать одного пользователя или небольшое количество пользователей без веб-сервера, но это не масштабируется для производственного использования с таким количеством одновременных клиентов, какое оборудование может обработать. При развертывании вы добавляете веб-сервер между ними, чтобы позаботиться о том, чтобы порождать столько экземпляров кода обработки на стороне сервера, сколько необходимо для поддержки, а также обрабатывать обычные задачи веб-сервера, такие как ограничения ресурсов, разрешения доступа, перенаправление,ведение журнала, согласование SSL для HTTPS и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...