【问题标题】:Accessing PostgreSQL on docker container from pgAdmin4 in another docker container从另一个 docker 容器中的 pgAdmin4 访问 docker 容器上的 PostgreSQL
【发布时间】:2019-11-16 14:03:49
【问题描述】:

我有一个在 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 上的连接?

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

注意:我的主机是 Fedora 31。

【问题讨论】:

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


    【解决方案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 用户界面时,您可以连接到主机 pg-docker 而不是 localhost

    【讨论】:

    • 启动pgadmin会报错[Errno 1] Operation not permitted: '/var/lib/pgadmin'
    【解决方案2】:

    更新:好的。 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。您就可以开始了。

    【讨论】:

      猜你喜欢
      • 2017-07-12
      • 2019-06-13
      • 1970-01-01
      • 2019-08-08
      • 2021-03-04
      • 2021-12-08
      • 2019-04-28
      • 2022-11-13
      • 1970-01-01
      相关资源
      最近更新 更多