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

Posted

技术标签:

【中文标题】从外部连接到 docker 容器中的 Postgresql【英文标题】:Connecting to Postgresql in a docker container from outside 【发布时间】:2016-06-08 06:39:44 【问题描述】:

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

【问题讨论】:

你用什么命令来启动 postresql?你可以公开一个端口并映射它 参考这个reachmnadeem.wordpress.com/2020/06/02/… 【参考方案1】:

你可以这样运行 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

(密码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 中运行)。

在this post里面有详细的解释。

【讨论】:

@Tjorriemorrie 你确定你的 postgres 在你的本地机器上运行?也许尝试 127.0.0.1 而不是 localhost 但遇到它的工作。 获取您的公共 IP 地址 (osx):ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1 在所有与 postgres/docker 相关的各种帖子中,我发现这是最有用的帖子之一。谢谢。 @GarouDan 如果您不想映射端口但仍想从主机访问 postgres 容器,则需要像这样在主机网络上部署容器:docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres exiting psql 与 \q 一起使用(仅适用于像我这样的新手)【参考方案2】:

我设法让它在 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 用户,将 psql 替换为 pgcli

【讨论】:

很高兴有人回答了如何在不跳入容器的情况下进行连接。谢谢。 你真的不应该使用sudo 来运行你的容器。 @Thomas Webber 谢谢,这对我有用【参考方案3】:

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

$ docker exec -it postgres-container bash

# su postgres

$ psql

或者

$ docker exec -it postgres-container psql -U postgres

【讨论】:

psql -U postgres su postgres 是做什么的? @Breno su postgres 表示:将用户切换到 postgres 用户。 效果惊人。首先,您需要获取 docker postgress 的容器 ID,使用命令“docker ps -a”,然后将 continerID 与以下命令一起使用:docker exec -it container_ID psql -U postgres【参考方案4】:

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

db:
    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,请参阅Connect to dockerized postgres from Windows Docker host?。 那你用哪个IP连接呢?【参考方案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

第 7 步:打开数据库客户端应用程序,如 pgadmindbeaver,然后在连接字段中输入以下内容:

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

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

【讨论】:

我完全按照这个,但是当我在 dbeaver 中输入详细信息时,它说测试数据库不存在【参考方案6】:

我已经在主机上运行了 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

【讨论】:

如果要创建单个默认数据库,还可以添加:-e POSTGRES_DB=my-db 来创建 my-db 而不是 postgres【参考方案7】:

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

这些是帮助我连接到容器内的 psql 的 sn-ps

docker-compose run db bash

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

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

【讨论】:

Op 想从外部连接。 @avizzzy 这只是 Ashutosh Gupta 所说的 ***.com/a/54865728/10422291 的替代方案@ 也应该在那里发表评论。不像我在乎,但应该在生活中保持一致,对吧? @RishabhAnand 从现在开始你将成为:)【参考方案8】:

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

psql -h localhost -p 5416 -U <my-user> -d <my-database>

【讨论】:

它对我有用,但我没有在互联网上找到解释。你找到了吗? @negas 你可能已经在你的主机上运行postgres 服务,它已经绑定到 localhost:5432 阻止你使用它。将不同的主机端口映射到容器内的默认端口 5432 是一个很好的解决方案;或者,您可以停止主机上的 postgres 服务,但它可能用于您需要的东西。【参考方案9】:

要从 localhost 进行连接,您需要添加“--net host”:

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

您可以直接访问服务器,而无需使用本地主机中的 exec,方法是:

psql -h localhost -p 5432 -U postgres

【讨论】:

【参考方案10】:

我尝试从 localhost (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

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

【讨论】:

卷路径:/var/lib/mysql? 5432 是 Postgres 默认端口。 3306 是 MySQL 默认端口。如果您在 docker-compose 中更改已发布的端口,那么您尝试用于连接的任何客户端工具也将默认尝试连接到端口 5432,除非您告诉他们使用另一个端口。【参考方案11】:

首先打开postgres的docker镜像

docker exec -it <container_name>

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

psql postgresql://<username>:<databasepassword>@postgres:5432/<database>

【讨论】:

【参考方案12】:

如果它是一个 django 后端应用程序,你可以这样做。

docker exec -it container_id python manage.py dbshell

【讨论】:

【参考方案13】:

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

【讨论】:

【参考方案14】:

这个对我有用:

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

【讨论】:

【参考方案15】:

在构建我的网关微服务应用程序后,我遇到了同样的问题。无法从 Heidisql 连接到竞争性 postgresql。

目前我已经通过简单地为 docker-compose.yml 以及端口指定 postgresql 密码来解决它。

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

服务: 微服务33-postgresql: 环境: - POSTGRES_USER=微服务33 - POSTGRES_PASSWORD=www - POSTGRES_HOST_AUTH_METHOD=信任 端口: - 5432:5432

参考链接和截图post

【讨论】:

【参考方案16】:

docker ps -a 然后获取容器 ID docker exec -it psql -U -W

【讨论】:

以上是关于从外部连接到 docker 容器中的 Postgresql的主要内容,如果未能解决你的问题,请参考以下文章

从主机连接到 PSQL dockerized DB

无法从 Docker 容器连接到外部 SQL Server

从 docker 主机外部远程连接到在 docker 容器上运行的 oracle 数据库

可以从docker容器外部连接到数据库,但不能从内部(在laravel中)连接到数据库

使用 *** 从 Docker 容器内访问专用网络中的资源

从主机连接到 docker 容器中的 mysql