我试图在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是否可以访问。