반응형
nodejs 도킹된 앱이 mariadb 도킹된 데이터베이스에 연결할 수 없습니다.
설정은 다음과 같습니다.
- 도커파일을 탑재한 Mariadb 컨테이너는 도커 컴포지트를 통해 출시됩니다.
- 도커 컴포지트를 통해 도커 파일을 실행한 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 도커 파일:
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 Dockerfile:
FROM mariadb:latest
ENV MYSQL_ROOT_PASSWORD=mdp
ENV MYSQL_DATABASE=dashboard
ENV MYSQL_USER=monty
ENV MYSQL_PASSWORD=monty
USER 1000
EXPOSE 3306
docker-timeout.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
여기 제 인덱스가 있습니다.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 응용 프로그램에서 db 호스트 이름으로 지정합니다.단, 이것은 노드의 IP 주소입니다.JS 컨테이너모든 컨테이너에는 고유의 IP 주소가 있습니다(예외: 도커 네트워크 사용).host
이 때문에, 다음의 에러가 발생합니다.
Error: connect ECONNREFUSED 127.0.0.1:3306
사용시docker-compose
docker-module.yml 파일에서 지정한 서비스 이름을 사용하여 DB에 액세스할 수 있습니다.이 예에서는 서비스 이름database
를 호스트명으로 사용할 수 있습니다.이것을 시험해 보세요.
const connection = mariadb.createConnection({
host: 'database',
...
언급URL : https://stackoverflow.com/questions/61185122/nodejs-dockerized-app-cant-connect-to-mariadb-dockerized-database
반응형
'source' 카테고리의 다른 글
동적으로 Import된 모듈의 클래스 문자열 이름에서 동적 인스턴스화? (0) | 2023.01.12 |
---|---|
JavaScript 오류(Uncatched SyntaxError:예기치 않은 입력 종료) (0) | 2023.01.12 |
Google 자동 완성 결과를 시/군만으로 제한하는 방법 (0) | 2023.01.12 |
PHP에서 현재 페이지의 URL을 가져오는 방법 (0) | 2023.01.12 |
pip install -U에서 "-U" 옵션은 무엇을 의미합니까? (0) | 2023.01.12 |