簡體   English   中英

Docker - Postgres 和 pgAdmin 4:連接被拒絕

[英]Docker - Postgres and pgAdmin 4 : Connection refused

docker 的新手,我正在嘗試通過本地主機將我的 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

但是當我使用與 psql 相同的參數在 pgAdmin 上創建服務器時,出現以下錯誤。

無法連接到服務器:

無法連接到服務器:連接被拒絕 服務器是否在主機“localhost”(127.0.0.1) 上運行並在端口 5432 上接受 TCP/IP 連接? 無法連接到服務器:地址不可用 服務器是否在主機“localhost”(::1) 上運行並在端口 5432 上接受 TCP/IP 連接?

我通過docker inspect容器給出的 IP 地址成功連接。

順便說一句,我檢查了 postgresql.conf 並斷言listen_addresses = '*'並且 pg_hba.conf 包含host all all all md5

但是我不明白,為什么我不能使用本地主機地址? 為什么 docker 甚至給我一個不是本地的地址?

在這種情況下:

  1. Pgadmin 無法連接到 localhost,但 psql 可以從 docker 外部運行。
  2. pgadmin 和 Postgres 都作為容器運行

盡管您沒有指明是否這樣做,但理想情況下,兩個容器都可以成為用於自動 DNS 解析的自定義橋接網絡的一部分。

如果未明確添加,它們將成為默認網橋網絡的一部分。

要找出在 docker 運行時中創建的網絡,請鍵入: $ docker network ls

控制台中會列出一些網絡,也許你會發現一個[name]_default它應該是你的網絡。

執行docker network inspect [name]_default它會顯示一堆的信息,對我們來說最重要的是IPv4Address,這樣的事情: "7c3cd7532ab8aacc70830afb74adad7296d9c8ddd725c498af2d7ee2d2c2aadd": { "Name": "intime_postegres_1", "EndpointID": "56a9cb574469f22259497b72719f9f4a3e555b09f95058fcf389ef5287381f28", "MacAddress": "02:42:ac:12:00:02", "IPv4Address": "172.18.0.2/16", "IPv6Address": "" }

不要在 pgAdmin 新服務器對話框中使用 localhost 作為服務器名稱/ip,而是連接到 postgres 實例的“IPv4Address”。

在我的情況下,連接在172.18.0.2:5432 ,就像一個魅力。

我也遇到過這種情況,您可以在終端上使用psql命令進行連接,但無法使用 pgAdmin4。 以下解決方案對我有用。

第一的 -

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
                }
            }

注意 IPAddress 並在 pgAdmin4 中創建新服務器時提供 - 在此處輸入圖片說明

我遇到了同樣的問題,我以非規范的方式解決了它,但對我的本地工作流程非常滿意。

我總是用docker-compose.yaml文件啟動我的 postgresql 容器。 所以我只是將 pgAdmin 添加到同一個撰寫文件中:

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
      - PGADMIN_DEFAULT_EMAIL=my_awesome_email@email.com
      - PGADMIN_DEFAULT_PASSWORD=does_not_matter
    depends_on:
      - my_awesome_db

所以我在我的 localhost:15432 上訪問 pgAdmin(只是因為它很容易記住),並且我已經配置了 pgAdmin:

Host: my_awesome_db
Port: 5432
Username: postgres

對我來說是這樣工作的:

添加服務器 -> 連接 -> 主機名/地址

將字段設置為 172.17.0.1

Docker 網絡文檔中的更多信息: https : //docs.docker.com/network/network-tutorial-standalone

您只需要在連接字符串中指定服務器參數、容器名稱,而不是 localhost 或 127.0.0.1

首先你需要獲取容器信息

$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",

當你創建你的服務器時,把你的 IP 地址

在此處輸入圖片說明

因為我是通過軟管連接到服務器,所以就像添加一樣簡單

--net host

到 docker run 命令,以便容器可以訪問主機的端口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM