Postgresqlを使用してNodeJSで実行するアプリを構築しています。 SequelizeJSをORMとして使用しています。本物のpostgresデーモンを使用したり、自分のデバイスにnodejsを使用したりするのを避けるために、docker-composeでコンテナーを使用しています。
docker-compose up
を実行すると、pgデータベースが起動します
database system is ready to accept connections
およびnodejsサーバー。ただし、サーバーはデータベースに接続できません。
Error: connect ECONNREFUSED 127.0.01:5432
コンテナーを使用せずにサーバーを実行しようとすると(実際のマシンで実際のnodejsとpostgresdを使用)、動作します。
しかし、私はそれがコンテナで正しく動作することを望みます。私が間違っていることを理解していません。
ここにdocker-compose.yml
ファイルがあります
web:
image: node
command: npm start
ports:
- "8000:4242"
links:
- db
working_dir: /src
environment:
SEQ_DB: mydatabase
SEQ_USER: username
SEQ_PW: pgpassword
PORT: 4242
DATABASE_URL: postgres://username:[email protected]:5432/mydatabase
volumes:
- ./:/src
db:
image: postgres
ports:
- "5432:5432"
environment:
POSTGRES_USER: username
POSTGRES_PASSWORD: pgpassword
誰かが私を助けてくれますか?
(dockerが好きな人:))
DATABASE_URL
は127.0.0.1
を参照します。これは ループバックアダプター (詳細 ここ )です。これは「自分に接続する」ことを意味します。
両方のアプリケーションを(Dockerを使用せずに)同じホストで実行する場合、両方とも同じアダプター(localhost
とも呼ばれます)でアドレス指定できます。
コンテナで両方のアプリケーションを実行する場合、以前のように両方ともローカルホストにありません。代わりに、web
コンテナをdocker0
アダプタのdb
コンテナのIPアドレスにポイントする必要があります。これはdocker-compose
が設定します。
変化する:
DATABASE_URL: postgres://username:[email protected]:5432/mydatabase
に
DATABASE_URL: postgres://username:pgpassword@db:5432/mydatabase
これはDockerリンクのおかげで機能します。web
コンテナーには、db
コンテナーがオンになっているIPを指すdb
エントリーを持つファイル(/etc/hosts
)があります。これは、ホスト名を解決しようとするときにシステム(この場合はコンテナ)が最初に見る場所です。
さらに読者がいる場合は、Docker desktop for Mac
を使用している場合は、 doc で提案されているように、localhost
またはHost.docker.internal
の代わりに127.0.0.1
を使用してください。同じconnection refused...
問題に遭遇しました。バックエンドapi-service
はlocalhost/127.0.0.1
を使用してpostgres
に接続できませんでした。以下は、参照としてのdocker-compose.ymlと環境変数です。
version: "2"
services:
api:
container_name: "be"
image: <image_name>:latest
ports:
- "8000:8000"
environment:
DB_Host: Host.docker.internal
DB_USER: <your_user>
DB_PASS: <your_pass>
networks:
- mynw
db:
container_name: "psql"
image: postgres
ports:
- "5432:5432"
environment:
POSTGRES_DB: <your_postgres_db_name>
POSTGRES_USER: <your_postgres_user>
POSTGRES_PASS: <your_postgres_pass>
volumes:
- ~/dbdata:/var/lib/postgresql/data
networks:
- mynw
データベース変数を個別に送信する場合。データベースホストを割り当てることができます。
DB_Host=<POSTGRES_SERVICE_NAME> #in your case "db" from docker-compose file.