我在服务器上的docker容器中有Postgresql。我如何从外部,也就是从我的本地计算机连接到它?我应该应用什么设置来允许这样做?
你可以这样运行Postgres(映射一个端口):
docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
现在您已经将容器的端口5432映射到服务器的端口5432。所以现在你的postgres可以从你的public-server-ip:5432中访问
public-server-ip:5432
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,不想允许网络连接,所以我在容器中运行临时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
你也可以通过docker exec命令访问:
$ docker exec -it postgres-container bash # su postgres $ psql
或
$ docker exec -it postgres-container psql -U postgres
如果它是一个django后端应用程序,你可以这样做。
docker exec -it container_id python manage.py dbshell
我设法让它在linux上运行
运行docker postgres -确保端口被发布,我使用alpine是因为它是轻量级的。
docker run --rm -P -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
我尝试从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
这就是我想要分享的经验。也许有人可以利用它。
这里有很好的答案,但是如果您想要postgres数据库管理的一些接口,您可以在本地计算机上安装pgAdmin,并使用其IP和postgres公开端口(默认为5432)连接到远程计算机。
要从本地主机连接,你需要添加'——net host':
docker run --name some-postgres --net host -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
你可以直接访问服务器而不使用exec从你的localhost,通过使用:
psql -h localhost -p 5432 -U postgres
首先打开postgres的docker映像
docker exec -it <container_name>
则你将得到根——root@868594e88b53:/# 它需要数据库连接
root@868594e88b53:/#
psql postgresql://<username>:<databasepassword>@postgres:5432/<database>
我在Docker容器中使用django和postgres。在docker-compose文件中,添加以下内容:
db: image: postgres:10-alpine environment: - POSTGRES_DB=app - POSTGRES_USER=postgres - POSTGRES_PASSWORD=supersecretpassword ports: - "6543:5432"
这个ports设置使用了本地机器可以访问的端口6543(它只需要不同于5432)。就我自己而言,我将DBeaver连接到它。这将防止您的应用程序请求和本地机器请求之间的端口冲突。
ports
6543
5432
起初,我收到一条消息,说端口5432正在使用(由django应用程序),所以我无法通过pgAdmin或DBeaver访问。
由于某种原因,5432端口似乎受到保护。我把我的端口配置从__abc0更改为5416:5432,下面的命令工作到从docker容器外部连接到postgres数据库:
5416:5432
psql -h localhost -p 5416 -U <my-user> -d <my-database>
docker ps -a来获取容器id docker exec -it psql -U -W
docker ps -a
我假设你想要能够查看容器每次中的数据,你从外部连接到它。要做到这一点,你必须在postgres映像上坚持 data。
以下是我在Windows 10 powershell上执行的整个过程的详细概述(Linux和macOS中的命令也是一样的):
步骤1 < em > < / em >:在非管理模式下启动powershell
步骤2 < em > < / em >:下载postgres docker image: docker pull postgres:latest < / p >
docker pull postgres:latest
步骤3 < em > < / em >:以分离模式启动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 < / p >
docker run --name postgres-test -e POSTGRES_PASSWORD=password -p 5432:5432 -v postgres-data:/var/lib/postgresql/data -d postgres:latest
步骤4 < em > < / em >:检查正在运行的容器的状态 docker ps -a < / p >
第5步< em > < / em >:以交互模式进入container_name (请注意: ls, pwd等命令可以在这里执行,如果你在安装过程中检查了linux容器) docker exec -it postgres-test psql -U postgres < / p >
docker exec -it postgres-test psql -U postgres
第6步< em > < / em >:创建示例数据。在这一点上,你可以用以下方式使用psql命令:
psql
# CREATE DATABASE test; # \c test # CREATE TABLE test_table(something int); # INSERT INTO test_table VALUES (123); # SELECT * FROM test_table; # \q
第7步< em > < / em >:打开一个数据库客户端应用程序,如pgadmin或dbeaver,并在连接字段中输入以下内容:
pgadmin
dbeaver
Host: localhost Database: test User: postgres Password: password
< em >步骤8 < / em >:在查询编辑器中输入查询select * from test_table,您应该能够看到输出123
select * from test_table
123
我知道这有点晚了,如果你像@Martin一样使用docker-compose的话
这些是帮助我连接到容器内psql的代码片段
docker-compose run db bash
root@de96f9358b70:/# psql -h db -U root -d postgres_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
在构建我的网关微服务应用程序后,我也遇到了同样的问题。无法从Heidisql连接到竞争化postgresql。
在这一刻,我已经解决了它简单地指定postgresql密码docker-compose。Yml和端口。
所以你应该找到并打开docker-compose.yml。然后您应该输入POSTGRES_PASSWORD(不要让它为空),并指定端口“5432:5432”
链接参考和截图帖子
连接到运行postgres的本地容器
postgres
brew search postgres
brew install postgresql
2.
docker run --name postgres -e POSTGRES_DB=users \ -e POSTGRES_USER=john \ -e POSTGRES_PASSWORD=password \ -p 5432:5432 -d postgres
psql --host=localhost --username=john --dbname=users