docker postgres pgadmin 本地连​​接

Posted

技术标签:

【中文标题】docker postgres pgadmin 本地连​​接【英文标题】:docker postgres pgadmin local connection 【发布时间】:2014-10-21 20:07:14 【问题描述】:

我用 nginxphp 和 postgres 创建了一个 ubuntu 映像。

我想将我当前映像中的 postgres 数据库与位于我本地计算机上的 pgadmin 连接起来。

我曾尝试使用 docker inspector 尝试使用图像 ip 与我的本地 pgadmin 建立连接,但没有多大成功。我还尝试在本地配置一些端口以使连接正常工作。

【问题讨论】:

您没有说 PostgreSQL 是否正在侦听外部连接(检查您的配置文件),或者该端口是否在本地计算机上显示为打开。 提供的信息太少似乎无法回答这个问题 【参考方案1】:

这是一个有效的问题,不知道为什么人们会觉得“似乎无法回答这个问题”。

所以,这就是我如何做你想做的事情:

    从 Docker Hub 拉取 postgres 镜像

    docker pull postgres:latest
    

    使用以下命令运行容器

    docker run -p 5432:5432 postgres
    

    使用docker的inspect命令查找IP

    使用该 IP、端口、用户名和密码在 PGADMIN 中进行连接

    你也可以像下面这样简单的 telnet 来确认你是否可以访问 docker postgres 容器:

    telnet IP_ADDRESS 5432
    

【讨论】:

如果你用这个-p 5432:5432发布端口,那么你不需要找到容器的IP,你可以使用你的主机IP,或者127.0.0.1或者只是localhost 帖子的意图是有效的,但它不是 SE 的高质量帖子。首先,没有提出实际的“问题”。此外,没有迹象表明他们如何尝试该过程或他们在执行过程中收到的错误。话虽如此,我认为你的回应做得很好。 这个答案对我有用,因此它是一个有效的问题。 我已经使用 -p 5432:5432 将容器映射到我的主机,但仍然出现连接错误。我尝试使用从 docker inspect 获得的 IPAddress,它可以工作。 谢谢,第 3 步“使用 docker 的检查命令查找 IP”解除了我遇到的问题。【参考方案2】:

我在运行 docker for windows 1.12.6(9655) 的 windows 10 上取得了成功,步骤如下:

    拉取最新的postgres

    docker pull postgres:latest

    运行 postgres 容器:

    docker run -d -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password123 --name db-my -p 5432:5432 --restart=always postgres

    然后从 pgadmin website

    运行 pgAdmin 4 创建新服务器,输入如下 主机:127.0.0.1 端口:5432 用户名:用户 密码:password123

    然后一切正常,连接docker postgres实例成功。

【讨论】:

【参考方案3】:

这就是我所做的

对于 postgres

docker run -p 5432:5432  --name container-postgresdb -e POSTGRES_PASSWORD=admin -d postgres

对于 pgadmin

docker run -p 5050:80  -e "PGADMIN_DEFAULT_EMAIL=name@example.com" -e "PGADMIN_DEFAULT_PASSWORD=admin"  -d dpage/pgadmin4

pgadmin 的连接字符串

host: host.docker.internal
database: postgres
user: postgres
password: admin

很好用!!!!!!

【讨论】:

Unable to connect to server: could not translate host name "host.docker.internal" to address: Try again 我也使用这种方法在 docker 中创建了 postgres 和 pgAdmin。作为输入值对我有用的是@SolidSnake 的答案 - ***.com/a/58224344/4288961 > docker inspect CONTAINER_ID | grep IP 地址。并将此结果 IP 地址用作主机 太棒了!。非常有帮助。我只需要'host.docker.internal'值 'host.docker.internal' 正是我所缺少的,谢谢!!【参考方案4】:

或者,您可以将 Postgres 和 Pgadmin 合并到一个 docker-compose 文件中,并以用户 pgadmin4@pgadmin.org 登录,密码:admin。要添加 Posgres 服务器,请使用主机名postgres,端口5432

