简而言之,我正在尝试将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时都记住服务器正在运行的一些自定义高端口,那将是一件很高兴的事情,或者这仅仅是事实而已?
答案 0 :(得分:0)
只要不发布端口,我发现在端口上进行公开的问题为零。
EXPOSE不允许通过已定义的端口与同一网络外部的容器或主机进行通信。为此,您需要发布端口。
但是它可以通过在Docker客户端或Docker-Compose --add-cap
上使用cap_add
标志授予内核功能来增加安全漏洞。 NET_BIND_SERVICE是我们应该添加的功能。