添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

从外部连接到docker容器中的Postgresql

464 人关注

我把Postgresql放在一个docker容器的服务器上。我怎样才能从外部,也就是从我的本地计算机连接到它?我应该应用什么设置来允许这样做?

2 个评论
你是用什么命令来启动postresql的? 你可以暴露一个端口并映射它
postgresql
docker
remote-connection
Sojo
Sojo
发布于 2016-06-08
17 个回答
lvthillo
lvthillo
发布于 2019-08-30
已采纳
0 人赞同

你可以这样运行Postgres(映射一个端口)。

docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres

所以现在你已经把你的容器的5432端口映射到你的服务器的5432端口。-p <host_port>:<container_port> .所以现在你的postgres可以从你的public-server-ip:5432访问。

为了测试。 运行postgres数据库(上面的命令)。

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
05b3a3471f6f        postgres            "/docker-entrypoint.s"   1 seconds ago       Up 1 seconds        0.0.0.0:5432->5432/tcp    some-postgres

进入你的容器,创建一个数据库。

docker exec -it 05b3a3471f6f bash
root@05b3a3471f6f:/# psql -U postgres
postgres-# CREATE DATABASE mytest;
postgres-# \q

转到你的本地主机(你有一些工具或psql客户端的地方)。

psql -h public-ip-server -p 5432 -U postgres

(password mysecretpassword)

postgres=# \l
                             List of databases
   Name    |  Owner   | Encoding |  Collate   |   Ctype    |   Access privileges
-----------+----------+----------+------------+------------+-----------------------
 mytest    | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 postgres  | postgres | UTF8     | en_US.utf8 | en_US.utf8 |
 template0 | postgres | UTF8     | en_US.utf8 | en_US.utf8 | =c/postgres   

所以你从你的本地主机访问数据库(它在服务器上的docker中运行)。

In this post它被详细地阐述了。

@Tjorriemorrie 你确定你的postgres运行在你的本地机器上?也许可以试试127.0.0.1而不是localhost,但对于我来说,它正在工作。
Paul
获取你的公共IP地址(osx)。【替换代码0
rg88
在我发现的所有与postgres/docker有关的帖子中,这是最有用的一个。谢谢你。
@GarouDan 如果你不想映射一个端口,但仍然想从你的主机上访问postgres容器,你需要像这样在主机网络上部署你的容器。【替换代码0
exiting psql works with \q (just for the newbies like me)
Thomas Ducrot
Thomas Ducrot
发布于 2019-08-30
0 人赞同

