docker 中的 Postgres 拒绝来自我的服务器的连接

Postgres inside docker compose refusing connection from my server

我在 docker compose 中有一个 Golang 服务器和 Postgres 实例 运行。出于某种原因,Postgres 拒绝连接。从我之前的所有搜索来看,问题通常是错字,没有暴露端口,有 SSL 等等,但我没有发生类似的事情并且仍然有这个问题

version: "3.2"
services:
  ingress:
    image: jwilder/nginx-proxy
    ports:
      - "3000:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
  auth-service:
    depends_on:
      - rabbitmq
      - auth-db
      - ingress
    build: ./auth
    container_name: "auth-service"
    ports:
      - 3001:3000
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_HOST=auth-db
      - POSTGRES_DB=auth-dev
      - POSTGRES_PORT=5435
      - PORT=3000
      - RABBITMQ_USER=guest
      - RABBITMQ_PASSWORD=guest
      - RABBITMQ_HOST=rabbitmq
      - RABBITMQ_PORT=5672
      - VIRTUAL_HOST=api.twitchy.dev
      - VIRTUAL_PATH=/v1/auth/
    deploy:
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3
        window: 120s
    # networks:
    #   - rabbitmq_net
    #   - default
  rabbitmq:
    image: rabbitmq:3-management-alpine
    container_name: "rabbitmq"
    ports:
      - 5672:5672
      - 15672:15672
    volumes:
      - rabbitmq_data:/var/lib/rabbitmq/
      - rabbitmq_log:/var/log/rabbitmq/
    # networks:
    #   - rabbitmq_net
  auth-db:
    image: postgres:14.1-alpine
    restart: always
    container_name: "auth-db"
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=auth-dev
    ports:
      - "5435:5432"
    volumes:
      - db:/var/lib/postgresql/data
  chat-db:
    image: postgres:14.1-alpine
    restart: always
    container_name: "chat-db"
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=chat-dev
    ports:
      - "5434:5432"
    volumes:
      - db:/var/lib/postgresql/data

# networks:
#   rabbitmq_net:
#     driver: bridge

volumes:
  db:
    driver: local
  rabbitmq_data:
  rabbitmq_log:

这是我遇到的错误

auth-service    | Retrying connection to database...
auth-service    | failed to connect to `host=auth-db user=postgres database=auth-dev`: dial error (dial tcp 172.23.0.3:5435: connect: connection refused)

我的 Golang 代码用于连接到数据库(使用 pgx)

    dbUrl := fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=disable",
        os.Getenv("POSTGRES_USER"),
        os.Getenv("POSTGRES_PASSWORD"),
        os.Getenv("POSTGRES_HOST"),
        os.Getenv("POSTGRES_PORT"),
        os.Getenv("POSTGRES_DB"))

这就是我困惑的原因

  1. 端口匹配,我从 postgres 公开 5435,然后连接到 5435
  2. 主机应该是正确的,因为我引用的是 auth-db 服务名称,它们在同一个默认网络上,所以应该没问题
  3. 密码和用户名匹配
  4. POSTGRES_DB也匹配,默认数据库应该是auth-dev
POSTGRES_DB
This optional environment variable can be used to define a different name for the default database that is created when the image is first started. If it is not specified, then the value of POSTGRES_USER will be used.
  1. 我也禁用了 sslmode

还有什么其他原因会导致连接被拒绝吗?

尝试将 db 更改为 template1 和 postgres,因为它们是默认创建的,但两者都不起作用

54511e50369c   postgres:14.1-alpine           "docker-entrypoint.s…"   16 minutes ago   Up 16 seconds   0.0.0.0:5435->5432/tcp, :::5435->5432/tcp                                                                                                             auth-db


docker exec -it 54511e50369c psql -U postgres
psql (14.1)
Type "help" for help.

postgres=# \l
                                 List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges   
-----------+----------+----------+------------+------------+-----------------------
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 | 
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres          +
           |          |          |            |            | postgres=CTc/postgres
(3 rows)

当我尝试连接时数据库已经准备就绪(我重试了20次,如果它崩溃了并重新启动服务,所以它应该可用)

当您在 docker-compose 中映射端口时,比如 "5435:5432",您正在将主机上的端口 5435 映射到容器上的 5432。但是,auth-service 定义中的 db url 使用的是服务名称 auth-db,因此您实际上是直接访问 db 容器,而不是通过主机。因为数据库容器不公开 5435,您无法使用端口 5435 进行连接。 例如,如果您尝试从主机连接到数据库,则使用端口 5435localhost.

可能会成功