Как proxy_pass в контейнер докера узла на порту 80 с контейнером nginx - PullRequest
2 голосов
/ 02 июня 2019

Короче говоря, я пытаюсь настроить контейнер nginx для proxy_pass для других контейнеров через порт 80.

Я следовал этому уроку: https://dev.to/domysee/setting-up-a-reverse-proxy-with-nginx-and-docker-compose-29jg

Они описывают наличие файла для создания докера, который выглядит примерно так:

version: '3'
services:
  nginx: 
    image: nginx:latest
    container_name: production_nginx
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/error.log:/etc/nginx/error_log.log
      - ./nginx/cache/:/etc/nginx/cache
      - /etc/letsencrypt/:/etc/letsencrypt/
    ports:
      - 80:80
      - 443:443

  your_app_1:
    image: your_app_1_image:latest
    container_name: your_app_1
    expose:
      - "80"

  your_app_2:
    image: your_app_2_image:latest
    container_name: your_app_2
    expose:
      - "80"

  your_app_3:
    image: your_app_3_image:latest
    container_name: your_app_3
    expose:
      - "80"

Затем в конфигурации nginx они делают proxy_pass на основе пути, подобного этому:

proxy_pass http://your_app_1:80;

Это все делаетсмысл для меня, однако, когда я делал сервер тестового узла для прослушивания порта 80, я получаю сообщение об ошибке: Ошибка: прослушивание EACCES: разрешение отклонено 0.0.0.0:80.В моем Dockerfile для сервера узлов я использую другого пользователя:

USER node

Я знаю, что получаю эту ошибку, потому что пользователи без прав root не должны иметь возможность связываться ниже порта 1024 или чего-то еще,И я знаю, что это плохая практика - запускать от имени root в контейнере ... так как в мире это возможно?Я чувствую, что я что-то здесь упускаю.Было бы неплохо не вспоминать какой-то специальный высокопортовый порт, на котором работает ваш сервер, каждый раз, когда вы выполняете proxy_pass в nginx ... или это просто факт жизни?

1 Ответ

0 голосов
/ 02 июня 2019

Я вижу ноль проблем при экспозиции порта, если мы не публикуем порт.

EXPOSE не разрешит связь через определенные порты с контейнерами вне той же сети или с хост-машиной. Чтобы это произошло, вам нужно опубликовать порты.

Но это выполнимо за счет добавления дыр в безопасности путем предоставления возможностей ядра с использованием флага --add-cap на клиенте Docker или Docker-Compose cap_add. NET_BIND_SERVICE - это возможность, которую мы должны добавить.

...