我在服务器上的docker容器中有Postgresql。我如何从外部,也就是从我的本地计算机连接到它?我应该应用什么设置来允许这样做?
当前回答
我设法让它在linux上运行
运行docker postgres -确保端口被发布,我使用alpine是因为它是轻量级的。 docker run——rm -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
其他回答
我知道这有点晚了,如果你像@Martin一样使用docker-compose的话
这些是帮助我连接到容器内psql的代码片段
Docker-compose db bash
root@de9f9358b70:/# psql -h db -U根-d posts_db
我不能评论,因为我没有50的声誉。希望这能有所帮助。
这个对我很有用:
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
如果它是一个django后端应用程序,你可以这样做。
docker exec -it container_id python manage.py dbshell
我假设您希望每次从外部连接到容器时都能够查看容器中显示的数据。为此,必须在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(映射一个端口):
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中运行)。
在这篇文章中详细解释了这一点。
推荐文章
- 如何连接列在Postgres选择?
- 拉访问拒绝存储库不存在或可能需要docker登录
- 如何在ENTRYPOINT数组中使用Docker环境变量?
- Docker:容器不断地重新启动
- Mac/OS X上的/var/lib/docker在哪里
- 如何用docker-compose标记docker图像
- 将varchar字段的类型更改为整数:"不能自动转换为整数类型"
- PostgreSQL可以索引数组列吗?
- 从环境文件中读入环境变量
- PostgreSQL:角色不允许登录
- 如何查找Postgres / PostgreSQL表及其索引的磁盘大小
- 是使用各有一个模式的多个数据库更好,还是使用一个数据库有多个模式更好?
- 禁用特定RUN命令的缓存
- 如果字符串包含
- 从Docker容器获取环境变量