我设法让它在linux上运行

  • 运行docker postgres - 确保端口已发布,我使用alpine,因为它很轻。

    docker run --rm -P -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD="1234" --name pg postgres:alpine
    
  • 使用另一个终端,使用postgres uri从主机访问数据库。

    psql postgresql://postgres:1234@localhost:5432/postgres
    

    对于Mac用户,用pgcli代替psql

  • 很高兴有人回答了如何在不跳入容器的情况下进行连接,谢谢。
    你真的不应该使用 sudo 来运行你的容器。
    SuperNova
    SuperNova
    发布于 2019-08-30
    0 人赞同

    你也可以通过docker exec命令访问。

    $ docker exec -it postgres-container bash
    # su postgres
    $ psql
    
    $ docker exec -it postgres-container psql -U postgres
        
    psql -U postgres
    Breno
    What does su postgres do?
    @Breno su postgres 意思是:切换用户到postgres用户。
    MMEL
    效果很好。首先,你需要得到你的docker postgress的容器ID,使用 "docker ps -a "命令,然后用这个命令使用continerID: docker exec -it container_ID psql -U postgres
    psql after su postgres helped
    omeraiman
    omeraiman
    发布于 2019-08-30
    0 人赞同

    我在Docker容器中使用django与postgres。在docker-compose文件中,添加以下内容。

    image: postgres:10-alpine environment: - POSTGRES_DB=app - POSTGRES_USER=postgres - POSTGRES_PASSWORD=supersecretpassword ports: - "6543:5432"

    这个 ports 设置使用你的本地机器可以访问的端口 6543 (它只需要与 5432 不同)。对于我自己来说,我把DBeaver连接到它。这将防止你的应用程序请求和本地机器请求之间的端口冲突。

    起初,我收到一条信息,说5432端口正在使用(这是django应用程序),所以我不能用pgAdmin或DBeaver访问。

    我发现这是最有帮助的。对于使用docker-compose的人来说,这似乎是最好的方法。
    我可以确认这一点,还有这个看似奇怪的设置,即为主机使用一个与标准不同的端口号,而标准的 5432 可以进一步用于容器,没有任何危害。我有一个Windows PostgreSQL的安装,它占用了到达Docker主机所需的 5432 端口,见 从Windows Docker主机连接到dockerized postgres? .
    然后你用哪个IP来连接?
    这对我来说是有效的。5432端口没有工作。不知道为什么,因为这个端口在我的电脑上显然没有被占用或排除,但可惜的是,把它切换到我挑选的一个随机端口,最终成为我的解决方案。
    有点令人惊讶的是,当映射到已连接的主机端口时,docker镜像可以被构建和运行;这实际上意味着主机不能连接到postgres镜像。
    user9652688
    发布于 2019-08-30
    0 人赞同

    我假设你希望能够查看你的容器中存在的数据 everytime 你从外面连接到它。要做到这一点,你将不得不 persist postgres图像上的数据。

    如果你没有持久的数据,你将不得不重复你第一次做的一切。
    步骤3、5、6、7和8 直接回答你的问题。

    以下是我在Windows 10 powershell上遵循的整个过程的详细概述(Linux和macOS中的命令也是一样的)。

    Step 1 :在非管理员模式下启动powershell

    Step 2 :下载postgres docker镜像。
    docker pull postgres:latest

    Step 3 :在分离模式下启动docker容器,通过创建一个卷并将其绑定到一个目的地,在postgres镜像上持久保存数据。
    ( Note : 默认情况下,5432是使用的默认端口;但要明确说明,以防止来自pgadmin、dbeaver等客户端的连接错误)。
    docker run --name postgres-test -e POSTGRES_PASSWORD=password -p 5432:5432 -v postgres-data:/var/lib/postgresql/data -d postgres:latest

    Step 4 :检查运行中的容器的状态
    docker ps -a

    Step 5 :在交互式模式下进入container_name内部
    ( Note : 如果你在安装过程中检查了linux容器,可以在这里执行ls、pwd等命令)
    docker exec -it postgres-test psql -U postgres

    Step 6 :创建样本数据。这时,你可以按以下方式玩弄 psql 的命令。

    # CREATE DATABASE test;
    # \c test
    # CREATE TABLE test_table(something int);
    # INSERT INTO test_table VALUES (123);
    # SELECT * FROM test_table;
    

    Step 7:打开一个数据库客户端应用程序,如pgadmindbeaver,在连接字段中输入以下内容。

    Host: localhost
    Database: test
    User: postgres
    Password: password
    

    Step 8:在查询编辑器中输入查询select * from test_table,你应该能够看到输出123

    我完全按照这个方法做了,但是当我在dbeaver中输入细节时,它说测试数据库不存在。
    Rishabh Anand
    Rishabh Anand
    发布于 2019-08-30
    0 人赞同

    我知道这很晚了,如果你像@Martin那样使用docker-compose

    这些是帮助我在容器内连接到psql的片段

    docker-compose run db bash

    root@de96f9358b70:/# psql -h db -U root -d postgres_db

    我不能发表评论,因为我没有50个名誉。所以希望这对你有帮助。

    奥普想从外面连接。
    @avizzzy 这只是Ashutosh Gupta所说的一个替代方案 stackoverflow.com/a/54865728/10422291 我也应该在那里发表评论。我并不关心,但在生活中应该保持一致,对吗?
    @RishabhAnand 好吧,从现在开始,你将是:)
    Eugene
    Eugene
    发布于 2019-08-30
    0 人赞同

    我已经在主机上运行了postgres,不想让网络连接,所以我在容器中运行了临时的postgres实例,只用两行就创建了数据库。

    # Run PostgreSQL
    docker run --name postgres-container -e POSTGRES_PASSWORD=password -it -p 5433:5432 postgres
    # Create database
    docker exec -it postgres-container createdb -U postgres my-db
        
    如果你想创建一个单一的默认数据库,你也可以添加。 替换代码0】来创建my-db而不是postgres。
    Marc Perrin-Pelletier
    Marc Perrin-Pelletier
    发布于 2019-08-30
    0 人赞同

    由于某些原因,5432端口似乎受到保护。我把我的端口配置从 5432:5432 改为 5416:5432 ,下面的命令起作用了 从docker容器外连接到你的postgres数据库 :

    psql -h localhost -p 5416 -U <my-user> -d <my-database>
        
    它对我有用,但我在网上没有找到解释。你找到了吗?
    @negas 你可能已经在你的主机上运行了 postgres 服务,它已经绑定到localhost:5432,使你无法使用它。将不同的主机端口映射到容器内的默认端口5432是一个很好的解决方案;或者你可以停止主机上的postgres服务,但也许它被用于你需要的东西。
    user2627846
    user2627846
    发布于 2019-08-30
    0 人赞同

    要从localhost连接,你需要添加'--net host'。

    docker run --name some-postgres --net host -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
    

    你可以不使用exec从你的localhost直接访问服务器,通过使用。

    psql -h localhost -p 5432 -U postgres
        
    cora
    cora
    发布于 2019-08-30
    0 人赞同

    连接到运行 postgres 的本地容器

  • Install psql
  • brew search postgres

    brew install postgresql

    docker run --name postgres -e POSTGRES_DB=users \
      -e POSTGRES_USER=john \
      -e POSTGRES_PASSWORD=password \
      -p 5432:5432 -d postgres
        
    Martin
    Martin
    发布于 2019-08-30
    0 人赞同

    我试图从localhost(mac)连接到postgres容器。我把docker-compose文件中的端口从5432改为3306,然后启动容器。不知道我为什么这么做 :|

    然后我试图通过PSequel和adminer连接到postgres,结果连接无法建立。

    切换回5432端口后,一切正常。

    image: postgres ports: - 5432:5432 restart: always volumes: - "db_sql:/var/lib/mysql" environment: POSTGRES_USER: root POSTGRES_PASSWORD: password POSTGRES_DB: postgres_db

    这是我的经验,我想分享。也许有人可以利用它。

    Volume path: /var/lib/mysql ?
    Davos
    5432是Postgres的默认端口。3306是MySQL的默认端口。如果你在docker-compose中改变了发布的端口,那么你试图使用的任何客户端工具也将默认为试图连接到5432端口,除非你告诉他们使用其他端口。
    ashutosh gupta
    ashutosh gupta
    发布于 2019-08-30
    0 人赞同

    首先打开postgres的docker镜像

    docker exec -it <container_name>
    

    然后你会得到根 --root@868594e88b53:/#。 它需要数据库连接

    psql postgresql://<username>:<databasepassword>@postgres:5432/<database>
        
    Joel Mata
    Joel Mata
    发布于 2019-08-30
    0 人赞同

    This one worked for me:

    PGPASSWORD=postgres psql -h localhost -p 3307 -U postgres -d postgres
    

    使用上述方法加载一个初始脚本为。

    PGPASSWORD=postgres psql -h localhost -p 3307 -U postgres -d postgres < src/sql/local/blabla.sql
    

    不要说我把我的端口重新设置为。

    docker run -p3307:5432 --name postgres -e POSTGRES_PASSWORD=postgres -d postgres
        
    SuperNova
    SuperNova
    发布于 2019-08-30
    0 人赞同

    如果是django的后端应用,你可以这样做。

    docker exec -it container_id python manage.py dbshell
        
    yuriyni.com
    yuriyni.com
    发布于 2019-08-30
    0 人赞同

    在建立我的网关-微服务应用程序后,我遇到了同样的问题。不能从Heidisql连接到Contenerized postgresql。

    目前,我已经通过简单地在docker-compose.yml中指定postgresql密码和端口来解决了这个问题。

    所以你应该找到并打开docker-compose.yml。然后你应该输入POSTGRES_PASSWORD(不要让它为空),并指定端口 "5432:5432"

    microservice33-postgresql。 - POSTGRES_USER=microservice33 - POSTGRES_PASSWORD=wwww - POSTGRES_HOST_AUTH_METHOD=trust - 5432:5432

    参考链接和截图 post