Docker 環境における Node.js アプリケーションと PostgreSQL データベースの接続エラー "ECONNREFUSED" の原因と解決策
Docker コンテナ内で実行される Node.js アプリケーションが PostgreSQL データベースに接続しようとすると、"ECONNREFUSED" エラーが発生することがあります。このエラーは、Node.js アプリケーションが PostgreSQL データベースサーバーに接続できないことを示しています。
原因
"ECONNREFUSED" エラーが発生する主な原因は以下の通りです。
- ネットワーク接続の問題: Node.js アプリケーションと PostgreSQL データベースサーバー間で適切なネットワーク接続が確立されていない可能性があります。
- ポート番号の不一致: Node.js アプリケーションが設定している PostgreSQL データベースサーバーのポート番号が誤っている可能性があります。
- PostgreSQL データベースサーバーの起動状態: PostgreSQL データベースサーバーが起動していない可能性があります。
- ファイアウォールの制限: ファイアウォール設定が Node.js アプリケーションと PostgreSQL データベースサーバー間の通信を妨害している可能性があります。
解決策
以下の手順で "ECONNREFUSED" エラーを解決することができます。
ネットワーク接続を確認する:
docker ps
コマンドを使用して、PostgreSQL データベースコンテナが実行されていることを確認します。docker logs <postgresql-container-id>
コマンドを使用して、PostgreSQL データベースサーバーが正常に起動していることを確認します。docker network inspect <network-name>
コマンドを使用して、Node.js アプリケーションコンテナと PostgreSQL データベースコンテナが同じネットワークに属していることを確認します。
ポート番号を確認する:
- Node.js アプリケーションのコードを確認し、PostgreSQL データベースサーバーに接続するために使用しているポート番号が正しいことを確認します。
ファイアウォール設定を確認する:
- 必要に応じて、ファイアウォールルールを追加または変更して、通信を許可します。
- 上記の手順で解決しない場合は、使用している Node.js ライブラリや PostgreSQL ドライバーのバージョンの問題である可能性があります。最新バージョンにアップデートしてみてください。
- Docker Compose を使用している場合は、
docker-compose up -d
コマンドを実行して、すべてのコンテナを再起動してみてください。 - それでも問題が解決しない場合は、Docker コミュニティフォーラムや PostgreSQL サポートフォーラムで助けを求めることができます。
上記の情報は提供のみを目的としており、専門的なアドバイスを構成するものではありません。問題が発生した場合は、 квалифицированный специалист に相談してください。
Docker 環境における Node.js アプリケーションと PostgreSQL データベースの接続例
Dockerfile (Node.js アプリケーション)
FROM node:16-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "index.js"]
const { Client } = require('pg');
const client = new Client({
user: 'postgres',
host: 'postgresql',
database: 'mydb',
password: 'password',
port: 5432,
});
client.connect()
.then(() => {
console.log('Connected to PostgreSQL database');
client.query('SELECT * FROM users', (err, res) => {
if (err) {
console.error(err);
return;
}
console.log(res.rows);
client.end();
});
})
.catch(err => {
console.error('Error connecting to PostgreSQL database:', err);
});
docker-compose.yml
version: "3.9"
services:
postgresql:
image: postgres:14
environment:
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
ports:
- "5432:5432"
node-app:
build: .
depends_on:
- postgres
ports:
- "3000:3000"
使用方法
- 上記のコードを
node-app
ディレクトリに保存します。 docker-compose up -d
コマンドを実行して、PostgreSQL データベースコンテナと Node.js アプリケーションコンテナを起動します。- Web ブラウザで
http://localhost:3000
にアクセスすると、Node.js アプリケーションが起動し、PostgreSQL データベースからデータを取得して表示します。
注意事項
- 上記のコードはあくまでサンプルであり、実際のアプリケーションでは必要に応じて変更する必要があります。
- PostgreSQL データベースのユーザー名、パスワード、データベース名などは、ご自身の環境に合わせて変更してください。
- Docker Compose を使用していない場合は、個別に Docker コマンドを使用してコンテナを起動する必要があります。
Docker 環境における Node.js アプリケーションと PostgreSQL データベースの接続: その他の方法
個別の Docker コマンドを使用する
以下のコマンドを使用して、PostgreSQL データベースコンテナと Node.js アプリケーションコンテナを個別に起動することができます。
PostgreSQL データベースコンテナ:
docker run --name postgres -e POSTGRES_PASSWORD=password -e POSTGRES_DB=mydb -p 5432:5432 postgres:14
Node.js アプリケーションコンテナ:
docker run --name node-app -d --link postgres:postgresql node:16-alpine npm install && node index.js
docker network コマンドを使用する
docker network create my-network
docker run --name postgres --network my-network -e POSTGRES_PASSWORD=password -e POSTGRES_DB=mydb -p 5432:5432 postgres:14
docker run --name node-app --network my-network --link postgres:postgresql node:16-alpine npm install && node index.js
環境変数を使用する
以下の方法で、Node.js アプリケーション内で PostgreSQL データベースへの接続情報設定できます。
FROM node:16-alpine
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
ENV PGUSER=postgres
ENV PGPASSWORD=password
ENV PGHOST=postgresql
ENV PGDATABASE=mydb
ENV PGPORT=5432
CMD ["node", "index.js"]
const { Client } = require('pg');
const client = new Client();
client.connect()
.then(() => {
console.log('Connected to PostgreSQL database');
client.query('SELECT * FROM users', (err, res) => {
if (err) {
console.error(err);
return;
}
console.log(res.rows);
client.end();
});
})
.catch(err => {
console.error('Error connecting to PostgreSQL database:', err);
});
- セキュリティ上の理由から、環境変数にパスワードを格納することは避けることをお勧めします。必要に応じて、
docker secrets
コマンドなどのセキュリティ対策を講じてください。
node.js postgresql docker