如何使用nginx容器在端口80上proxy_pass到节点docker容器

时间:2019-06-02 02:40:07

标签: docker nginx

简而言之,我正在尝试将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时都记住服务器正在运行的一些自定义高端口,那将是一件很高兴的事情,或者这仅仅是事实而已?

1 个答案:

答案 0 :(得分:0)

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

EXPOSE不允许通过已定义的端口与同一网络外部的容器或主机进行通信。为此,您需要发布端口。

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