【发布时间】: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