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。
我正在尝试 运行 在 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。