如何在Docker内部将node.js运行在端口80上

7

假设我有this Dockerfile

在不添加Web服务器的情况下,以非特权用户身份在端口80上运行它的最佳方法是什么?

我尝试设置了这个:如何在端口80上运行Node.js? 但我没有成功,我认为我不太理解这是如何工作的。

您认为有优雅的解决方案来解决这个问题吗?我有疑虑,但充满希望:)


1
当使用能力时,到底哪些部分出了问题?否则,有什么不允许Node.js在端口3000上进行监听,然后使用“-p 80:3000”标志将该端口映射到主机的端口80吗? - helmbert
我以root身份添加了一行RUN setcap cap_net_bind_service=+ep /path/to/node。但是进程仍然无法在80端口启动。据我所知,这是因为它是在不同的“会话”中设置的。关于端口,你是对的,但它在一个默认使用后端端口80的ssl offloader后面,我当然可以更改它,但我只是想知道如何使它正常工作。也许正确的方法是在前面放一个Web服务器? - Pierre Ozoux
通常,使用 setcap 设置的功能应该是持久的。只是为了确保:您是否在 Dockerfile 中将 /path/to/node 替换为 Node.JS 的实际路径? - helmbert
是的,我使用了/usr/local/bin/node,这是which node显示的实际路径。 - Pierre Ozoux
1个回答

3
根据这个网站 https://wiki.apache.org/httpd/NonRootPortBinding,“setcap”在内核级别上设置了使用端口80的权限。容器在主机机器内核中的命名空间内运行。因此,您的教程只适用于虚拟机和专用服务器。在主机内核特权级别下运行docker容器可能会更成功:
$ docker run --privileged=true ...

否则,您必须避免使用特权端口(<1024)。"Docker Way"通常是避免使用特权容器,仅依赖于端口映射。
根据此工单:https://github.com/docker/docker/issues/5650,setcap通常与docker容器一起使用,但如果您使用AUFS文件系统驱动程序,则会失败。这个工单是从2014年开始的,所以最新的AUFS实现可能会有所不同。

1
谢谢你的回答!但我认为在Docker容器中使用特权比在Docker内部使用root更糟糕。让我困扰的是,它根本没有像你指出的Docker问题那样抱怨。 - Pierre Ozoux
也许 setcup 命令无法在镜像内持久化设置,必须在 docker-entrypoint.sh 脚本中的容器启动时执行? - blacklabelops

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接