我正在尝试在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
答案 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。