postgresql Docker - Postgres和pgAdmin 4:Connection refused

iqjalb3h  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(8)|浏览(156)

新手与docker,我试图连接正确的localhost我的pgAdmin容器到postgres之一。

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
0b00555238ba        dpage/pgadmin4      "/entrypoint.sh"         43 minutes ago      Up 43 minutes       0.0.0.0:80->80/tcp, 443/tcp   pedantic_turing
e79fb6440a95        postgres            "docker-entrypoint.s…"   About an hour ago   Up About an hour    0.0.0.0:5432->5432/tcp        pg-docker

我成功连接与psql命令。

psql -h localhost -U postgres -d postgres

但是当我在pgAdmin上使用与psql相同的参数创建服务器时,我得到了以下错误。
无法连接到服务器:
无法连接到服务器:连接被拒绝服务器是否在主机“localhost”(127.0.0.1)上运行并接受端口5432上的TCP/IP连接?无法连接到服务器:服务器是否在主机“localhost”(::1)上运行,并在端口5432上接受TCP/IP连接?
我成功地连接到正确的IP地址由docker inspect在容器上。
顺便说一下,我检查了postgresql.conf,并Assertlisten_addresses = '*'和pg_hba.conf包含host all all all md5
但我不明白,为什么我不能使用本地主机地址?为什么docker甚至给予我一个不是本地的地址?

wnvonmuf

wnvonmuf1#

在这种情况下:

  1. Pgadmin无法连接到localhost,但psql从docker外部工作。
  2. pgadmin和Postgres都作为容器运行
    尽管您没有说明是否这样做,但理想情况下,这两个容器都可以是用于自动DNS解析的自定义bridge network的一部分。
    如果没有明确添加,它们将成为默认网桥网络的一部分。
    要找出在Docker运行时中创建的网络,请键入:$docker network ls
    一些网络会在控制台中列出,也许你会发现一个[name]_default它应该是你的网络。
    执行docker network inspect [name]_default,它会显示一堆信息,对我们来说最重要的是IPv4地址,类似这样:"7c3cd7532ab8aacc70830afb74adad7296d9c8ddd725c498af2d7ee2d2c2aadd": { "Name": "intime_postegres_1", "EndpointID": "56a9cb574469f22259497b72719f9f4a3e555b09f95058fcf389ef5287381f28", "MacAddress": "02:42:ac:12:00:02", "IPv4Address": "172.18.0.2/16", "IPv6Address": "" }
    不要在pgAdmin new server对话框中使用localhost作为服务器名称/ip,而是连接到postgres示例的“IPv4 Address”。
    在我的情况下连接在172.18.0.2:5432,工作就像一个魅力。
vqlkdk9b

vqlkdk9b2#

我也遇到过这样的情况,你可以在终端上使用psql命令连接,但不能使用pgAdmin 4。以下解决方案对我有效。
首先-

docker ps

从那里你会得到postgres容器的容器名/ID,然后做-

docker inspect name_of_container_here

它会给你给予这样的东西-

"Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "f35dbe66b36cd38673aad6e1278ad33031ef9d5abd34582d4b91955e288f855e",
                    "EndpointID": "2e63ea59e9d0de7526bb02ba29bc0b16bcad51b8963127ad380416d15da994db",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }

记下IP地址,并在pgAdmin 4-x1c 0d1x中创建新服务器时提供该地址

xqk2d5yq

xqk2d5yq3#

我遇到了同样的问题,我用一种非规范的方式解决了它,但对我的本地工作流程非常满意。
我总是用一个docker-compose.yaml文件启动我的postgresql容器。所以我只是将pgAdmin添加到同一个compose文件中:

version: "3.7"
services:
  my_awesome_db:
    image: postgres:latest
    ports:
      - "5432:5432"
    container_name: postgresql-local
    volumes:
      - "/var/run/postgres.sock:/var/run/postgres/postgres.sock"
      - "/home/myuser/docker-apps/volumes/postgres-data:/var/lib/postgresql/data"
  pg_admin:
    image: dpage/pgadmin4:latest
    container_name: pgadmin4
    ports:
      - "15432:80"
    environment:
      - GUNICORN_THREADS=1
      - [email protected]
      - PGADMIN_DEFAULT_PASSWORD=does_not_matter
    depends_on:
      - my_awesome_db

所以我在我的localhost:15432上访问pgAdmin(只是因为它很容易记住),我已经配置了pgAdmin:

Host: my_awesome_db
Port: 5432
Username: postgres
k2fxgqgv

k2fxgqgv4#

对我来说是这样工作的:
添加服务器->连接->主机名/地址
将字段设置为172.17.0.1
Docker Network doc的更多信息:https://docs.docker.com/network/network-tutorial-standalone

9vw9lbht

9vw9lbht5#

首先,您需要获取集装箱信息

$docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
0b00555238ba        dpage/pgadmin4      "/entrypoint.sh"         43 minutes ago      Up 43 minutes       0.0.0.0:80->80/tcp, 443/tcp   pedantic_turing
e79fb6440a95        postgres            "docker-entrypoint.s…"   About an hour ago   Up About an hour    0.0.0.0:5432->5432/tcp        pg-docker

然后提取IP地址

$sudo docker inspect e79fb6440a95 | grep IPAddress
"SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "192.168.64.2",

当你创建你的服务器时,

zbwhf8kr

zbwhf8kr6#

您只需要在连接字符串中指定服务器参数、容器名称,而不是localhost或127.0.0.1

qncylg1j

qncylg1j7#

我的pgAdmin运行在docker主机(osx)上。在docker-compose.yml中,我必须设置

ports:
  - 5432:5432

explicit.这一行以前没有。但这一条线成功了。
下面是我的例子:

version: '3.9'

services:

  db:
    image: postgres
    restart: always
    environment:
      POSTGRES_PASSWORD: mysecret
      POSTGRES_USER: myuser
      POSTGRES_DB: mydb
    ports:
      - 5432:5432
    ...
    ...

之后,我可以使用pgadmin连接到“localhost”。如果你重新启动你的容器,它是保存的!您不需要使用docker inspect搜索IP地址

如果你不这样做,你的docker将不会有一个HostIp“0.0.0.0“,而只有一个tcp 5432连接。
背景资料:
1.检查您正在运行的Docker容器docker ps
1.获取pgsql的名称并执行docker inspect name_of_container_here
1.找到行“端口:
在更改docker-compose.yml之前,docker-inspect ...将显示“Ports”5432/tcp为null:

...
"Ports": {
    "5432/tcp": null
},
...

修改docker-compose.yml后,docker inspect ...将显示以下内容,您现在可以看到“HostIp”:“0.0.0.0“,阿索.

...
"Ports": {
    "5432/tcp": [
        {
           "HostIp": "0.0.0.0",
           "HostPort": "5432"
        }
    ]
},
...
oyxsuwqo

oyxsuwqo8#

因为我是连接到一个服务器上的软管,这是一样简单,添加
--net host
到docker run命令,这样容器就可以访问主机的端口。

相关问题