从另一个Docker容器中的pgAdmin4访问Docker容器上的PostgreSQL

时间:2019-11-16 14:03:49

标签: postgresql docker pgadmin pgadmin-4 postgresql-12

我有一个使用以下命令在docker上运行的PostgreSQL实例:

mkdir -p $HOME/vols/postgres

docker pull postgres:12.0

docker run --rm   --name pg-docker -e POSTGRES_PASSWORD=docker \
    -v $HOME/vols/postgres:/var/lib/postgresql/data \
    -d -p 5432:5432  postgres

它已启动并正在运行,我可以从安装在本地计算机上的DBeaver中访问它。另外,我已经通过以下命令安装了pgAdmin4:

mkdir -p $HOME/vols/pgadmin4

docker pull dpage/pgadmin4

docker run --rm --name pgadmin4 -p 5050:80 \    
    -v $HOME/vols/pgadmin4:/var/lib/pgadmin \
    -e 'PGADMIN_DEFAULT_EMAIL=amiry@manexapp.com' \
    -e 'PGADMIN_DEFAULT_PASSWORD=12345678' \
    -d dpage/pgadmin4

pgAdmin也正常运行,我可以轻松访问它并通过http://localhost:5050登录。

但是当我想通过pgAdmin4-container实例连接到我的postgre-container实例时,出现此错误:

  

无法连接到服务器:

     

无法连接到服务器:连接被拒绝服务器正在运行   在主机“ localhost”(127.0.0.1)上并接受TCP / IP连接   端口5432?无法连接到服务器:地址不可用   服务器在主机“ localhost”(:: 1)上运行并接受TCP / IP   端口5432上是否有连接?

有人知道这是怎么回事吗?提前致谢。

注意:我的主机是Fedora31。

2 个答案:

答案 0 :(得分:1)

在容器内,环回地址(localhost或127.0.0.1)引用“此容器”。当您尝试连接到pgAdmin4容器内的127.0.0.1时,它将失败,因为您的Postgres服务未在pgAdmin4容器内运行。

最简单的方法是将两个容器都放在用户定义的网络上,在这种情况下,它们可以简单地通过名称相互引用。

从创建网络开始:

docker network create dbnet

然后在该网络上启动postgres容器:

docker run --rm --name pg-docker -e POSTGRES_PASSWORD=docker \
    --net dbnet \
    -v $HOME/vols/postgres:/var/lib/postgresql/data \
    -d -p 5432:5432  postgres

最后在该网络上启动pgAdmin4容器:

docker run --rm --name pgadmin4 -p 5050:80 \    
    --net dbnet \
    -v $HOME/vols/pgadmin4:/var/lib/pgadmin \
    -e 'PGADMIN_DEFAULT_EMAIL=amiry@manexapp.com' \
    -e 'PGADMIN_DEFAULT_PASSWORD=12345678' \
    -d dpage/pgadmin4

现在,当您访问pgadmin ui时,可以连接到主机pg-docker而不是localhost

答案 1 :(得分:0)

更新:确定。 larsks通过创建自定义网络方法添加了完整的detailed answer,这更有意义。我会尝试的,并让您知道。


好。我认识到存在网络问题,pgAdmin4-docker无法看到pg12-docker。因此,我执行了以下步骤来解决问题:

A。通过以下方式停止pgadmin4容器:

docker stop pgadmin4

这也会删除该容器,因为我已经通过--rm标志运行了它。

B。通过运行以下命令找到与pg12-docker关联的网络名称和IP:

docker inspect pg12-docker

这将回显一个大的JSON文件。找到Networks节点:

"Networks": {
    "bridge": {
        "Gateway": "172.17.0.1",
        "IPAddress": "172.17.0.2",
        // other lines omitted  
    }
}

您将看到网络名称是JSON的第一个子元素(在此示例中为bridge),同时也是IPAddress。注意主题的某个地方。

C。再次使用--network [NetworkName]参数重新运行pgAdmin4-docker;将[NetworkName]替换为您在上一步中获得的名称(在此示例中为bridge)。

docker run --rm --name pgadmin4 -p 5050:80 --network bridge \    
    -v $HOME/vols/pgadmin4:/var/lib/pgadmin \
    -e 'PGADMIN_DEFAULT_EMAIL=amiry@manexapp.com' \
    -e 'PGADMIN_DEFAULT_PASSWORD=12345678' \
    -d dpage/pgadmin4

D。访问(或刷新)http://localhost:5050并登录。在Add server部分中,使用在步骤B中获得的IPAddress