首页 > 解决方案 > 访问 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

为什么我与数据库的连接失败?

这张照片会很有帮助。 在此处输入图像描述

标签: postgresqldockerprisma

解决方案


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 地址。


推荐阅读