postgresql - 访问 postgres docker 容器时出现连接错误
问题描述
我最近设置了一个 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 游乐场,它可以正常运行。但我无法使用 dbeaver 创建与 postgre 容器的直接连接。
dbeaver 错误信息
Connection reset
为什么我与数据库的连接失败?
解决方案
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 的原因
端口部分仅用于使我们的服务在主机级别可访问。但是在容器级别,如果一个端口在容器中打开,任何其他运行的容器都可以在网络或链接部分的帮助下访问该端口。
默认情况下,docker-compose将为每个文件创建一个网络,docker-compose.yml
并将该文件中的所有服务加入该网络。
这就是我们可以使用<service name>
主机名的原因,并且 compose 会将该名称解析为相应(在您的情况下为postgres)容器的 IP 地址。
推荐阅读
- javascript - 单击按钮odoo时如何调用该函数
- angular - Angular5.x 用于长时间运行的服务器进程的进度报告
- ruby - 带有粉碎的Docker ruby容器 - 加载错误
- amazon-web-services - CloudFormation:简单示例
- java - Spring OAuth2 Auth Server:特定的 /oauth/token 过滤器?
- swift4 - 更改按钮上的文本不是永久性的
- android - FCM 数据消息不发送最新的数据有效载荷
- android - 如何从 url 获取 JSON 数据并在 Google Maps 上放置标记?
- java - 将图像数组保存到文件
- c# - 使用 SharpAvi 将图像转换为视频