无法从pgadmin连接到postgres db(均在docker上运行)?

时间:2019-03-20 16:08:59

标签: postgresql server configuration docker-compose pgadmin

我在fedora 28操作系统上使用docker-compose up在docker上运行postgres和pgadmin4,但在从pgadmin的Web控制台创建新的数据库服务器时遇到问题。 这是我正在使用的docker-compose.yml文件。

version: '3.0'

services:
  db:
    image: postgres:9.6
    ports:
      - 5432:5432/tcp
    environment:
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=admin
      - POSTGRES_DB=mydb

  pgadmin:
    image: dpage/pgadmin4
    ports:
      - 5454:5454/tcp
    environment:
      - PGADMIN_DEFAULT_EMAIL=admin@mydomain.com
      - PGADMIN_DEFAULT_PASSWORD=postgres
      - PGADMIN_LISTEN_PORT=5454

我应该在Create new server> 连接标签>“主机名/地址”字段中写什么?如果我输入localhost127.0.0.1会收到错误消息(无法连接,请参阅screenshot1screenshot2)。如果我键入 db yml文件中指定的服务名称),则只有pgadmin接受它,并使用名为 mydb 的postgres数据库创建数据库服务器。 。

为什么?如何找到地址字段中的IP?

此外,在Fedora28上:

$ netstat -napt | grep LIST
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:3350          0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:3389            0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::5454                 :::*                    LISTEN      -                   
tcp6       0      0 ::1:631                 :::*                    LISTEN      -                   
tcp6       0      0 :::5432                 :::*                    LISTEN      -                   
$

2 个答案:

答案 0 :(得分:0)

通过阅读文档并亲自进行测试,您正在正确地使用docker-compose yml文件中的数据库服务名称作为pgAdmin中的“主机名/地址”字段值。

https://docs.docker.com/compose/networking/

在您的“ pgadmin”部分中,我将使用8080或80的端口值,为什么是5454?

答案 1 :(得分:0)

我最近也遇到了这个问题。我发现了两种方法:

1)See here。基本上,您只需搜索postgres容器的IP地址,然后在pgadmin4中使用该IP地址:

    string query = $@"  SELECT  u.*
                        FROM    (
                                    VALUES {string.Join(",", ids.Select(id => $"({id})"))} 
                                ) AS Ids(Id)
                        JOIN    dbo.Users u ON u.Id = Ids.Id";

在我的情况下,postgres容器ID为$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 194d4a5f9dd0 dpage/pgadmin4 "/entrypoint.sh" 48 minutes ago Up 48 minutes 443/tcp, 0.0.0.0:8080->80/tcp docker-postgis_pgadmin_1 334d5bdc87f7 kartoza/postgis:11.0-2.5 "/bin/sh -c /docke..." 48 minutes ago Up 48 minutes (healthy) 0.0.0.0:5432->5432/tcp docker-postgis_db_1 。然后寻找IP地址:

334d5bdc87f7

当我在pgadmin4中使用$ docker inspect 334d5bdc87f7 | grep IPAddress "SecondaryIPAddresses": null, "IPAddress": "", "IPAddress": "172.18.0.2", 时,我已连接到数据库!是的!

2)第二种方法更容易。我没有使用172.18.0.2localhost127.0.0.1,而是在本地网络中使用了IP地址(在您的情况下,{em>例如是::1?)。之后,我连接到了postgres容器!