PostgreSQL 和 pgAdmin 运行 在 Docker 个容器中并且正在连接

PostgreSQL and pgAdmin both running in Docker containers and connecting

我正在尝试 运行 在 Docker 容器中同时使用 PostgreSQL 和 pgAdmin。我的想法是 PostgreSQL 数据库应该可供我在主机上 运行ning 的任何应用程序以及 pgAdmin 访问。

我正在使用此命令 运行 PostgreSQL:

docker run -d -e POSTGRES_USER=username -e POSTGRES_PASSWORD=password --name postgres -p 5432:5432 postgres

然后 运行 pgAdmin:

docker run -d -p 1111:1111 --name pgadmin -e "PGADMIN_LISTEN_PORT=1111" -e "PGADMIN_DEFAULT_EMAIL=admin@test.com" -e "PGADMIN_DEFAULT_PASSWORD=test" dpage/pgadmin4

如果我转到 localhost:1111,我可以连接到 pgAdmin 并登录。但是,当我尝试连接到本地 PostgreSQL 实例时,它没有任何响应。

因此,我尝试 运行 pgAdmin 使用 --net=host 而不是 -p 1111:1111 访问主机互联网:

docker run -d --net=host --name pgadmin -e "PGADMIN_LISTEN_PORT=1111" -e "PGADMIN_DEFAULT_EMAIL=admin@test.com" -e "PGADMIN_DEFAULT_PASSWORD=test" dpage/pgadmin4

现在,当我尝试去 localhost:1111 连接到 pgAdmin 时,我的浏览器没有任何响应。

Docker Compose 是一个可能的解决方案,因为我可以 link 将两个容器放在一起,这样它们就可以相互访问而不必担心端口,但我还需要 pgAdmin 才能访问其他机器上的 PostgreSQL 实例,以及我的本地机器。

我觉得 --net=host 在 Docker 中被打破了。有一个完整的线程 here 有很多混乱。

我的设置:

Host: Windows 10
Docker: Docker Desktop Community v2.0.0.3 (31259)

更新

我现在已经尝试在 pgAdmin 容器上使用 --link postgres,它允许我连接到我的本地 PostgreSQL 实例,但不能连接到非本地实例,完整命令是:

docker run -d -p 1111:1111 --link postgres --name pgadmin -e "PGADMIN_LISTEN_PORT=1111" -e "PGADMIN_DEFAULT_EMAIL=admin@test.com" -e "PGADMIN_DEFAULT_PASSWORD=test" dpage/pgadmin4

当您创建 docker 容器时,它会创建一个桥接网络。首先找到网桥网络的网络范围。您可以使用 ifconfig 找到它。假设 172.17.0.5 是 pgAdmin 的 ip,然后为 PostgreSQL 创建一个用户 'root'@'172.17.0.5' 并为该用户授予数据库权限。然后就可以连接数据库了。还要检查端口 3306 是否可以使用 telnet 访问。

命令没有错,只是pgAdmin中的连接,所以完整的命令列表是:


对于 PostgreSQL:

docker run -d -e POSTGRES_USER=username -e POSTGRES_PASSWORD=password --name postgres -p 5432:5432 postgres

和 pgAdmin:

docker run -d -p 1111:1111 --name pgadmin -e "PGADMIN_LISTEN_PORT=1111" -e "PGADMIN_DEFAULT_EMAIL=admin@test.com" -e "PGADMIN_DEFAULT_PASSWORD=test" dpage/pgadmin4

现在 pgAdmin 容器不会连接到 localhost 但需要 PostgreSQL 容器的 IP。 运行:

docker inspect postgres

检查结果:

[
    {
        ...
        "NetworkSettings": {
            ...
            "Networks": {
                ...
                "IPAddress": "172.17.0.3",
                ...
            }
        }
    }
]

我们只对 inspect 命令中的 IPAddress 感兴趣。这是 pgAdmin 应该连接到的 IP。

pgAdmin 还能够从您的计算机访问外部 IP。