访问 postgres docker 容器时出现连接错误
Posted
技术标签:
【中文标题】访问 postgres docker 容器时出现连接错误【英文标题】:Connection Error accessing postgres docker container 【发布时间】:2019-10-08 18:53:27 【问题描述】:我最近设置了一个 prisma 项目,这是我的 docker-compose.yml 文件
version: '3'
services:
prisma:
image: prismagraphql/prisma:1.31
restart: always
ports:
- '4030:4466'
environment:
TZ: $PRISMA_DB_TIME_ZONE
PRISMA_CONFIG: |
port: 4466
# managementApiSecret: my-secret
databases:
default:
connector: postgres
host: postgres
port: 5432
user: prisma
password: $PRISMA_DB_PASSWORD
migrations: true
rawAccess: true
postgres:
image: postgres:10.3
restart: always
ports:
- "3306:3306"
environment:
POSTGRES_USER: prisma
POSTGRES_PASSWORD: $PRISMA_DB_PASSWORD
TZ: $PRISMA_DB_TIME_ZONE
volumes:
- postgres:/var/lib/postgresql/data
volumes:
prisma:
postgres:
我可以打开我的 prisma playground,它可以正常运行。但我无法使用 dbeaver 创建与 postgre 容器的直接连接。
dbeaver 错误信息
Connection reset
为什么我与数据库的连接失败?
这张照片会很有帮助。
【问题讨论】:
【参考方案1】:postgres
默认侦听端口 5432。
在您的 postgres 容器规范中,您应该公开端口 5432 而不是 3306。
version: '3'
services:
prisma:
image: prismagraphql/prisma:1.31
restart: always
ports:
- '4030:4466'
environment:
TZ: $PRISMA_DB_TIME_ZONE
PRISMA_CONFIG: |
port: 4466
# managementApiSecret: my-secret
databases:
default:
connector: postgres
host: postgres
port: 5432
user: prisma
password: $PRISMA_DB_PASSWORD
migrations: true
rawAccess: true
postgres:
image: postgres:10.3
restart: always
ports:
- "5432:5432"
environment:
POSTGRES_USER: prisma
POSTGRES_PASSWORD: $PRISMA_DB_PASSWORD
TZ: $PRISMA_DB_TIME_ZONE
volumes:
- postgres:/var/lib/postgresql/data
volumes:
prisma:
postgres:
如果您的 主机 中的 5432 端口已在使用,如果您想改用 3306,那么你可以像下面这样进行端口转发:
postgres:
image: postgres:10.3
restart: always
ports:
- "3306:5432"
environment:
POSTGRES_USER: prisma
POSTGRES_PASSWORD: $PRISMA_DB_PASSWORD
TZ: $PRISMA_DB_TIME_ZONE
volumes:
- postgres:/var/lib/postgresql/data
更新 - 1
prisma 可以访问 postgres 的原因
ports 部分仅用于使我们的服务可在 host 级别访问。但是在容器级别,如果一个端口在容器中打开,任何其他正在运行的容器都可以在 networks or links 部分的帮助下访问该端口。
默认情况下,docker-compose 将为每个 docker-compose.yml
文件创建一个网络,并将该文件中的所有服务加入该网络。
这就是我们可以使用 <service name>
作为主机名的原因,并且 compose 会将该名称解析为相应(在您的情况下为 postgres)容器的 IP 地址。
【讨论】:
谢谢!数据库连接现在正在工作。但是 prisma 是如何使用我的 docker-compose.yml 设置连接到 postgre 容器的?我正在使用 3306:3306 我可以创建新节点,并且通过 prisma 操场成功保存到 postgres 的所有数据操作。 ports 部分仅用于使我们的服务在 host 级别可访问。但是在容器级别,如果一个端口在容器中打开,任何其他正在运行的容器都可以在 networks 或 links 部分的帮助下访问该端口。默认情况下,docker-compose 将为每个docker-compose.yml
文件创建一个网络,并将该文件中的所有服务加入该网络。这就是我们可以使用 <service name>
作为主机名的原因,并且 compose 会将该名称解析为相应(在您的情况下为 postgres)容器的 IP 地址。以上是关于访问 postgres docker 容器时出现连接错误的主要内容,如果未能解决你的问题,请参考以下文章
无法从 golang 连接到 docker postgres 容器
尝试从 docker 容器访问共享内存时出现“权限被拒绝”,即使 --ipc 设置为“主机”
无法使用 docker 连接到 ipv6 中的 postgres