首页 > 解决方案 > 启动用户态代理时出错:绑定 127.0.0.1:3306 失败:端口已分配。在 docker 运行命令上

问题描述

我有一个连接到 MySQL 数据库的 Node 应用程序的 Docker 容器。数据库托管在容器外的本地主机中。

首先,我尝试通过 command 运行它docker run -p 3010:80 nigel/insideroil。该过程正常启动,编译所有内容,但是当应用程序尝试连接到数据库时出现以下错误:

Unhandled rejection SequelizeBaseError: connect ECONNREFUSED 127.0.0.1:3306
    at Handshake.<anonymous> (/usr/src/insider_oil/server/node_modules/sequelize/lib/dialects/mysql/connection-manager.js:80:20)
    at Handshake.<anonymous> (/usr/src/insider_oil/server/node_modules/mysql/lib/Connection.js:502:10)
    at Handshake._callback (/usr/src/insider_oil/server/node_modules/mysql/lib/Connection.js:468:16)
    at Handshake.Sequence.end (/usr/src/insider_oil/server/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)
    at Protocol.handleNetworkError (/usr/src/insider_oil/server/node_modules/mysql/lib/protocol/Protocol.js:361:14)
    at Connection._handleNetworkError (/usr/src/insider_oil/server/node_modules/mysql/lib/Connection.js:420:18)
    at emitOne (events.js:96:13)
    at Socket.emit (events.js:189:7)
    at emitErrorNT (net.js:1280:8)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickDomainCallback (internal/process/next_tick.js:122:9)

在我的研究中,我发现该错误可能与外部端口的访问有关,如此链接https://docs.docker.com/config/containers/container-networking/#published-ports中所述。

因此,我尝试运行传递另一个参数的命令,如下所示docker run -p 3010:80 -p 127.0.0.1:3306:3306 nigel/insideroil:但是,现在,错误是:

docker: Error response from daemon: driver failed programming external connectivity on endpoint cocky_wilson (c702c7f659ee766ba11993ed6b2c3ce851f6a6cced3d2c04a31bb578a11b2b40): Error starting userland proxy: Bind for 127.0.0.1:3306 failed: port is already allocated.
ERRO[0000] error waiting for container: context canceled

我很感激任何帮助。提前致谢

标签: node.jsdocker

解决方案


如果您想从容器访问主机上的端口,您应该使用主机 IP 地址(而不是 127.0.0.1)。当然,DB 也应该监听主机 IP 地址(不是 127.0.0.1)。

或者也在容器内运行数据库并通过名称使用直接连接。


推荐阅读