node.js - nodejs dockerized 应用程序无法连接到 mariadb dockerized 数据库
问题描述
我的设置是:
- 通过 docker-compose 启动的带有 dockerfile 的 Mariadb 容器
- 通过 docker-compose 启动带有 dockerfile 的 NodeJs 容器
我的问题:
我无法将我的 nodejs 应用程序连接到数据库。我可以通过 dbeaver 或命令行在本地访问数据库,所以我知道它正在工作。但是当我尝试通过我的 index.js 访问它时,我收到以下错误:
Error: connect ECONNREFUSED 127.0.0.1:3306
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1141:16)
From event:
at _registerHandshakeCmd (/usr/src/app/node_modules/mariadb/lib/connection.js:689:11)
at /usr/src/app/node_modules/mariadb/lib/connection.js:57:11
at new Promise (<anonymous>)
at Connection.connect (/usr/src/app/node_modules/mariadb/lib/connection.js:56:16)
at Object.createConnection (/usr/src/app/node_modules/mariadb/promise.js:17:36)
at Object.<anonymous> (/usr/src/app/src/index.js:24:28)
at Module._compile (internal/modules/cjs/loader.js:1147:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1167:10)
at Module.load (internal/modules/cjs/loader.js:996:32)
at Function.Module._load (internal/modules/cjs/loader.js:896:14) {
errno: -111,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 3306,
fatal: true
}
NodeJs Dockerfile:
FROM node:latest
WORKDIR /usr/src/app
COPY package*.json /usr/usr/app
RUN npm install
COPY . /usr/src/app
EXPOSE 8080
CMD ["npm", "start"]
Mariadb Docker 文件:
FROM mariadb:latest
ENV MYSQL_ROOT_PASSWORD=mdp
ENV MYSQL_DATABASE=dashboard
ENV MYSQL_USER=monty
ENV MYSQL_PASSWORD=monty
USER 1000
EXPOSE 3306
码头工人-compose.yml:
version: '3'
services:
web:
build: ./backend
ports:
- "8080:8080"
volumes:
- ./backend:/usr/src/app/
working_dir: /usr/src/app
environment:
- MARIADB_HOST=database
- MARIADB_PORT_NUMBER=3306
- MARIADB_USER=monty
- MARIADB_PASSWORD=monty
- MARIADB_DATABASE=dashboard
user: "1000"
container_name: backend
depends_on:
- database
links:
- database:database
database:
build: ./database
ports:
- "3306:3306"
expose:
- "3306"
volumes:
- /database/data:/var/lib/mysql:rw
user: "1000"
hostname: "localhost"
environment:
- ALLOW_EMPTY_PASSWORD=yes
- MARIADB_DATABASE=dashboard
- MARIADB_PORT=3306
- MARIADB_USER=monty
- MARIADB_PASSWORD=monty
container_name: database
这是我的 index.js:
const express = require('express')
const mariadb = require('mariadb');
const cors = require('cors');
const bodyParser = require('body-parser');
const app = express();
app.use(
bodyParser.urlencoded({
extended: true
})
)
app.use(cors());
app.get('/', (req, res) => {
res.send('hello world');
});
const connection = mariadb.createConnection({
host: '127.0.0.1',
user: 'someuser',
password: 'somepassword',
database: 'dashboard',
port: '3306',
}).then(conn => {
console.log('connection established.');
}).catch(err => {
console.log(err);
});
app.listen(8080);
如果有人对在哪里查看或错误可能来自哪里有任何提示,我将不胜感激。谢谢!
解决方案
您127.0.0.1
在 NodeJS 应用程序中使用数据库主机名。但那是您的 NodeJS 容器的 IP 地址。每个容器都有自己的 IP 地址(例外:使用 docker network host
)。这会导致错误:
Error: connect ECONNREFUSED 127.0.0.1:3306
使用时docker-compose
,您可以使用您在 docker-compose.yml 文件中指定的服务名称访问数据库。在您的示例中,服务名称database
可以用作主机名。试试这个:
const connection = mariadb.createConnection({
host: 'database',
...
推荐阅读
- glsl - 具有透明背景的 Chromakey glsl 着色器
- python - 如何在没有内置函数的情况下计算列表中字符串的长度?
- r-package - partykit 中的 mob 函数能否使用正则化线性模型(例如岭回归)构建模型树?
- angular - Angular 9 Ivy entryComponents 转换
- python - “LinAlgError:给定的 0 维数组。数组必须至少是二维的”但我知道我正在传递一个 2D 参数
- jquery - 引导导航栏不起作用我的代码有问题吗?
- c++ - C++ - 关于友元赋值运算符重载
- java - 对于作为相应边界中列出的所有类型的子类型的所有类型的“范围”类型参数,这意味着什么?
- excel - 如何在 excel vba 中包含数据透视表过滤器标题
- asp.net-mvc - 如何在路由解析中包含查询字符串以允许具有相同方法、路由和查询字符串的多个操作?