version: '3'
services:
  postgres:
    image: postgres
    hostname: postgres
    ports:
      - "6543:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
      POSTGRES_DB: TEST_SM
    volumes:
      - postgres-data:/var/lib/postgresql/data
    restart: unless-stopped

  pgadmin:
    image: dpage/pgadmin4
    depends_on:
      - postgres
    ports:
      - "5555:80"
    environment:
      PGADMIN_DEFAULT_EMAIL: pgadmin4@pgadmin.org
      PGADMIN_DEFAULT_PASSWORD: admin
    restart: unless-stopped

volumes:
  postgres-data:

【讨论】:

我得到“无法将主机名“postgres”转换为地址:提供节点名或服务名,或未知”。 无法将主机名“postgres”转换为地址:名称无法解析 如果您docker network ls,您将看到 postgres-to-pgadmin 网络的桥梁(我的是 postgres_postgres)。然后,您可以docker network inspect postgres_postgres 看到两个容器,每个容器都有一个 ip/主机名。从 Postgres 取一个(我的是 postgres_db_1)从 pgAdmin 成功连接。【参考方案5】:

如果您确认 PostgreSQL 正在运行并且您可以使用 PgAdmin 的本地副本连接那里...

答案很简单:使用host.docker.internal 而不是localhost 用于在 Docker 中运行的 PgAdmin

【讨论】:

哇,这太棒了,谢谢@*** 让这个成为答案 这是最好的解决方案。进行 docker network inspect 并使用该 IP 并不是最可靠的解决方案。 太棒了,这正是我一直在寻找的 :) @KARPOLAN 优秀的解决方案!谢谢 好的,但是为什么主机从localhost变成了这个?【参考方案6】:

就我而言,我可以通过命令解决检查我的 postgre 图像的问题

docker inspect CONTAINER_ID  | grep IPAddress.

所以,我使用 docker ip 地址来配置我的 pgadmin 4 连接,一切都很好。感谢@Afshin Ghazi

【讨论】:

【参考方案7】:

如果 pgAdmin 打算在相同的 Ubuntu 主机/来宾中运行,那么您需要链接 postgres 容器,以便可以通过名称解析。

1.运行 postgres 容器:

docker run --name some-postgres -e POSTGRES_PASSWORD=postgres -d postgres

2。运行 pgAdmin 容器:

docker run -p 80:80 --link some-postgres -e "PGADMIN_DEFAULT_EMAIL=email@domain.com" -e "PGADMIN_DEFAULT_PASSWORD=postgres" -d dpage/pgadmin4

3.现在在 phAdmin Web 应用中添加新服务器时,使用 some-postgres 作为服务器名称

当我们启动 pgAdmin 时,请注意 --link some-postgres。此命令使 postgres 容器对 pgAdmin 容器可见。

【讨论】:

我可以用 psq 连接到服务器,然后登录到 pgadmin 界面。但是从 pgadmin 界面连接到 postgres 服务器时,我使用什么网络/端口? 值得注意的是 Docker 文档 (docs.docker.com/network/links) Warning: The --link flag is a legacy feature of Docker. It may eventually be removed. Unless you absolutely need to continue using it, we recommend that you use user-defined networks to facilitate communication between two containers instead of using --link. 我也没有任何运气使用 --link 让我的 pgadmin 容器与我的 postgres 容器对话。但是,我可以从本地安装的 pgadmin 访问 postgres。【参考方案8】:

我将它包含在 docker yaml 文件中以获取数据库和 pgAdmin:

database:
    image: postgres:10.4-alpine
    container_name: kafka-nodejs-example-database
    environment:
      POSTGRES_USER: $POSTGRES_USER
      POSTGRES_PASSWORD: $POSTGRES_PASSWORD
    expose:
      - "5432"
    ports:
      - 8000:5432
    volumes:
      - ./services/database/schema.sql:/docker-entrypoint-initdb.d/1-schema.sql
      - ./services/database/seed.sql:/docker-entrypoint-initdb.d/2-seed.sql
  pgadmin:
    image: dpage/pgadmin4
    ports:
      - 5454:5454/tcp
    environment:
      - PGADMIN_DEFAULT_EMAIL=admin@mydomain.com
      - PGADMIN_DEFAULT_PASSWORD=postgres
      - PGADMIN_LISTEN_PORT=5454

postgres 的用户名是 alphaone,密码是 xxxxxxxxxxx。

执行docker ps 以获取容器ID,然后执行docker inspect <dockerContainerId> | grep IPAddress

例如:docker inspect 2f50fabe8a87 | grep IPAddress

将 IP 地址插入 pgAdmin 和 docker 中使用的数据库凭据:

【讨论】:

这有帮助。我必须从与 docker Postgres 关联的容器中 grep 正确的 IP 地址,以添加到 docker PgAdmin 门户中的服务器配置,如上所示。输入localhost 无效。【参考方案9】:

这在 Ubuntu 18 上对我有用:

1- 运行一个 postgres 容器

docker run -d -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password123 --name my-postgres -p 5432:5432 postgres

2- 运行一个 pgAdmin 容器

docker run --rm -p 5050:5050 thajeztah/pgadmin4

3- 获取您的本地 IP(在 Ubuntu 中通过 ifconfig 命令)

4- 在浏览器中打开localhost:5050

5- 点击服务器>>创建>>服务器...

6- 在“常规”选项卡中,为其命名,例如:docker。在“连接”选项卡中,输入以下字段:

主机名:来自 3 的 IP

用户名:用户

密码:password123

7- 点击保存,现在一切正常。

注意:如果这不起作用,请尝试使用“localhost”作为主机名。

【讨论】:

STEP 3 只在这里找到,它终于为我工作了!我在 docker 中有 pgadmin 只是因为在 arm64 上没有本机包。因此,指定 ifconfig 找到的 192.168.0.61 并在 pg config 启用外部连接允许我连接到 docker 外部已经运行的数据库。【参考方案10】:

在面对这个问题两天后,我能够解决这个问题。

这个问题的解决方案已经得到了像 do inspect 这样的人的回答

docker inspect CONTAINER_ID

但在运行此命令时,我得到了很多日志,例如 Host Config Config Network Settings 等,所以我对哪个 IPAddress 感到困惑添加 pgAdmin 连接,因为我尝试了 0.0.0.0 并且在日志中配置、主机、networkSettings 不同 -2 IPAddress 但在尝试了很多之后终于可以工作了。

它适用于哪个 IP,我们必须添加该网络 IP 地址(我们创建该地址以连接 postgrespgAdmin。)

就像我跑步时一样:-

docker 检查 postgres_container

 "NetworkSettings": 
        "Bridge": "",
        "SandboxID": "sdffsffsfsfsfsf123232e2r3pru3ouoyoyuosyvo8769696796",
        "HairpinMode": false,
        "LinkLocalIPv6Address": "",
        "LinkLocalIPv6PrefixLen": 0,
        "Ports": 
            "5432/tcp": [
                
                    "HostIp": "0.0.0.0",
                    "HostPort": "5432"
                
            ]
        ,
        "SandboxKey": "/var/run/docker/231231Ad132",
        "SecondaryIPAddresses": null,
        "SecondaryIPv6Addresses": null,
        "EndpointID": "",
        "Gateway": "",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "IPAddress": "",
        "IPPrefixLen": 0,
        "IPv6Gateway": "",
        "MacAddress": "",
        "Networks": 
            "postgres": 
                "IPAMConfig": null,
                "Links": null,
                "Aliases": [
                    "postgres",
                    "0e2j3bn2m42"
                ],
                "NetworkID": "35rhlhl3l53l5hlh3523233k3k4k22l3hk2k4",
                "EndpointID":"b3424n43k52o2i4n235k1k4l2l4hj234f14n2",
                "Gateway": "192.168.16.1",
                "IPAddress": "192.168.16.2",
                "IPPrefixLen": 20,
                "IPv6Gateway": "",

所以我们必须添加 NetworkSettings -> Network -> Postgres(我创建的网络)-> IPAddress 即“IPAddress”:“192.168.16.2”。

添加这个ip后就可以工作了。

我希望它会有所帮助。

【讨论】:

【参考方案11】:

