我正在尝试使用docker compose
将postgresdb服务与nodejs 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
访问网络服务,使用postico在localhost:1000
但在Node Web服务中,我编写了使用Sequelize作为
访问postgres的代码const sequelize = new Sequelize('sticki', 'renga', 'password', {
host: 'postgres',
dialect: 'postgres',
});
但是我收到以下错误
SequelizeConnectionRefusedError: connect ECONNREFUSED 172.18.0.2:1000
为什么postgres连接是针对172.18.0.2而不是localhost(0.0.0.0)?我做错了什么?
答案 0 :(得分:2)
对于您的web
容器postgres
,是在撰写为服务时定义的DNS名称。它通过docker internal DNS& amp;获取postgres
DNS IP地址。网络,这就是它解决172.18.0.2
的原因。如果你去web
容器& ping postgres
,您将获得相同的IP。
作为修复,配置您的节点服务以连接到端口postgres
上的主机5432
,因为它是容器端口。端口1000
是主机端口,如果要使用端口1000,请配置节点服务以连接到MACHINE_IP:1000
。
PS - 容器内的Localhost
表示容器本身&没别的。
答案 1 :(得分:0)
服务名称取自container_name-是固定的。在您的情况下,您没有该名称,并且名称是从docker-compose.yml为+ _ +服务名称+ _1的文件夹中创建的。 使用此DNS名称,您可以在docker-compose将创建的默认网络上从一个服务访问另一个服务。
谢谢