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

问题描述 投票:118回答:11

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

postgresql docker remote-connection
11个回答
237
投票

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

转到您的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   

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

在qazxsw poi中详细解释了它。


0
投票

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


0
投票

出于某种原因5432端口似乎受到保护。我从docker exec -it container_id python manage.py dbshell to 5432:5432更改了我的端口配置,以下命令用于从其docker容器外部连接到postgres数据库:

5416:5432

20
投票

我设法让它在Linux上运行

  • 1首先运行docker postgres,确保端口发布,我使用alpine因为它是轻量级的。 this post
  • 2使用另一个终端,使用postgres uri从主机访问数据库 sudo docker run --rm -P -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD="1234" --name pg postgres:alpine

对于mac用户,用pgcli替换psql


16
投票

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

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

13
投票

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

$ docker exec -it postgres-container bash

# su postgres

$ psql

5
投票

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

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

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

# 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

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


3
投票

要从localhost连接,您需要添加'--net host':

  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

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

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

3
投票

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

psql -h localhost -p 5432 -U postgres

这将为您的本地计算机添加可访问端口。对于我自己,我将DBeaver连接到它。这将防止您的应用程序请求和本地计算机请求之间的端口冲突。起初,我得到一条消息说端口5432正在使用(由django应用程序),所以我无法通过pgAdmin或DBeaver访问。


2
投票

首先打开postgres的docker图像

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

然后你会得到根--docker exec -it <container_name> 它需要数据库连接

root@868594e88b53:/#

0
投票

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

psql postgresql://<username>:<databasepassword>@postgres:5432/<database>
© www.soinside.com 2019 - 2024. All rights reserved.