为了或找到你的容器IP,使用以下命令

docker inspect -f 'range .NetworkSettings.Networks.IPAddressend' container_name_or_id

参考:How to get a Docker container's IP address from the host

【讨论】:

【参考方案12】:

就我而言,我有一个 PostgreSQL 容器,所以我没有更改容器或创建 docker-compose 方法,几个月后我需要 pgadming 来安装 PostgreSQL,所以这是我的方法:

    docker inspect my_container_id_postgreSQL

    分配给 PostgreSQL 的网络是:

    “网络”: “docker_default”: "IP地址": "172.18.0.2", ...

    使用--network 命令运行我的PGADMIN。

    docker run -p 85:80 --network docker_default -e 'PGADMIN_DEFAULT_EMAIL=user@domain.com' -e 'PGADMIN_DEFAULT_PASSWORD=SuperSecret' -d dpage/pgadmin4

    将 IP 地址插入 pgAdmin 和 docker 中使用的数据库凭据。

我希望这对某人有用。 问候。

【讨论】:

【参考方案13】:

您必须将容器中的 postgres 端口公开给您的本地系统。你可以通过像这样运行你的容器来做到这一点:

docker run -p 5432:5432 <name/id of container>

当与您的 GUI 客户端或 CLI 连接时,请确保使用 ip-address 而不是 localhost,即使您的 ip-address 是 localhost ip-address。

docker ps 会给你你的 postgres 容器所在的 IP 地址。

【讨论】:

【参考方案14】:

您也可以创建一个 Docker 桥接网络来执行此操作。

$ docker network create pgnet
a0ae44aaf6f806fc37302e4c603b4828c4edb8d487fd9cd90e2fb19ae1d5c65f

$ docker run --detach \
    --name pg \
    --network pgnet \
    --publish 5432:5432 \
    --restart always \
    --env POSTGRES_PASSWORD=pg123 \
    --volume $PWD/data:/var/lib/postgresql/data \
    postgres:12.1
b60611e43727dabe483c1f08fdf74961b886ce05b432a10a0625bd1b6db87899

$ docker run --detach \
    --name pgadm \
    --network pgnet \
    --publish 8000:80 \
    --volume $PWD/pgadmin:/var/lib/pgadmin \
    --env PGADMIN_DEFAULT_EMAIL=user@domain.com \
    --env PGADMIN_DEFAULT_PASSWORD=pgadm123 \
    dpage/pgadmin4:4.20
27f9ce1c1c4c383ee1507f4e2d88f6ef33d4fcf5b209a8a03b87519f90d56312

打开http://localhost:8000/

    点击添加新服务器 创建 - 服务器
      名称:数据库 主机名/地址:pg 用户名:postgres 密码:pg123
    保存

上面使用的Hostname/address是--name pg给出的Postgres容器的名称

【讨论】:

这是一种独特的方法,使用容器名称作为主机名。与设置 Nginx 或其他方法相同的方法。有道理。【参考方案15】:

对于 macOS IP,postgrespgadmin4docker inspect 提供的 IP 不同。 类型

docker-machine ls

看看左边的服务器名称。默认是default

docker-machine ip default 将您需要在浏览器中用于bothpgadmin4pgadmin4 设置中的postgres 的IP。

【讨论】:

【参考方案16】:

要为您的容器找到正确的 ip,请执行以下命令:

检查容器 ID:

docker ps

检查容器的正确 IP:

docker inspect <ID_CONTAINER> | grep "IPAddress"

使用 Docker 配置 PostgreSQL 和 PgAdmin 都很简单,如果不正确,我建议从头开始重新配置,如果您的问题更深。

这是我为解决此问题而开发的脚本。 script-sh/install-docker-postgres-and-pgadmin

【讨论】:

【参考方案17】:

如果本地主机端口 5432 已被其他 psql 服务器使用,请在创建容器时和在 Pgadmin 中更改它。

【讨论】:

【参考方案18】:

我尝试并为我工作的解决方案是创建一个 docker compose 文件,其中我将 postgress 和 pgadmin 作为服务包含在内。更多详情:Connecting pgadmin to postgres in docker

