docker postgres pgadmin本地连接


99

我用nginx,php和postgres创建了一个ubuntu图像。

我想将当前映像中的postgres数据库与pgadmin本地计算机上的数据库连接。

我尝试使用docker inspector尝试使用图像ip与我的本地pgadmin建立连接,但没有成功。我还尝试在本地配置一些端口以使连接正常工作。


您没有说PostgreSQL是在侦听外部连接(检查配置文件)还是该端口从本地计算机打开。
理查德·赫克斯顿

1
提供的信息很少,似乎无法回答这个问题
cthulhu 2014年

Answers:


91

这是一个有效的问题,不知道为什么人们会觉得“似乎无法回答这个问题”。

所以,这就是我要做的事情:

  1. 从Docker Hub提取postgres图像

    docker pull postgres:latest

  2. 使用以下命令运行容器

    docker run -p 5432:5432 postgres

  3. 使用docker的inspect命令查找IP

  4. 使用该IP,PORT,用户名和密码连接PGADMIN

  5. 您还可以像下面这样做一个简单的telnet,以确认是否可以访问docker postgres容器:

    telnet IP_ADDRESS 5432


16
如果要发布这个端口-p 5432:5432,那么你并不需要找到容器的IP,你可以用你的主机IP,或者127.0.0.1只是或者localhost
达沃斯

该帖子的意图是有效的,但对于SE而言不是高质量的帖子。首先,没有提出任何实际的“问题”。此外,没有迹象表明他们如何尝试该过程或在执行过程中收到错误。就是说,我认为您在回应方面做得很好。
–duct_tape_coder

3
这个答案对我很有用,因此是一个有效的问题。
托德

我已经使用-p 5432:5432将容器映射到我的主机,但是仍然出现连接错误。我尝试使用从docker inspect获得的IPAddress,它可以工作。
ginad

50

我在运行Windows 1.12.6(9655)的docker的Windows 10上成功完成的操作如下:

  1. 拉最新的postgres

    docker pull postgres:latest

  2. 运行postgres容器:

    docker run -d -e POSTGRES_USER=user -e POSTGRES_PASSWORD=password123 --name db-my -p 5432:5432 --restart=always postgres

  3. 然后从pgadmin网站安装了最新版本的pgAdmin4

  4. 运行pgAdmin 4创建新服务器,并输入以下内容主机:127.0.0.1端口:5432用户名:用户密码:password123

  5. 然后一切正常,连接到docker postgres实例成功。

45

或者,您可以将Postgres和Pgadmin合并到一个docker-compose文件中,然后以用户名pgadmin4@pgadmin.orgpwd:登录admin。要添加Posgres服务器,请使用hostname postgresport 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:

3
我收到“无法将主机名“ postgres”转换为地址:提供的节点名或服务名,或者未知)。
恩里克·奥尔蒂斯·卡西利亚斯

1
无法将主机名“ postgres”转换为地址:名称无法解析
代理

2
如果您有docker network ls,您会看到一个从postgres到pgadmin网络的桥梁(我的是postgres_postgres)。然后,您可以docker network inspect postgres_postgres看到两个容器,每个容器都有一个ip / hostname。从Postgres中获取一个(我的名字是postgres_db_1),以从pgAdmin成功连接。

28

这就是我所做的

对于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

效果很好!!!!!


5
Unable to connect to server: could not translate host name "host.docker.internal" to address: Try again
pipe_tape_coder

2
我也使用这种方法在docker中创建了postgres和pgAdmin。什么工作对我来说作为输入值是从@SolidSnake了答案- stackoverflow.com/a/58224344/4288961 >泊坞窗检查CONTAINER_ID | grep IP地址。并使用此结果IP地址作为主机
Prusdrum

太棒了!很有帮助。我只需要'host.docker.internal的价值
埃尔南·阿科斯塔

20

就我而言,我可以解决通过命令检查我的postgre图像的问题

