无法使用 pgadmin4 从 docker 连接到本地 postgres 数据库

Could not connect to local postgres DB from docker using pgadmin4

我尝试使用 pgadmin4 从 docker 连接到我的本地 postgres 数据库,但它因 unable to connect to server: timeout expired 而失败。我有我的服务器 运行,在连接到 pgadmin4 中的服务器时,我使用了 docker-compose.yml 文件中提到的相同属性。

这是我的docker-compose.yml

version: "3"

services:
web:
    build:
        context: .
    ports:
        - "8000:8000"
    volumes:
        - ./app:/app
    command: >
        sh -c "python manage.py migrate &&
               python manage.py runserver 0.0.0.0:8000"
    environment:
        - DB_HOST=db
        - DB_NAME=app
        - DB_USER=postgres
        - DB_PASS=secretpassword
    depends_on:
        - db

db:
    image: postgres:10-alpine
    environment:
        - POSTGRES_DB=app
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=secretpassword

这是我在pgadmin4中得到的错误的截图

我尝试通过检查 docker 容器将主机地址更改为本地主机、host.docker.internal、127.0.0.1 和 IP 地址。但我每次都得到相同的结果。我还尝试将 pgadmin4 作为服务添加到我的 docker-compose.yml 文件中并尝试过,但也得到了相同的结果。

我很困惑我在这里遗漏了什么。

提前致谢。

首先,您没有从 Postgres 容器导出任何端口,默认端口可能是 5432,然后您无法连接 8000,因为它是从您的主机绑定到您的应用程序。

这是来自 docker-compose ports

的一些描述

When mapping ports in the HOST:CONTAINER format, you may experience erroneous results when using a container port lower than 60, because YAML parses numbers in the format xx:yy as a base-60 value. For this reason, we recommend always explicitly specifying your port mappings as strings.

因此您可以尝试从您的 Pgadmin 可能需要使用 5432 端口的容器中从 Postgres DB 导出端口 "5432:5432"

version: "3"

services:
web:
    build:
        context: .
    ports:
        - "8000:8000"
    volumes:
        - ./app:/app
    command: >
        sh -c "python manage.py migrate &&
               python manage.py runserver 0.0.0.0:8000"
    environment:
        - DB_HOST=db
        - DB_NAME=app
        - DB_USER=postgres
        - DB_PASS=secretpassword
    depends_on:
        - db
db:
    image: postgres:10-alpine
    ports:
        - "5432:5432"
    environment:
        - POSTGRES_DB=app
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=secretpassword