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

Accessing PostgreSQL on docker container from pgAdmin4 in another docker container

我在 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 实例时,我得到这个错误:

Unable to connect to server:

could not connect to server: Connection refused Is the server running on host "localhost" (127.0.0.1) and accepting TCP/IP connections on port 5432? could not connect to server: Address not available Is the server running on host "localhost" (::1) and accepting TCP/IP connections on port 5432?

有人知道这里出了什么问题吗?提前致谢。

注意:我的主机是 Fedora 31。

在容器内部,环回地址(localhost或127.0.0.1)指的是"this container"。当您尝试连接到 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

更新:好的。 larsks added a full 创建自定义网络方法,这更有意义。我会试试看,然后告诉你。


好的。我发现存在网络问题,pgAdmin4-docker 看不到 pg12-docker。所以,我做了这些步骤来解决问题:

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

docker stop pgadmin4

这也会删除容器,因为我有 运行 它的 --rm 标志。

乙。通过 运行:

找到与 pg12-docker 关联的 network-name 和 IP
docker inspect pg12-docker

这将回显很大 JSON-file。找到 Networks 节点:

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

您会看到 network-name 是 JSON 的第一个 child(本例中是 bridge),还有 IPAddress。在某处注意主题。

摄氏度。 Re-run pgAdmin4-docker 再次使用 --network [NetworkName] 参数;将 [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,一切顺利。