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

Soj*_*ojo 153 postgresql remote-connection docker

我在Docker容器中的服务器上有Postgresql.如何从外部(即从我的本地计算机)连接到它?我应该采用什么设置才能允许?

lvt*_*llo 265

你可以这样运行Postgres(映射端口):

docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
Run Code Online (Sandbox Code Playgroud)

所以现在您已将容器的端口5432映射到服务器的端口5432.-p <host_port>:<container_port> 那么现在你的帖子可以从你的网站访问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
Run Code Online (Sandbox Code Playgroud)

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

docker exec -it 05b3a3471f6f bash
root@05b3a3471f6f:/# psql -U postgres
postgres-# CREATE DATABASE mytest;
postgres-# \q
Run Code Online (Sandbox Code Playgroud)

转到您的localhost(您有一些工具或psql客户端).

psql -h public-ip-server -p 5432 -U postgres
Run Code Online (Sandbox Code Playgroud)

(密码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   
Run Code Online (Sandbox Code Playgroud)

因此,您从localhost访问数据库(在服务器上的docker中运行).

这篇文章中详细阐述了它.

  • 这对localhost不起作用 (7认同)
  • -h localhost可能无法正常工作.使用-h 127.0.0.1 (3认同)
  • 在所有各种postgres/docker相关帖子中,我发现这是最有用的一个.谢谢. (3认同)
  • 获取您的公共IP地址(osx):`ifconfig -u | grep'inet'| grep -v 127.0.0.1 | 切-d\-f2 | 头-1` (2认同)
  • @GarouDan,如果您不想映射端口,但仍想从主机访问 postgres 容器,则需要在主机网络上部署容器,如下所示:`docker run --net=host --name some -postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres` (2认同)
  • 在我身边`-h localhost`工作¯\ _(ツ)_ /¯ (2认同)
  • 退出 psql 可以使用 \q (仅适用于像我这样的新手) (2认同)

Tho*_*ber 26

我设法让它在Linux上运行

  • 1首先运行docker postgres,确保端口发布,我使用alpine因为它是轻量级的.

    sudo docker run --rm -P -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD="1234" --name pg postgres:alpine

  • 2使用另一个终端,使用postgres uri从主机访问数据库

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

对于mac用户,用pgcli替换psql

  • 你真的不应该使用 `sudo` 来运行你的容器。 (8认同)
  • 很高兴有人回答如何连接而不跳进容器.日Thnx. (5认同)

Sup*_*ova 19

您也可以通过docker exec命令访问.

$ docker exec -it postgres-container bash

# su postgres

$ psql
Run Code Online (Sandbox Code Playgroud)

  • psql -U postgres (3认同)
  • @Breno `su postgres` 意思是:将用户切换到 postgres 用户。 (2认同)
  • 效果棒极了。首先,您需要获取 docker postgress 的容器 ID,使用命令“docker ps -a”,然后通过以下命令使用 continerID: docker exec -it container_ID psql -U postgres (2认同)

cor*_*ora 19

连接到正在运行的本地容器postgres

  1. 安装psql

    brew search postgres
    brew install postgresql
    
    Run Code Online (Sandbox Code Playgroud)
  2. 启动 Docker

    docker run --name postgres -e POSTGRES_DB=users \
      -e POSTGRES_USER=john \
      -e POSTGRES_PASSWORD=password \
      -p 5432:5432 -d postgres
    
    Run Code Online (Sandbox Code Playgroud)
  3. 连接到数据库

    psql --host=localhost --username=john --dbname=users
    
    Run Code Online (Sandbox Code Playgroud)


Eug*_*ene 13

我已经在主机上运行了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
Run Code Online (Sandbox Code Playgroud)


小智 13

我知道这已经晚了,如果你像@Martin 一样使用 docker-compose

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

docker-compose run db bash

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

我无法发表评论,因为我没有 50 声望。所以希望这会有所帮助。

  • Op 希望从外部连接。 (3认同)

小智 9

我在Docker容器中将Django与postgres一起使用。在docker-compose文件中,添加以下内容:

db:
    image: postgres:10-alpine
    environment:
        - POSTGRES_DB=app
        - POSTGRES_USER=postgres
        - POSTGRES_PASSWORD=supersecretpassword
    **ports:
        - "6543:5432"**
Run Code Online (Sandbox Code Playgroud)

这将添加本地计算机的可访问端口。我自己将DBeaver连接到它。这样可以防止您的应用程序请求与本地计算机请求之间发生端口冲突。最初,我收到一条消息,说端口5432正在使用(这是django应用程序使用的),因此pgAdmin或DBeaver无法访问。

  • 我发现这是最有帮助的。对于使用 docker-compose 的人来说,这似乎是最好的方法。 (6认同)
  • 我可以确认这一点,还有这个看似奇怪的设置,即为主机使用与标准不同的端口号,而标准“5432”可以进一步用于容器而不会造成任何损害。我安装了一个 Windows PostgreSQL,它占用了连接 Docker 主机所需的端口“5432”,请参阅[从 Windows Docker 主机连接到 dockerized postgres?](/sf/answers/4825036331/)。 (2认同)

Mar*_*ier 9

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

psql -h localhost -p 5416 -U <my-user> -d <my-database>
Run Code Online (Sandbox Code Playgroud)

  • @negas您可能已经在主机上运行“postgres”服务,该服务已经绑定到 localhost:5432 阻止您使用它。将不同的主机端口映射到容器内的默认端口 5432 是一个很好的解决方案;或者,您可以停止主机上的 postgres 服务,但也许它用于您需要的东西。 (3认同)

Mar*_*tin 6

我试图从本地主机(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
Run Code Online (Sandbox Code Playgroud)

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

  • 卷路径:`/var/lib/mysql` ? (3认同)

use*_*846 6

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

docker run --name some-postgres --net host -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令直接访问服务器,而无需从本地主机使用exec:

psql -h localhost -p 5432 -U postgres
Run Code Online (Sandbox Code Playgroud)


小智 6

首先打开postgres的docker镜像

docker exec -it <container_name>
Run Code Online (Sandbox Code Playgroud)

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

psql postgresql://<username>:<databasepassword>@postgres:5432/<database>
Run Code Online (Sandbox Code Playgroud)


Sau*_*abh 5

我假设您希望每次从外部连接到容器时都可以查看容器中存在的数据。为此,您必须将数据保留在postgres映像上。

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

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

步骤1:以非管理员模式启动Powershell

第2步:下载postgres docker映像:
docker pull postgres:latest

步骤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:以交互方式进入container_name
注意:如果在安装过程中检查了linux容器,则可以在此处执行ls,pwd等命令)
docker exec -it postgres-test 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
Run Code Online (Sandbox Code Playgroud)

步骤7:打开数据库客户端应用程序(例如pgadmin或),dbeaver然后在连接字段中输入以下内容:

Host: localhost
Database: test
User: postgres
Password: password
Run Code Online (Sandbox Code Playgroud)

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