【问题标题】:how to correctly configure ngrok docker container for node or react app?如何为节点或反应应用程序正确配置 ngrok docker 容器?
【发布时间】:2022-02-10 00:56:31
【问题描述】:

我正在尝试使用 ngrok 公开我的本地主机以与朋友共享我的节点后端。 我面临的问题是,每当我启动节点后端时,ngrok 容器都无法工作,因为它会尝试映射与节点使用的端口相同的端口。

node:events:371
      throw er; // Unhandled 'error' event
      ^

Error: listen EADDRINUSE: address already in use :::5000
    at Server.setupListenHandle [as _listen2] (node:net:1319:16)
    at listenInCluster (node:net:1367:12)
    at Server.listen (node:net:1454:7)
    at Function.listen (C:\Users\928941\node_backends\express-for-react\node_modules\express\lib\application.js:618:24)
    at Object.<anonymous> (C:\Users\928941\node_backends\express-for-react\app.js:27:5)
    at Module._compile (node:internal/modules/cjs/loader:1101:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:79:12)
Emitted 'error' event on Server instance at:
    at emitErrorNT (node:net:1346:8)
  code: 'EADDRINUSE',
  errno: -4091,
  syscall: 'listen',
  address: '::',
  port: 5000
}
[nodemon] app crashed - waiting for file changes before starting...

上述错误仅表示端口 5000 当前正在使用中(即,由 ngrok docker 容器使用)。

如果我先运行节点应用程序,然后尝试运行 docker 容器,我会从 docker 收到此错误。

[+] Running 1/0
 - Container docker-compose_for_ngrok_ngrok_1  Created                                                             0.0s
Attaching to ngrok_1
Error response from daemon: Ports are not available: listen tcp 0.0.0.0:5000: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.

这是我的 docker-compose.yml 文件

version: '3'

services:
  ngrok:
    image: ngrok/ngrok:alpine
    ports:
      - 4040:4040
      - 5000:5000
    environment:
      - NGROK_AUTHTOKEN=my_authentication_token
    command: http 5000

compose 文件和这个 docker run 命令一样,所以任何人都可以使用。

docker run -d -p 4040:4040 -p 5000:5000 -e NGROK_AUTHTOKEN=my_token ngrok/ngrok:alpine http 5000

端口 4040 是仪表板的默认 ngrok 端口,它对我来说很好。

我也遇到了 react 应用的这个问题。

【问题讨论】:

  • 为什么要使用 docker 容器?
  • @TheFool 我不想将文件部署到服务器。我想试试 ngrok 隧道。
  • @Marc 我理解你,但我正在学习的机器不是我的,我没有安装任何东西的管理权限,这就是为什么要使用 docker 容器。
  • 为什么要从 docker 容器 2 端口发布?我知道4040 用于Web UI,但是docker 需要保留/使用端口5000 做什么?端口 5000 不应该是您的 node.js 应用程序吗?如果 docker 使用此端口,那么您不能将它用于您的 node.js 应用程序,这会导致“地址已在使用 :::5000”错误。
  • @Marc 如果我不通过提及 5000:5000 来进行端口转发,它不会将我的 docker 网络连接到我机器的本地主机端口。当我提到 4040:4040 时,我正在做那个端口转发,同样需要 5000:5000。如果我的本地机器上有 ngrok cli,我就不必这样做了。

标签: node.js docker docker-compose ngrok


【解决方案1】:

我不确定您是否在 linux 上运行,但如果您使用 --net=host 选项,您可能不需要进行任何端口转发。请参阅https://hub.docker.com/r/ngrok/ngrok/中的示例

docker compose 文件的等价物是network_mode:https://docs.docker.com/compose/compose-file/compose-file-v3/#network_mode

所以你的 docker compose 将是:

version: '3'

services:
  ngrok:
    image: ngrok/ngrok:alpine
    environment:
      - NGROK_AUTHTOKEN=my_authentication_token
    command: http 5000
    network_mode: "host"

假设你的节点在 localhost:5000 上运行,如果你启动一个 docker 容器并使用相同的网络,那么你不需要打开任何端口。

如果您使用的是 mac 或 windows,则需要在此处使用解决方法: https://docs.docker.com/desktop/mac/networking/#use-cases-and-workarounds

改用command: http host.docker.internal:5000。

【讨论】:

  • 似乎没有任何效果。我也尝试过使用主机网络,但现在我什至无法访问在端口 4040 上运行的 ngrok 的仪表板。仅供参考,我正在运行 Windows。
猜你喜欢
  • 2015-12-06
  • 1970-01-01
  • 2022-06-28
  • 1970-01-01
  • 2021-01-05
  • 1970-01-01
  • 2019-11-06
  • 2013-01-18
  • 2016-06-20
相关资源
最近更新 更多