Docker compose : MySQL with NodeJS "Error: connect ECONNREFUSED"
Docker compose : MySQL with NodeJS "Error: connect ECONNREFUSED"
尝试 运行 NodeJS 服务器和 MySQL 数据库 docker-compose 但无论我做什么我都无法将两者连接在一起。
这是我在控制台中得到的:
api | Listening
api | Connecting with {"host":"mysql","database":"bogo_plan","user":"root","port":3006}
api | /app/index.js:24
api | if (err) throw err;
api | ^
api |
api | Error: connect ECONNREFUSED 172.27.0.2:3006
api | at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1146:16)
api | --------------------
api | at Protocol._enqueue (/app/node_modules/mysql/lib/protocol/Protocol.js:144:48)
api | at Protocol.handshake (/app/node_modules/mysql/lib/protocol/Protocol.js:51:23)
api | at Connection.connect (/app/node_modules/mysql/lib/Connection.js:116:18)
api | at Object.<anonymous> (/app/index.js:23:5)
api | at Module._compile (internal/modules/cjs/loader.js:1063:30)
api | at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
api | at Module.load (internal/modules/cjs/loader.js:928:32)
api | at Function.Module._load (internal/modules/cjs/loader.js:769:14)
api | at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
api | at internal/main/run_main_module.js:17:47 {
api | errno: -111,
api | code: 'ECONNREFUSED',
api | syscall: 'connect',
api | address: '172.27.0.2',
api | port: 3006,
api | fatal: true
api | }
这是我的 docker-compose.yml :
version: '3'
services:
mysql:
container_name: 'mysql'
image: 'mysql:8.0'
ports:
- '3006:3006'
volumes:
- ./mysql/my-db:/var/lib/mysql
environment:
- MYSQL_DATABASE=bogo_plan
- MYSQL_ALLOW_EMPTY_PASSWORD=yes
- MYSQL_ROOT_PASSWORD=
api:
container_name: 'api'
build:
dockerfile: Dockerfile.dev
context: ./api
links:
- mysql:mysql
restart:
always
volumes:
- /api/node_modules
- ./api:/api
environment:
- MYSQL_HOST=mysql
- MYSQL_USER=root
- MYSQL_ROOT_PASSWORD=
- MYSQL_ALLOW_EMPTY_PASSWORD=yes
- MYSQL_DATABASE=bogo_plan
我可以使用 mysql cli 连接到 mysql 容器并在其中做任何我想做的事。我知道我连接到正确的那个,因为当我第一次登录数据库时数据库已经创建。
我尝试了很多东西:
- 更改 API 中的主机名以硬编码我用来连接 CLI 的主机名(尽管它是相同的)
- 更改容器的名称
- 在尝试使用 setTimeout()
连接 API 之前设置延迟
- 设置密码
- 我在某处看到 MySQL 版本可能无法与 TCP 一起使用
协议,所以我尝试使用
mysql -h 172.27.0.2 --protocol=TCP -u root -p
连接到容器的数据库,我可以毫无问题地连接。
到这里我就没思路了
编辑: 删除了问题中一些不相关的部分,这样更容易阅读。
MySQL 使用端口号 3306,而不是 3006,就像您在 docker-compose
文件中那样,因为 在 OP 的评论中提到。
你应该mysql
docker-compose
端口映射中的实例服务:
ports:
- "3006:3306"
尝试 运行 NodeJS 服务器和 MySQL 数据库 docker-compose 但无论我做什么我都无法将两者连接在一起。
这是我在控制台中得到的:
api | Listening
api | Connecting with {"host":"mysql","database":"bogo_plan","user":"root","port":3006}
api | /app/index.js:24
api | if (err) throw err;
api | ^
api |
api | Error: connect ECONNREFUSED 172.27.0.2:3006
api | at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1146:16)
api | --------------------
api | at Protocol._enqueue (/app/node_modules/mysql/lib/protocol/Protocol.js:144:48)
api | at Protocol.handshake (/app/node_modules/mysql/lib/protocol/Protocol.js:51:23)
api | at Connection.connect (/app/node_modules/mysql/lib/Connection.js:116:18)
api | at Object.<anonymous> (/app/index.js:23:5)
api | at Module._compile (internal/modules/cjs/loader.js:1063:30)
api | at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
api | at Module.load (internal/modules/cjs/loader.js:928:32)
api | at Function.Module._load (internal/modules/cjs/loader.js:769:14)
api | at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
api | at internal/main/run_main_module.js:17:47 {
api | errno: -111,
api | code: 'ECONNREFUSED',
api | syscall: 'connect',
api | address: '172.27.0.2',
api | port: 3006,
api | fatal: true
api | }
这是我的 docker-compose.yml :
version: '3'
services:
mysql:
container_name: 'mysql'
image: 'mysql:8.0'
ports:
- '3006:3006'
volumes:
- ./mysql/my-db:/var/lib/mysql
environment:
- MYSQL_DATABASE=bogo_plan
- MYSQL_ALLOW_EMPTY_PASSWORD=yes
- MYSQL_ROOT_PASSWORD=
api:
container_name: 'api'
build:
dockerfile: Dockerfile.dev
context: ./api
links:
- mysql:mysql
restart:
always
volumes:
- /api/node_modules
- ./api:/api
environment:
- MYSQL_HOST=mysql
- MYSQL_USER=root
- MYSQL_ROOT_PASSWORD=
- MYSQL_ALLOW_EMPTY_PASSWORD=yes
- MYSQL_DATABASE=bogo_plan
我可以使用 mysql cli 连接到 mysql 容器并在其中做任何我想做的事。我知道我连接到正确的那个,因为当我第一次登录数据库时数据库已经创建。
我尝试了很多东西:
- 更改 API 中的主机名以硬编码我用来连接 CLI 的主机名(尽管它是相同的)
- 更改容器的名称
- 在尝试使用 setTimeout() 连接 API 之前设置延迟
- 设置密码
- 我在某处看到 MySQL 版本可能无法与 TCP 一起使用
协议,所以我尝试使用
mysql -h 172.27.0.2 --protocol=TCP -u root -p
连接到容器的数据库,我可以毫无问题地连接。
到这里我就没思路了
编辑: 删除了问题中一些不相关的部分,这样更容易阅读。
MySQL 使用端口号 3306,而不是 3006,就像您在 docker-compose
文件中那样,因为
你应该mysql
docker-compose
端口映射中的实例服务:
ports:
- "3006:3306"