[英]docker nodejs container cant connect to mysql container from localhost
我在计算机上运行nodejs docker和mysql。 但是,即使我提供了正确的用户名和密码,我也无法通过本地主机访问数据库。 当我尝试访问docker nodejs服务器时,出现错误消息。
这是$ docker-compose logs -f记录我尝试通过localhost访问docker服务器时收到的消息:
db_1 | App listening on port 9000
backend_1 | Error occurred: { Error: connect ECONNREFUSED
172.18.0.3:3306
backend_1 | at Object.createConnection
(/opt/app/node_modules/mysql2/promise.js:31:31)
backend_1 | at _callee$ (/opt/app/src/index.js:29:30)
backend_1 | at tryCatch (/opt/app/node_modules/regenerator-
runtime/runtime.js:65:40)
backend_1 | at Generator.invoke [as _invoke]
(/opt/app/node_modules/regenerator-runtime/runtime.js:303:22)
backend_1 | at Generator.prototype.(anonymous function) [as
next] (/opt/app/node_modules/regenerator-runtime/runtime.js:117:21)
backend_1 | at step (/opt/app/src/index.js:21:191)
backend_1 | at /opt/app/src/index.js:21:437
backend_1 | at new Promise (<anonymous>)
backend_1 | at /opt/app/src/index.js:21:99
backend_1 | at /opt/app/src/index.js:26:1
backend_1 | message: 'connect ECONNREFUSED 172.18.0.3:3306',
backend_1 | code: 'ECONNREFUSED',
backend_1 | errno: 'ECONNREFUSED',
backend_1 | sqlState: undefined }
backend_1 |
backend_1 | Error: connect ECONNREFUSED 172.18.0.3:3306
backend_1 | at Object.createConnection
(/opt/app/node_modules/mysql2/promise.js:31:31)
backend_1 | at _callee$ (/opt/app/src/index.js:29:30)
backend_1 | at tryCatch
(/opt/app/node_modules/regenerator-runtime/runtime.js:65:40)
backend_1 | at Generator.invoke [as _invoke]
(/opt/app/node_modules/regenerator-runtime/runtime.js:303:22)
backend_1 | at Generator.prototype.(anonymous function)
[as next] (/opt/app/node_modules/regenerator-
runtime/runtime.js:117:21)
backend_1 | at step (/opt/app/src/index.js:21:191)
backend_1 | at /opt/app/src/index.js:21:437
backend_1 | at new Promise (<anonymous>)
backend_1 | at /opt/app/src/index.js:21:99
backend_1 | at /opt/app/src/index.js:26:1
这是我的docker-compose.yml文件:
version: '3' services: backend: build: context: ./ dockerfile: .dockerfiles/BackendDev ports: - "9000:9000" volumes: - ./backend:/opt/app restart: always backend_test: build: context: ./ dockerfile: .dockerfiles/BackendDev command: yarn run test:watch ports: - "9005:9005" volumes: - ./backend:/opt/app restart: always db: image: mysql:8.0.3 volumes: - /var/lib/mysql environment: MYSQL_ROOT_PASSWORD: db_rootpass MYSQL_DATABASE: db_1 restart: always mywebsql: image: quantumobject/docker-mywebsql ports: - "9001:80" restart: always
这是我的js文件:
import 'babel-polyfill'; import Koa from 'koa'; import Router from 'koa-router'; import mysql from 'mysql2/promise'; // The port that this server will run on, defaults to 9000 const port = process.env.PORT || 9000; // Instantiate a Koa server const app = new Koa(); // Instantiate routers const test = new Router(); // Define API path const apiPath = '/api/v1'; const connectionSettings = { host: 'db', user: 'root', database: 'db_1', password: 'db_rootpass', namedPlaceholders: true, }; test.get(`${apiPath}/test`, async (ctx) => { // Tell the HTTP response that it contains JSON data encoded in UTF-8 try { const conn = await mysql.createConnection(connectionSettings); const [data] = await conn.execute(` SELECT * FROM test_table `); console.log('Data fetched:', data); // Tell the HTTP response that it contains JSON data encoded in UTF-8 ctx.type = 'application/json; charset=utf-8'; // Add stuff to response body ctx.body = { greeting: 'Hello world!', data }; } catch (error) { console.error('Error occurred:', error); ctx.throw(500, error); } }); app.use(test.routes()); app.use(test.allowedMethods()); // Start the server and keep listening on port until stopped app.listen(port); console.log(`App listening on port ${port}`);
为了进行调试,您也可以直接连接到Docker容器,例如: docker exec -it CONTAINER_ID /bin/bash
然后尝试在那里本地连接到mysql数据库。 我首先要验证数据库是否能够接受连接。 此外,您确定在您的nodeJS应用尝试连接数据库时数据库已经在运行吗? 我没有对docker compose做任何事情,所以我不确定网络功能,但是当您使用network_mode: host
,我认为您也应该能够直接从本地计算机连接到mysql容器与mysql客户端。 您应该首先进行这些测试。
给我们一些反馈 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.