【讨论】:

【参考方案19】:

您是否使用 Window Subsystem LinuxWSL2 来运行 Docker 和 PgAdmin? 我建议的步骤与人们建议的步骤相似。就我而言,我使用的是窗口环境

第 1 步: 打开 CMD 并输入 ipconfig 并回车。

第 2 步: 检查 WSL IPv4 Adress

Ethernet adapter vEthernet (WSL):

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : 3bd9::997b:b52a::fe80::65b3%63
   IPv4 Address. . . . . . . . . . . : 172.172.172.1  // use the IP as host/address
   Subnet Mask . . . . . . . . . . . : 255.255.255.255

第 3 步: 从浏览器中打开 PgAdmin 并创建服务器

第四步:

// Here it depends on your desired config mine is the following

Server: postgres
host address:  IPv4 Address(step 2)
username: postgress(username for postgress)
password: password(password for postgress)

我花了两天时间找出问题所在,希望有人会觉得它有帮助

【讨论】:

【参考方案20】:

当你启动容器时,你有它的网络别名。只需在 pgadmin UI 中使用此别名。 就像你有以下 docker compose config:

version: "3.5"
services:
  postgres:
    container_name: postgres-14
    image: postgres:14.1
    restart: unless-stopped
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_HOST_AUTH_METHOD=trust
      - POSTGRES_PASSWORD=root
      - POSTGRES_USER=postgres
    hostname: postgres
  pgadmin:
    container_name: pgadmin4
    image: dpage/pgadmin4
    restart: unless-stopped
    ports:
      - "80:80"
    environment:
      - POSTGRES_HOST_AUTH_METHOD=trust
      - PGADMIN_DEFAULT_EMAIL=user@domain.com
      - PGADMIN_DEFAULT_PASSWORD=admin
    hostname: pgadmin

您可以使用主机名添加服务器:postgres

【讨论】:

【参考方案21】:

我没有通过0.0.0.0:9090 上的浏览​​器连接我的容器pg(dpage/pgadmin4 图像)。

我运行了这个命令:

docker run --name pg -p 9090:9090 -e PGADMIN_DEFAULT_EMAIL='faizan' -e PGADMIN_DEFAULT_PASSWORD='faizan'  -d dpage/pgadmin4

解决方案一:

首先我尝试检查容器的 IP 地址

docker inspect pg 

我得到了容器 IP 地址"IPAddress": "172.17.0.3"。 http://172.17.0.3:9090 无法访问。

解决方案二:

然后我在没有解除附加模式的情况下运行命令(-d 已删除)

docker run --name pg -p 9090:9090 -e PGADMIN_DEFAULT_EMAIL='faizan' -e PGADMIN_DEFAULT_PASSWORD='faizan' dpage/pgadmin4
# Output, it should be running on 9090.
Listening at: http://[::]:80

-p 9090:9090 不起作用。

终于找到了解决办法:

在一些不支持扩展属性的文件系统上,它可能 不指定值就无法运行 pgAdmin PGADMIN_LISTEN_PORT 大于 1024。在这种情况下,指定 通过添加启动容器时的备用端口 环境变量,例如:

-e 'PGADMIN_LISTEN_PORT=5050'

不要忘记相应地调整任何主机容器端口映射。

Read more about it official doc

我添加了-e 'PGADMIN_LISTEN_PORT=9090' 并为我工作。

你可以尝试这两种解决方案,它肯定对你有用。

【讨论】:

以上是关于docker postgres pgadmin 本地连​​接的主要内容,如果未能解决你的问题,请参考以下文章

使用 pgAdmin 访问远程 Postgres 服务器

pgadmin4 连接到 Google Cloud SQL 中的 postgres

向 localhost 数据库添加气流连接(在 docker 上运行的 postgres)

在 PgAdmin 中取回服务器提示错误“致命:用户“postgres”的密码验证失败”

Postgres 中的 pg_class 是啥以及如何使用 pgAdmin 4 查看它?

如何在 Ubuntu 上使用 pgAdmin 将 Postgres 连接到 localhost 服务器?