docker inspect CONTAINER_ID  | grep IPAddress.

因此,我使用了docker ip地址来配置pgadmin 4连接,一切都很好。感谢@Afshin Ghazi


17

如果pgAdmin打算在同一Ubuntu主机/ guest上运行,则需要链接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用作服务器名称

请注意--link some-postgres何时启动pgAdmin。该命令使pgAdmin容器对postgres容器可见。


1
我可以将psq连接到服务器,然后登录pgadmin界面。但是,从pgadmin界面连接到postgres服务器时,我使用什么网络/端口?
汤姆(Tom)

1
值得一提的是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。
–duct_tape_coder,

13

我将其包含在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中使用的数据库凭据:

pgAdmin


1
这有帮助。我必须从与Docker Postgres关联的容器中grep正确的IP地址,以添加到docker PgAdmin门户中的服务器配置中,如上所示。推杆localhost不起作用。
安德鲁·罗布班

6

如果您确认PostgreSQL正在运行,则可以在那里与PgAdmin的本地副本连接...

答案很简单:对Docker内部运行的PgAdmin使用host.docker.internalilocalhost代替

使用<code> host.docker.internal </ code>代替<code> localhost </ code>


5

就我而言,我有一个PostgreSQL容器,所以我没有更改容器或创建docker-compose方法,几个月后我需要pgadming安装PostgreSQL,所以这是我的方法:

  1. docker inspect my_container_id_postgreSQL
  2. 分配给PostgreSQL的网络是:

    “网络”:{“ docker_default”:{“ IPAddress”:“ 172.18.0.2”,...}}

  3. --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

  4. 将Ip地址插入pgAdmin和docker中使用的数据库凭据。

我希望这对某人有用。问候。



4

您必须将容器中的postgres端口公开给本地系统。您可以通过这样运行容器来做到这一点:

docker run -p 5432:5432 <name/id of container>

与GUI客户端或CLI连接时,即使您的ip-address是localhost ip-address,也请确保使用ip-address而不是localhost。

docker ps 将为您提供postgres容器所在的IP地址。


4

面对此问题两天后,我得以解决该问题。

这个问题的解决方案已经被人们喜欢做检查了

docker inspect CONTAINER_ID

但在运行此命令时,我得到一个,很多像日志主机配置 配置 网络设置等,让我糊涂了其ip地址在添加pgAdmin的连接,因为我想0.0.0.0在和配置,主机,NetworkSettings已不同-2 ip地址日志,但经过大量尝试后终于可以使用。

它与哪个IP一起工作,我们必须添加该网络ip地址(我们创建该IP地址是为了连接postgrespgAdmin)

就像我跑步时的情况:-

码头工人检查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后,它将起作用。

希望对您有所帮助。


2

您也可以创建一个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 /

  1. 单击添加新服务器
  2. 创建-服务器
    1. 名称:db
    2. 主机名/地址:pg
    3. 用户名:postgres
    4. 密码:pg123
  3. 保存

上面使用的主机名/地址是由给出的Postgres容器的名称 --name pg


这是一种独特的方法,使用容器名称作为主机名。与设置Nginx或其他方法相同。说得通。
肖恩·麦卡锡

1

要为您的容器找到正确的IP,请执行以下命令:

检查容器ID:

docker ps

要检查容器的正确IP:

docker inspect <ID_CONTAINER> | grep "IPAddress"

使用Docker的PostgreSQL和Pg​​Admin的配置都很简单,如果不正确,如果您的问题更深,我建议从头开始重做配置。

这是我为解决此问题而开发的脚本。 脚本-sh / install-docker-postgres-和-pgadmin


1

对于macOS,提供的IP与postgres和提供的IPpgadmin4不同docker inspect。类型

docker-machine ls

看一下左侧的服务器名称。这是default默认。

docker-machine ip default将IP,您需要使用两个pgadmin4在浏览器并postgrespgadmin4设置。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.