docker postgres pgadmin 本地连接
Posted
技术标签:
【中文标题】docker postgres pgadmin 本地连接【英文标题】:docker postgres pgadmin local connection 【发布时间】:2014-10-21 20:07:14 【问题描述】:我用 nginx、php 和 postgres 创建了一个 ubuntu 映像。
我想将我当前映像中的 postgres 数据库与位于我本地计算机上的 pgadmin
连接起来。
我曾尝试使用 docker inspector 尝试使用图像 ip 与我的本地 pgadmin 建立连接,但没有多大成功。我还尝试在本地配置一些端口以使连接正常工作。
【问题讨论】:
您没有说 PostgreSQL 是否正在侦听外部连接(检查您的配置文件),或者该端口是否在本地计算机上显示为打开。 提供的信息太少似乎无法回答这个问题 【参考方案1】:这是一个有效的问题,不知道为什么人们会觉得“似乎无法回答这个问题”。
所以,这就是我如何做你想做的事情:
从 Docker Hub 拉取 postgres 镜像
docker pull postgres:latest
使用以下命令运行容器
docker run -p 5432:5432 postgres
使用docker的inspect命令查找IP
使用该 IP、端口、用户名和密码在 PGADMIN 中进行连接
你也可以像下面这样简单的 telnet 来确认你是否可以访问 docker postgres 容器:
telnet IP_ADDRESS 5432
【讨论】:
如果你用这个-p 5432:5432
发布端口,那么你不需要找到容器的IP,你可以使用你的主机IP,或者127.0.0.1
或者只是localhost
帖子的意图是有效的,但它不是 SE 的高质量帖子。首先,没有提出实际的“问题”。此外,没有迹象表明他们如何尝试该过程或他们在执行过程中收到的错误。话虽如此,我认为你的回应做得很好。
这个答案对我有用,因此它是一个有效的问题。
我已经使用 -p 5432:5432 将容器映射到我的主机,但仍然出现连接错误。我尝试使用从 docker inspect 获得的 IPAddress,它可以工作。
谢谢,第 3 步“使用 docker 的检查命令查找 IP”解除了我遇到的问题。【参考方案2】:
我在运行 docker for windows 1.12.6(9655) 的 windows 10 上取得了成功,步骤如下:
拉取最新的postgres
docker pull postgres:latest
运行 postgres 容器:
docker run -d -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password123 --name db-my -p 5432:5432 --restart=always postgres
然后从 pgadmin website
运行 pgAdmin 4 创建新服务器,输入如下 主机:127.0.0.1 端口:5432 用户名:用户 密码:password123
然后一切正常,连接docker postgres实例成功。【讨论】:
【参考方案3】:这就是我所做的
对于 postgres
docker run -p 5432:5432 --name container-postgresdb -e POSTGRES_PASSWORD=admin -d postgres
对于 pgadmin
docker run -p 5050:80 -e "PGADMIN_DEFAULT_EMAIL=name@example.com" -e "PGADMIN_DEFAULT_PASSWORD=admin" -d dpage/pgadmin4
pgadmin 的连接字符串
host: host.docker.internal
database: postgres
user: postgres
password: admin
很好用!!!!!!
【讨论】:
Unable to connect to server: could not translate host name "host.docker.internal" to address: Try again
我也使用这种方法在 docker 中创建了 postgres 和 pgAdmin。作为输入值对我有用的是@SolidSnake 的答案 - ***.com/a/58224344/4288961 > docker inspect CONTAINER_ID | grep IP 地址。并将此结果 IP 地址用作主机
太棒了!。非常有帮助。我只需要'host.docker.internal'值
'host.docker.internal' 正是我所缺少的,谢谢!!【参考方案4】:
或者,您可以将 Postgres 和 Pgadmin 合并到一个 docker-compose
文件中,并以用户 pgadmin4@pgadmin.org
登录,密码:admin
。要添加 Posgres 服务器,请使用主机名postgres
,端口5432
。
version: '3'
services:
postgres:
image: postgres
hostname: postgres
ports:
- "6543:5432"
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: TEST_SM
volumes:
- postgres-data:/var/lib/postgresql/data
restart: unless-stopped
pgadmin:
image: dpage/pgadmin4
depends_on:
- postgres
ports:
- "5555:80"
environment:
PGADMIN_DEFAULT_EMAIL: pgadmin4@pgadmin.org
PGADMIN_DEFAULT_PASSWORD: admin
restart: unless-stopped
volumes:
postgres-data:
【讨论】:
我得到“无法将主机名“postgres”转换为地址:提供节点名或服务名,或未知”。 无法将主机名“postgres”转换为地址:名称无法解析 如果您docker network ls
,您将看到 postgres-to-pgadmin 网络的桥梁(我的是 postgres_postgres)。然后,您可以docker network inspect postgres_postgres
看到两个容器,每个容器都有一个 ip/主机名。从 Postgres 取一个(我的是 postgres_db_1)从 pgAdmin 成功连接。【参考方案5】:
如果您确认 PostgreSQL 正在运行并且您可以使用 PgAdmin 的本地副本连接那里...
答案很简单:使用host.docker.internal
而不是localhost
用于在 Docker 中运行的 PgAdmin
【讨论】:
哇,这太棒了,谢谢@*** 让这个成为答案 这是最好的解决方案。进行 docker network inspect 并使用该 IP 并不是最可靠的解决方案。 太棒了,这正是我一直在寻找的 :) @KARPOLAN 优秀的解决方案!谢谢 好的,但是为什么主机从localhost
变成了这个?【参考方案6】:
就我而言,我可以通过命令解决检查我的 postgre 图像的问题
docker inspect CONTAINER_ID | grep IPAddress.
所以,我使用 docker ip 地址来配置我的 pgadmin 4 连接,一切都很好。感谢@Afshin Ghazi
【讨论】:
【参考方案7】:如果 pgAdmin 打算在相同的 Ubuntu 主机/来宾中运行,那么您需要链接 postgres 容器,以便可以通过名称解析。
1.运行 postgres 容器:
docker run --name some-postgres -e POSTGRES_PASSWORD=postgres -d postgres
2。运行 pgAdmin 容器:
docker run -p 80:80 --link some-postgres -e "PGADMIN_DEFAULT_EMAIL=email@domain.com" -e "PGADMIN_DEFAULT_PASSWORD=postgres" -d dpage/pgadmin4
3.现在在 phAdmin Web 应用中添加新服务器时,使用 some-postgres
作为服务器名称
当我们启动 pgAdmin 时,请注意 --link some-postgres
。此命令使 postgres 容器对 pgAdmin 容器可见。
【讨论】:
我可以用 psq 连接到服务器,然后登录到 pgadmin 界面。但是从 pgadmin 界面连接到 postgres 服务器时,我使用什么网络/端口? 值得注意的是 Docker 文档 (docs.docker.com/network/links)Warning: The --link flag is a legacy feature of Docker. It may eventually be removed. Unless you absolutely need to continue using it, we recommend that you use user-defined networks to facilitate communication between two containers instead of using --link.
我也没有任何运气使用 --link
让我的 pgadmin 容器与我的 postgres 容器对话。但是,我可以从本地安装的 pgadmin 访问 postgres。【参考方案8】:
我将它包含在 docker yaml 文件中以获取数据库和 pgAdmin:
database:
image: postgres:10.4-alpine
container_name: kafka-nodejs-example-database
environment:
POSTGRES_USER: $POSTGRES_USER
POSTGRES_PASSWORD: $POSTGRES_PASSWORD
expose:
- "5432"
ports:
- 8000:5432
volumes:
- ./services/database/schema.sql:/docker-entrypoint-initdb.d/1-schema.sql
- ./services/database/seed.sql:/docker-entrypoint-initdb.d/2-seed.sql
pgadmin:
image: dpage/pgadmin4
ports:
- 5454:5454/tcp
environment:
- PGADMIN_DEFAULT_EMAIL=admin@mydomain.com
- PGADMIN_DEFAULT_PASSWORD=postgres
- PGADMIN_LISTEN_PORT=5454
postgres 的用户名是 alphaone,密码是 xxxxxxxxxxx。
执行docker ps
以获取容器ID,然后执行docker inspect <dockerContainerId> | grep IPAddress
例如:docker inspect 2f50fabe8a87 | grep IPAddress
将 IP 地址插入 pgAdmin 和 docker 中使用的数据库凭据:
【讨论】:
这有帮助。我必须从与 docker Postgres 关联的容器中 grep 正确的 IP 地址,以添加到 docker PgAdmin 门户中的服务器配置,如上所示。输入localhost
无效。【参考方案9】:
这在 Ubuntu 18 上对我有用:
1- 运行一个 postgres 容器
docker run -d -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password123 --name my-postgres -p 5432:5432 postgres
2- 运行一个 pgAdmin 容器
docker run --rm -p 5050:5050 thajeztah/pgadmin4
3- 获取您的本地 IP(在 Ubuntu 中通过 ifconfig
命令)
4- 在浏览器中打开localhost:5050
5- 点击服务器>>创建>>服务器...
6- 在“常规”选项卡中,为其命名,例如:docker。在“连接”选项卡中,输入以下字段:
主机名:来自 3 的 IP
用户名:用户
密码:password123
7- 点击保存,现在一切正常。
注意:如果这不起作用,请尝试使用“localhost”作为主机名。
【讨论】:
STEP 3 只在这里找到,它终于为我工作了!我在 docker 中有 pgadmin 只是因为在 arm64 上没有本机包。因此,指定 ifconfig 找到的 192.168.0.61 并在 pg config 启用外部连接允许我连接到 docker 外部已经运行的数据库。【参考方案10】:在面对这个问题两天后,我能够解决这个问题。
这个问题的解决方案已经得到了像 do inspect 这样的人的回答
docker inspect CONTAINER_ID
但在运行此命令时,我得到了很多日志,例如 Host Config Config Network Settings 等,所以我对哪个 IPAddress 感到困惑添加 pgAdmin 连接,因为我尝试了 0.0.0.0 并且在日志中配置、主机、networkSettings 不同 -2 IPAddress 但在尝试了很多之后终于可以工作了。
它适用于哪个 IP,我们必须添加该网络 IP 地址(我们创建该地址以连接 postgres 和 pgAdmin。)
就像我跑步时一样:-
docker 检查 postgres_container
"NetworkSettings":
"Bridge": "",
"SandboxID": "sdffsffsfsfsfsf123232e2r3pru3ouoyoyuosyvo8769696796",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports":
"5432/tcp": [
"HostIp": "0.0.0.0",
"HostPort": "5432"
]
,
"SandboxKey": "/var/run/docker/231231Ad132",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "",
"Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"MacAddress": "",
"Networks":
"postgres":
"IPAMConfig": null,
"Links": null,
"Aliases": [
"postgres",
"0e2j3bn2m42"
],
"NetworkID": "35rhlhl3l53l5hlh3523233k3k4k22l3hk2k4",
"EndpointID":"b3424n43k52o2i4n235k1k4l2l4hj234f14n2",
"Gateway": "192.168.16.1",
"IPAddress": "192.168.16.2",
"IPPrefixLen": 20,
"IPv6Gateway": "",
所以我们必须添加 NetworkSettings -> Network -> Postgres(我创建的网络)-> IPAddress 即“IPAddress”:“192.168.16.2”。
添加这个ip后就可以工作了。
我希望它会有所帮助。
【讨论】:
【参考方案11】:为了或找到你的容器IP,使用以下命令
docker inspect -f 'range .NetworkSettings.Networks.IPAddressend' container_name_or_id
参考:How to get a Docker container's IP address from the host
【讨论】:
【参考方案12】:就我而言,我有一个 PostgreSQL 容器,所以我没有更改容器或创建 docker-compose 方法,几个月后我需要 pgadming 来安装 PostgreSQL,所以这是我的方法:
docker inspect my_container_id_postgreSQL
分配给 PostgreSQL 的网络是:
“网络”: “docker_default”: "IP地址": "172.18.0.2", ...
使用--network
命令运行我的PGADMIN。
docker run -p 85:80 --network docker_default -e 'PGADMIN_DEFAULT_EMAIL=user@domain.com' -e 'PGADMIN_DEFAULT_PASSWORD=SuperSecret' -d dpage/pgadmin4
将 IP 地址插入 pgAdmin 和 docker 中使用的数据库凭据。
我希望这对某人有用。 问候。
【讨论】:
【参考方案13】:您必须将容器中的 postgres 端口公开给您的本地系统。你可以通过像这样运行你的容器来做到这一点:
docker run -p 5432:5432 <name/id of container>
当与您的 GUI 客户端或 CLI 连接时,请确保使用 ip-address 而不是 localhost,即使您的 ip-address 是 localhost ip-address。
docker ps
会给你你的 postgres 容器所在的 IP 地址。
【讨论】:
【参考方案14】:您也可以创建一个 Docker 桥接网络来执行此操作。
$ docker network create pgnet
a0ae44aaf6f806fc37302e4c603b4828c4edb8d487fd9cd90e2fb19ae1d5c65f
$ docker run --detach \
--name pg \
--network pgnet \
--publish 5432:5432 \
--restart always \
--env POSTGRES_PASSWORD=pg123 \
--volume $PWD/data:/var/lib/postgresql/data \
postgres:12.1
b60611e43727dabe483c1f08fdf74961b886ce05b432a10a0625bd1b6db87899
$ docker run --detach \
--name pgadm \
--network pgnet \
--publish 8000:80 \
--volume $PWD/pgadmin:/var/lib/pgadmin \
--env PGADMIN_DEFAULT_EMAIL=user@domain.com \
--env PGADMIN_DEFAULT_PASSWORD=pgadm123 \
dpage/pgadmin4:4.20
27f9ce1c1c4c383ee1507f4e2d88f6ef33d4fcf5b209a8a03b87519f90d56312
打开http://localhost:8000/
-
点击添加新服务器
创建 - 服务器
-
名称:数据库
主机名/地址:pg
用户名:postgres
密码:pg123
上面使用的Hostname/address是--name pg
给出的Postgres容器的名称
【讨论】:
这是一种独特的方法,使用容器名称作为主机名。与设置 Nginx 或其他方法相同的方法。有道理。【参考方案15】:对于 macOS IP,postgres
和 pgadmin4
与 docker inspect
提供的 IP 不同。
类型
docker-machine ls
看看左边的服务器名称。默认是default
。
docker-machine ip default
将您需要在浏览器中用于both、pgadmin4
和pgadmin4
设置中的postgres
的IP。
【讨论】:
【参考方案16】:要为您的容器找到正确的 ip,请执行以下命令:
检查容器 ID:
docker ps
检查容器的正确 IP:
docker inspect <ID_CONTAINER> | grep "IPAddress"
使用 Docker 配置 PostgreSQL 和 PgAdmin 都很简单,如果不正确,我建议从头开始重新配置,如果您的问题更深。
这是我为解决此问题而开发的脚本。 script-sh/install-docker-postgres-and-pgadmin
【讨论】:
【参考方案17】:如果本地主机端口 5432 已被其他 psql 服务器使用,请在创建容器时和在 Pgadmin 中更改它。
【讨论】:
【参考方案18】:我尝试并为我工作的解决方案是创建一个 docker compose 文件,其中我将 postgress 和 pgadmin 作为服务包含在内。更多详情:Connecting pgadmin to postgres in docker
【讨论】:
【参考方案19】:您是否使用 Window Subsystem LinuxWSL2
来运行 Docker 和 PgAdmin?
我建议的步骤与人们建议的步骤相似。就我而言,我使用的是窗口环境
第 1 步: 打开 CMD 并输入 ipconfig
并回车。
第 2 步: 检查 WSL IPv4 Adress
Ethernet adapter vEthernet (WSL):
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : 3bd9::997b:b52a::fe80::65b3%63
IPv4 Address. . . . . . . . . . . : 172.172.172.1 // use the IP as host/address
Subnet Mask . . . . . . . . . . . : 255.255.255.255
第 3 步: 从浏览器中打开 PgAdmin 并创建服务器
第四步:
// Here it depends on your desired config mine is the following
Server: postgres
host address: IPv4 Address(step 2)
username: postgress(username for postgress)
password: password(password for postgress)
我花了两天时间找出问题所在,希望有人会觉得它有帮助
【讨论】:
【参考方案20】:当你启动容器时,你有它的网络别名。只需在 pgadmin UI 中使用此别名。 就像你有以下 docker compose config:
version: "3.5"
services:
postgres:
container_name: postgres-14
image: postgres:14.1
restart: unless-stopped
ports:
- "5432:5432"
environment:
- POSTGRES_HOST_AUTH_METHOD=trust
- POSTGRES_PASSWORD=root
- POSTGRES_USER=postgres
hostname: postgres
pgadmin:
container_name: pgadmin4
image: dpage/pgadmin4
restart: unless-stopped
ports:
- "80:80"
environment:
- POSTGRES_HOST_AUTH_METHOD=trust
- PGADMIN_DEFAULT_EMAIL=user@domain.com
- PGADMIN_DEFAULT_PASSWORD=admin
hostname: pgadmin
您可以使用主机名添加服务器:postgres
【讨论】:
【参考方案21】:我没有通过0.0.0.0:9090 上的浏览器连接我的容器pg
(dpage/pgadmin4 图像)。
我运行了这个命令:
docker run --name pg -p 9090:9090 -e PGADMIN_DEFAULT_EMAIL='faizan' -e PGADMIN_DEFAULT_PASSWORD='faizan' -d dpage/pgadmin4
解决方案一:
首先我尝试检查容器的 IP 地址
docker inspect pg
我得到了容器 IP 地址"IPAddress": "172.17.0.3"
。 http://172.17.0.3:9090 无法访问。
解决方案二:
然后我在没有解除附加模式的情况下运行命令(-d 已删除)
docker run --name pg -p 9090:9090 -e PGADMIN_DEFAULT_EMAIL='faizan' -e PGADMIN_DEFAULT_PASSWORD='faizan' dpage/pgadmin4
# Output, it should be running on 9090.
Listening at: http://[::]:80
-p 9090:9090
不起作用。
终于找到了解决办法:
在一些不支持扩展属性的文件系统上,它可能 不指定值就无法运行 pgAdmin PGADMIN_LISTEN_PORT 大于 1024。在这种情况下,指定 通过添加启动容器时的备用端口 环境变量,例如:
-e 'PGADMIN_LISTEN_PORT=5050'
不要忘记相应地调整任何主机容器端口映射。
Read more about it official doc
我添加了-e 'PGADMIN_LISTEN_PORT=9090'
并为我工作。
你可以尝试这两种解决方案,它肯定对你有用。
【讨论】:
以上是关于docker postgres pgadmin 本地连接的主要内容,如果未能解决你的问题,请参考以下文章
pgadmin4 连接到 Google Cloud SQL 中的 postgres
向 localhost 数据库添加气流连接(在 docker 上运行的 postgres)
在 PgAdmin 中取回服务器提示错误“致命:用户“postgres”的密码验证失败”