0

我有一个在 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) 上运行并接受端口 5432 上的 TCP/IP 连接?无法连接到服务器:地址不可用服务器是否在主机“localhost”(::1) 上运行并接受端口 5432 上的 TCP/IP 连接?

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

注意:我的主机是 Fedora 31。

4

2 回答 2

2

在容器内部,环回地址(localhost或 127.0.0.1)指的是“这个容器”。当您尝试连接到127.0.0.1pgAdmin4 容器内时,它会失败,因为您的 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.

于 2019-11-16T14:32:13.850 回答
0

更新:好的。larsks通过创建自定义网络方法添加了完整的详细答案,这更有意义。我会试试的,然后告诉你。


好的。我认识到存在网络问题,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  
    }
}

您将看到 network-name 作为 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部分中,使用IPAddress您在步骤 B 中获得的。您就可以开始了。

于 2019-11-16T14:54:16.090 回答