【问题标题】:How to proxy_pass to a node docker container on port 80 with nginx container如何使用 nginx 容器代理传递到端口 80 上的节点 docker 容器
【发布时间】:2019-06-02 02:40:06
【问题描述】:

简而言之,我正在尝试设置一个 nginx 容器来 proxy_pass 到端口 80 上的其他容器。

我正在关注本教程:https://dev.to/domysee/setting-up-a-reverse-proxy-with-nginx-and-docker-compose-29jg

他们描述了一个 docker compose 文件,看起来像这样:

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 身份运行是不好的做法……那么世界上怎么可能发生这样的事情呢?我觉得我在这里遗漏了一些东西。每次在 nginx 中执行 proxy_pass 时,不必记住服务器正在运行的一些自定义高端口会很好......或者这只是生活中的事实?

【问题讨论】:

    标签: docker nginx proxy reverse-proxy


    【解决方案1】:

    只要我们不发布端口,我认为在端口上进行公开是零问题。

    EXPOSE 将不允许通过定义的端口与同一网络之外的容器或主机进行通信。要实现这一点,您需要发布端口。

    但它可以通过在 Docker 客户端或 Docker-Compose cap_add 上使用 --add-cap 标志授予内核功能来增加安全漏洞为代价。 NET_BIND_SERVICE 是我们应该添加的功能。

    【讨论】:

    • 这可能是一个足够好的答案。我只是想说我放弃了80端口的想法,直接去8080了码头工人-compose.yml。只是不要使用端口映射选项,因为这会使端口发生冲突。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2018-07-28
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    相关资源
    最近更新 更多