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


当前回答

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

docker exec -it container_id python manage.py dbshell

其他回答

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

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

这个端口设置使用了本地机器可以访问的端口6543(它只需要不同于5432)。就我自己而言,我将DBeaver连接到它。这将防止您的应用程序请求和本地机器请求之间的端口冲突。

起初,我收到一条消息,说端口5432正在使用(由django应用程序),所以我无法通过pgAdmin或DBeaver访问。

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

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

这个对我很有用:

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

我假设您希望每次从外部连接到容器时都能够查看容器中显示的数据。为此,必须在postgres映像上持久化数据。

如果你没有持久化数据,你将不得不重复你第一次所做的一切。 步骤3、5、6、7和8直接回答你的问题。

以下是我在Windows 10 powershell上执行的整个过程的详细概述(Linux和macOS中的命令也是一样的):

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

第二步:下载postgres docker镜像: Docker pull postgres:最新

步骤3:以分离模式启动docker容器,通过创建卷并将其绑定到目标,将数据持久化到postgres映像上 (注:默认5432是默认使用的端口;但是显式地声明它以防止来自诸如pgadmin、dbeaver等客户端的连接错误)。 docker run——name postgress -test -e POSTGRES_PASSWORD=password -p 5432:32 5432 -v postgress -data:/var/lib/postgresql/data -d postgres:最新的

步骤4:检查运行的容器状态 Docker ps a

步骤5:以交互模式进入container_name内部 (注意:像ls, pwd等命令可以在这里执行,如果你在安装过程中检查了linux容器) docker exec -it postgres-test psql

步骤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

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

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