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


Answers:


313

您可以通过以下方式运行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

转到您的本地主机(那里有一些工具或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中运行)。

这篇文章中将对其进行详细说明。


1
@Tjorriemorrie您确定您的postgres在本地计算机上运行吗?也许尝试使用127.0.0.1而不是localhost,但可以满足要求。
lvthillo

2
获取您的公共IP地址(osx):ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
Paul

4
在所有各种与postgres / docker相关的文章中,我发现这是最有用的文章之一。谢谢。
rg88

1
@GarouDan如果您不想映射端口,但仍想从主机访问postgres容器,则需要将容器部署在主机网络上,如下所示:docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
lvthillo

1
退出psql与\ q一起使用(仅适用于像我这样的新手)
Dirk Schumacher

39

我设法使其在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


7
很高兴有人回答了如何连接而不跳入容器。thnx。
PabTorre

1
您确实不应该使用sudo运行容器。
罗斯·贝特曼

28

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

$ docker exec -it postgres-container bash

# su postgres

$ psql

要么

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

3
psql -U postgres
Maryna Krasnova

这是一个非常有用的评论
Dan Rosenstark,

怎么su postgres办?
布雷诺

14

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

13

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


1
我发现这是最有帮助的。对于使用docker-compose的人来说,这似乎是最好的方法。
David Frick

谢谢大卫,祝您编程愉快!
omeraiman

9

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

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

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


3
卷路径:/var/lib/mysql
David Tabernero M.19年

5432是Postgres的默认端口。3306是MySQL的默认端口。如果您在docker-compose中更改了已发布的端口,那么除非您告诉他们使用其他端口,否则您尝试用来连接的任何客户端工具也将默认尝试连接到端口5432。
达沃斯

6

我假设您希望每次从外部连接到容器时都可以查看容器中存在的数据。为此,您必须将数据保留在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:打开数据库客户端应用程序(例如pgadmin或),dbeaver然后在连接字段中输入以下内容:

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

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


5

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

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

它对我有用,但我在Internet上找不到解释。找到了吗
negas

2
@negas您可能已经postgres在主机上运行了该服务,该服务已经绑定到localhost:5432,从而无法使用它。将不同的主机端口映射到容器内的默认端口5432是一个很好的解决方案。或者,您可以在主机上停止postgres服务,但也许它已用于您需要的东西。
达沃斯

5

首先打开postgres的docker镜像

docker exec -it <container_name>

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

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

1

如果是django后端应用程序,则可以执行以下操作。

docker exec -it container_id python manage.py dbshell

1

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



-1

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

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

docker-compose run db bash

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

我没有评论,因为我没有50的声望。因此希望对您有所帮助。


Op希望从外部进行连接。
avizzzy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.