PostgreSQL和PGADMIN都在Docker容器中运行和连接



我试图在Docker容器中同时运行PostgreSQL和PGADMIN。这个想法是,PostgreSQL数据库应适用于我在主机机上运行的任何应用程序以及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实例时,它没有响应。

因此,我尝试使用--net=host而不是-p 1111:1111来运行PGADMIN,而不是访问主机Internet:

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组成是一个可能的解决方案,因为我可以将两个容器链接在一起,以便它们可以互相访问而不必担心端口,但是我还需要PGADMIN才能访问其他机器上的PostgreSQL实例,还可以我当地的一个。

我觉得--net=host在Docker中被打破了。这里有一个整个线程充满困惑。

我的设置:

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

命令没有错,只有pgadmin中的连接,因此命令的完整列表为:


for 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。

创建Docker容器时,它会创建一个桥梁网络。首先找到桥梁网络的网络范围。您可以使用ifconfig找到它。假设172.17.0.5是PGADMIN的IP,然后为PostgreSQL创建一个用户'root'172.17.0.5',并为该用户提供数据库权限。然后,您可以连接到数据库。还要使用telnet检查端口3306是否可以访问。

最新更新