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

从外部连接到docker容器中的Postgresql,postgresql,docker,remote-connection,Postgresql,Docker,Remote Connection,我在docker容器中的服务器上安装了Postgresql。我如何从外部,即从本地计算机连接到它?我应该应用什么设置来允许这样做?您可以通过这种方式运行Postgres(映射端口): docker run——命名一些postgres-e postgres\u PASSWORD=mysecretpassword-d-p 5432:5432 postgres 现在,您已经将容器的端口5432映射到服务器的端口5432-p:。现在可以从公共服务器ip:5432 要测试: 运行postgres数据库(

我在docker容器中的服务器上安装了Postgresql。我如何从外部,即从本地计算机连接到它?我应该应用什么设置来允许这样做?

您可以通过这种方式运行Postgres(映射端口):

docker run——命名一些postgres-e postgres\u PASSWORD=mysecretpassword-d-p 5432:5432 postgres
现在,您已经将容器的端口5432映射到服务器的端口5432
-p:
。现在可以从
公共服务器ip:5432

要测试: 运行postgres数据库(上面的命令)

进入容器内部并创建数据库:

docker exec -it 05b3a3471f6f bash
root@05b3a3471f6f:/# psql -U postgres
postgres-# CREATE DATABASE mytest;
postgres-# \q
转到您的本地主机(在那里您有一些工具或psql客户端)

(密码mysecretpassword)

因此,您正在从本地主机访问数据库(在服务器上的docker中运行)


在中,它被详细地解释了。

我已经在主机上运行了postgres,不想允许从网络进行连接,所以我在容器中运行了临时postgres实例,并在两行中创建了数据库:

#运行PostgreSQL
docker run--name postgres container-e postgres_PASSWORD=PASSWORD-it-p 5433:5432 postgres
#创建数据库
docker exec-it postgres container createdb-U postgres my db

您也可以通过docker exec命令通过以下方式进行访问:

$ docker exec -it postgres-container bash

# su postgres

$ psql


在这种情况下,它是django后端应用程序,您可以这样做

docker exec -it container_id python manage.py dbshell

我设法让它在linux上运行

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

    docker run--rm-P-P 127.0.0.1:5432:5432-e POSTGRES_PASSWORD=“1234”--名称pg POSTGRES:alpine
    
  • 使用另一个终端,使用postgres uri从主机访问数据库

    psqlpostgresql://postgres:1234@本地主机:5432/postgres
    

  • 对于mac用户,将psql替换为pgcli

    我尝试从本地主机(mac)连接到postgres容器。我将docker compose文件中的端口从5432更改为3306,并启动了容器。不知道我为什么这么做:|

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

    切换回端口5432后,所有工作正常

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

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

    这里有很好的答案,但如果您想拥有一些postgres数据库管理接口,您可以在本地计算机上安装pgAdmin,并使用其IP和postgres公开端口(默认为5432)连接到远程计算机.

    要从本地主机连接,需要添加“--net主机”:

    docker run --name some-postgres --net host -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
    
    您可以通过以下方式直接访问服务器,而无需从本地主机使用exec:

    psql -h localhost -p 5432 -U postgres
    

    首先打开postgres的docker图像

    docker exec -it <container_name>
    

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

    db:
        image: postgres:10-alpine
        environment:
            - POSTGRES_DB=app
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=supersecretpassword
        **ports:
            - "6543:5432"**
    
    这将添加本地计算机可访问的端口。对于我自己,我将DBeaver连接到它。这将防止应用程序请求和本地计算机请求之间的端口冲突。
    起初,我收到一条消息说5432端口正在使用(由django应用程序使用),因此我无法通过pgAdmin或DBeaver进行访问。

    出于某种原因,5432端口似乎受到了保护。我将端口配置从
    5432:5432
    更改为
    5416:5432
    ,以下命令用于从docker容器外部连接到postgres数据库:

    psql -h localhost -p 5416 -U <my-user> -d <my-database>
    
    psql-h localhost-p5416-U-d
    
    docker ps-a
    获取容器ID
    docker exec-it psql-U-W

    我假设您希望能够在每次从外部连接到容器时查看容器中的数据。要做到这一点,您必须在postgres图像上保存数据

    如果没有持久性数据,则必须重复第一次执行的所有操作。
    步骤3、5、6、7和8直接回答您的问题

    下面是我在Windows 10 powershell上遵循的整个过程的详细概述(命令在Linux和macOS中也是相同的):

    步骤1:在非管理模式下启动powershell

    步骤2:下载postgres docker图片:
    docker pull postgres:最新版本

    步骤3:在分离模式下启动docker容器,通过创建卷并将其绑定到目标,在postgres映像上保留数据
    注意:默认情况下,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

    步骤4:检查正在运行的容器的状态
    docker ps-a

    步骤5:以交互模式进入容器名称内部
    注意:如果您在安装过程中检查了linux容器,则可以在此处执行ls、pwd等命令)

    docker exec-it postgres测试psql-U postgres

    步骤6:创建样本数据。此时,您可以按以下方式使用
    psql
    命令:

    # CREATE DATABASE test;
    # \c test
    # CREATE TABLE test_table(something int);
    # INSERT INTO test_table VALUES (123);
    # SELECT * FROM test_table;
    # \q
    
    步骤7:打开数据库客户端应用程序,如
    pgadmin
    dbeaver
    ,并在连接字段中输入以下内容:

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

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

    如果您像@Martin一样使用docker compose,我知道这很晚了

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

    docker compose运行db bash

    root@de96f9358b70:/#psql-hdb-U root-d postgres#U dbpsql postgresql://<username>:<databasepassword>@postgres:5432/<database>
    
    db:
        image: postgres:10-alpine
        environment:
            - POSTGRES_DB=app
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=supersecretpassword
        **ports:
            - "6543:5432"**
    
    psql -h localhost -p 5416 -U <my-user> -d <my-database>
    
    # CREATE DATABASE test;
    # \c test
    # CREATE TABLE test_table(something int);
    # INSERT INTO test_table VALUES (123);
    # SELECT * FROM test_table;
    # \q
    
    Host: localhost
    Database: test
    User: postgres
    Password: password
    
    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