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

时间:2016-06-08 06:39:44

标签: postgresql docker remote-connection

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

16 个答案:

答案 0 :(得分:231)

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

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

现在您已将容器的端口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

进入容器并创建数据库:

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

转到你的localhost(你有一些工具或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中详细解释了它。

答案 1 :(得分:20)

我设法使其在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替换为pgcli

答案 2 :(得分:16)

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

q1.filter { _.date == "201601" }

答案 3 :(得分: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

答案 4 :(得分:9)

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

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

docker-compose run db bash

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

我没有评论,因为我没有50个声望。所以希望这会有所帮助。

答案 5 :(得分: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

答案 6 :(得分:4)

我试图从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

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

答案 7 :(得分:3)

要从本地主机连接,您需要添加'--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

答案 8 :(得分:2)

首先打开Postgres的Docker映像

docker exec -it <container_name>

然后您将获得根目录-root@868594e88b53:/# 需要数据库连接

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

答案 9 :(得分:2)

我在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无法访问。

答案 10 :(得分:0)

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

docker exec -it container_id python manage.py dbshell

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

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

答案 14 :(得分:0)

这一个为我工作:

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 :(得分:0)

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

此时我已经通过简单地将 postgresql 密码指定给 docker-compose.yml 以及端口来解决它。

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

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

参考链接和截图post