![](/img/trans.png)
[英]Cannot connect to Postgres database with Sequelize using docker-compose
[英]Cannot Connect to Postgres db between docker compose services
我正在嘗試使用docker compose將postgresdb服務與Node.js Web服務連接
我的docker-compose.yml文件
version: "3"
services:
web:
build: ./
ports:
- "40000:3000"
depends_on:
- postgres
postgres:
image: kartoza/postgis:9.6-2.4
restart: always
volumes:
- postgresdata:/data/db
environment:
- POSTGRES_PASS=password
- POSTGRES_DBNAME=sticki
- POSTGRES_USER=renga
- ALLOW_IP_RANGE=0.0.0.0/0
ports:
- "1000:5432"
volumes:
postgresdata:
因此,當我在根目錄中執行docker-compose up
,兩個服務都在運行,並且我可以使用localhost:40000
訪問Web服務,並使用postico在localhost:1000
上訪問postgres服務
但是在Node Web服務中,我已經編寫了使用Sequelize作為訪問postgres的代碼
const sequelize = new Sequelize('sticki', 'renga', 'password', {
host: 'postgres',
dialect: 'postgres',
});
但我收到以下錯誤
SequelizeConnectionRefusedError: connect ECONNREFUSED 172.18.0.2:1000
為什么將postgres Connection建立為172.18.0.2而不是localhost(0.0.0.0)? 我做錯了什么?
對於您的web
容器, postgres
是在compose中定義為服務的DNS名稱。 它通過docker內部DNS和網絡獲取postgres
DNS IP地址,這就是為什么它解析為172.18.0.2
的原因。 如果您訪問web
容器並ping postgres
,則將獲得相同的IP。
作為修復,將節點服務配置為在端口5432
上連接到主機postgres
,因為它是容器端口。 端口1000
是主機端口,如果要使用端口1000,請配置節點服務以連接到MACHINE_IP:1000
。
PS-容器中的Localhost
表示容器本身,僅此而已。
服務名稱取自container_name-是固定的。 在您的情況下,您沒有該名稱,並且名稱是從docker-compose.yml為+ _ +服務名稱+ _1的文件夾中創建的。 使用此DNS名稱,您可以在docker-compose將創建的默認網絡上從一個服務訪問另一個服務。
謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.