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

时间:2019-05-10 08:42:17

标签: postgresql docker pgadmin

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

我正在使用以下命令运行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来访问主机互联网:

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是一种可能的解决方案,因为我可以将两个容器链接在一起,以便它们可以彼此访问而不必担心端口,但是我还需要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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

命令没错,只有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",
                ...
            }
        }
    }
]

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

pgAdmin还可以从您的计算机访问外部IP。