【问题标题】:How to run node.js on port 80 inside Docker如何在 Docker 内的 80 端口上运行 node.js
【发布时间】:2015-09-28 02:54:22
【问题描述】:

假设我有this Dockerfile

在端口 80 上以非特权用户身份运行它的最佳方式是什么? (前面没有添加网络服务器)?

我试图设置这个:How do I run Node.js on port 80? 但我并不走运,我想我并不深入了解它是如何工作的。

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

【问题讨论】:

  • 使用功能时究竟有什么问题?否则,有什么反对让 Node.js 监听端口 3000,然后使用“-p 80:3000”标志将该端口映射到主机上的端口 80?
  • 我添加了一行 RUN setcap cap_net_bind_service=+ep /path/to/node 作为 root。该过程仍然无法在端口 80 上启动。据我了解,这是因为它是在不同的“会话”期间设置的。关于端口,您是对的,但它位于 ssl 卸载程序的后面,默认情况下使用端口 80 上的后端,我当然可以更改它,但我只是想知道如何让它以正确的方式工作。也许正确的方法是在前面有一个网络服务器?
  • 通常,使用setcap 设置的功能应该是持久的。只是为了确定:您是否将 /path/to/node 替换为 Dockerfile 中 Node.JS 的 实际 路径?
  • 是的,我使用了/usr/local/bin/node,这是which node 显示的实际路径。

标签: node.js docker


【解决方案1】:

根据该站点https://wiki.apache.org/httpd/NonRootPortBinding“setcap”设置在内核级别使用端口 80 的权限。容器在主机内核的命名空间内运行。因此,您的教程仅适用于虚拟机和专用服务器。在主机内核的特权级别上运行 docker 容器可能会更成功:

$ docker run --privileged=true ...

否则,您将不得不避免使用特权端口 (

根据这张票:https://github.com/docker/docker/issues/5650 setcap 通常应与 docker 容器一起使用,但如果您使用 AUFS 文件系统驱动程序,则会失败。这张票是 2014 年的,所以这可能适用于最新的 AUFS 实现。

【讨论】:

  • 感谢您的回答!但我认为以特权运行 docker 容器比在 docker 中使用 root 更糟糕。困扰我的是,它根本没有像您指出的 docker 问题那样抱怨。
  • 也许 setcup 命令无法将设置保存在映像中,必须在容器启动时在 docker-entrypoint.sh 脚本中执行?
猜你喜欢
  • 2011-08-31
  • 2012-02-12
  • 2013-10-02
  • 1970-01-01
  • 2014-08-16
  • 2012-08-22
  • 2013-09-13
  • 2012-02-06
  • 2011-06-16
相关资源
最近更新 更多