我把Postgresql放在一个docker容器的服务器上。我怎样才能从外部,也就是从我的本地计算机连接到它?我应该应用什么设置来允许这样做?
从外部连接到docker容器中的Postgresql
你可以这样运行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
(password 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中运行)。
In this post它被详细地阐述了。
lvthillo
:
@Tjorriemorrie 你确定你的postgres运行在你的本地机器上?也许可以试试127.0.0.1而不是localhost,但对于我来说,它正在工作。
Paul
:
获取你的公共IP地址(osx)。【替换代码0
rg88
:
在我发现的所有与postgres/docker有关的帖子中,这是最有用的一个。谢谢你。
lvthillo
:
@GarouDan 如果你不想映射一个端口,但仍然想从你的主机上访问postgres容器,你需要像这样在主机网络上部署你的容器。【替换代码0
exiting psql works with \q (just for the newbies like me)
Thomas Ducrot
发布于
2019-08-30
0
人赞同
我设法让它在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用户,用pgcli代替psql
PabTorre
:
很高兴有人回答了如何在不跳入容器的情况下进行连接,谢谢。
你真的不应该使用
sudo
来运行你的容器。
SuperNova
发布于
2019-08-30
0
人赞同
你也可以通过docker exec命令访问。
$ docker exec -it postgres-container bash
# su postgres
$ psql
$ docker exec -it postgres-container psql -U postgres
omeraiman
发布于
2019-08-30
0
人赞同
我在Docker容器中使用django与postgres。在docker-compose文件中,添加以下内容。
image: postgres:10-alpine
environment:
- POSTGRES_DB=app
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=supersecretpassword
ports:
- "6543:5432"
这个
ports
设置使用你的本地机器可以访问的端口
6543
(它只需要与
5432
不同)。对于我自己来说,我把DBeaver连接到它。这将防止你的应用程序请求和本地机器请求之间的端口冲突。
起初,我收到一条信息,说5432端口正在使用(这是django应用程序),所以我不能用pgAdmin或DBeaver访问。
我发现这是最有帮助的。对于使用docker-compose的人来说,这似乎是最好的方法。
我可以确认这一点,还有这个看似奇怪的设置,即为主机使用一个与标准不同的端口号,而标准的
5432
可以进一步用于容器,没有任何危害。我有一个Windows PostgreSQL的安装,它占用了到达Docker主机所需的
5432
端口,见
从Windows Docker主机连接到dockerized postgres?
.
然后你用哪个IP来连接?
Xevion
:
这对我来说是有效的。5432端口没有工作。不知道为什么,因为这个端口在我的电脑上显然没有被占用或排除,但可惜的是,把它切换到我挑选的一个随机端口,最终成为我的解决方案。
有点令人惊讶的是,当映射到已连接的主机端口时,docker镜像可以被构建和运行;这实际上意味着主机不能连接到postgres镜像。
user9652688
发布于
2019-08-30
0
人赞同
我假设你希望能够查看你的容器中存在的数据
everytime
你从外面连接到它。要做到这一点,你将不得不
persist
postgres图像上的数据。
如果你没有持久的数据,你将不得不重复你第一次做的一切。
步骤3、5、6、7和8
直接回答你的问题。
以下是我在Windows 10 powershell上遵循的整个过程的详细概述(Linux和macOS中的命令也是一样的)。
Step 1
:在非管理员模式下启动powershell
Step 2
:下载postgres docker镜像。
docker pull postgres:latest
Step 3
:在分离模式下启动docker容器,通过创建一个卷并将其绑定到一个目的地,在postgres镜像上持久保存数据。
(
Note
: 默认情况下,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
Step 4
:检查运行中的容器的状态
docker ps -a
Step 5
:在交互式模式下进入container_name内部
(
Note
: 如果你在安装过程中检查了linux容器,可以在这里执行ls、pwd等命令)
docker exec -it postgres-test psql -U postgres
Step 6
:创建样本数据。这时,你可以按以下方式玩弄
psql
的命令。
# CREATE DATABASE test;
# \c test
# CREATE TABLE test_table(something int);
# INSERT INTO test_table VALUES (123);
# SELECT * FROM test_table;
Step 7:打开一个数据库客户端应用程序,如pgadmin
或dbeaver
,在连接字段中输入以下内容。
Host: localhost
Database: test
User: postgres
Password: password
Step 8:在查询编辑器中输入查询select * from test_table
,你应该能够看到输出123
。
我完全按照这个方法做了,但是当我在dbeaver中输入细节时,它说测试数据库不存在。
Rishabh Anand
发布于
2019-08-30
0
人赞同
我知道这很晚了,如果你像@Martin那样使用docker-compose
这些是帮助我在容器内连接到psql的片段
docker-compose run db bash
root@de96f9358b70:/# psql -h db -U root -d postgres_db
我不能发表评论,因为我没有50个名誉。所以希望这对你有帮助。
avizzzy
:
奥普想从外面连接。
@avizzzy 这只是Ashutosh Gupta所说的一个替代方案
stackoverflow.com/a/54865728/10422291
我也应该在那里发表评论。我并不关心,但在生活中应该保持一致,对吗?
@RishabhAnand 好吧,从现在开始,你将是:)
Eugene
发布于
2019-08-30
0
人赞同
我已经在主机上运行了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
framp
:
如果你想创建一个单一的默认数据库,你也可以添加。 替换代码0】来创建my-db而不是postgres。
Marc Perrin-Pelletier
发布于
2019-08-30
0
人赞同
由于某些原因,5432端口似乎受到保护。我把我的端口配置从
5432:5432
改为
5416:5432
,下面的命令起作用了
从docker容器外连接到你的postgres数据库
:
psql -h localhost -p 5416 -U <my-user> -d <my-database>
user2627846
发布于
2019-08-30
0
人赞同
要从localhost连接,你需要添加'--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
cora
发布于
2019-08-30
0
人赞同
连接到运行
postgres
的本地容器
Install
psql
brew search postgres
brew install postgresql
docker run --name postgres -e POSTGRES_DB=users \
-e POSTGRES_USER=john \
-e POSTGRES_PASSWORD=password \
-p 5432:5432 -d postgres
Martin
发布于
2019-08-30
0
人赞同
我试图从localhost(mac)连接到postgres容器。我把docker-compose文件中的端口从5432改为3306,然后启动容器。不知道我为什么这么做 :|
然后我试图通过PSequel和adminer连接到postgres,结果连接无法建立。
切换回5432端口后,一切正常。
image: postgres
ports:
- 5432:5432
restart: always
volumes:
- "db_sql:/var/lib/mysql"
environment:
POSTGRES_USER: root
POSTGRES_PASSWORD: password
POSTGRES_DB: postgres_db
这是我的经验,我想分享。也许有人可以利用它。
Volume path:
/var/lib/mysql
?
Davos
:
5432是Postgres的默认端口。3306是MySQL的默认端口。如果你在docker-compose中改变了发布的端口,那么你试图使用的任何客户端工具也将默认为试图连接到5432端口,除非你告诉他们使用其他端口。
ashutosh gupta
发布于
2019-08-30
0
人赞同
首先打开postgres的docker镜像
docker exec -it <container_name>
然后你会得到根 --root@868594e88b53:/#
。
它需要数据库连接
psql postgresql://<username>:<databasepassword>@postgres:5432/<database>
Joel Mata
发布于
2019-08-30
0
人赞同
This one worked for me:
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
SuperNova
发布于
2019-08-30
0
人赞同
如果是django的后端应用,你可以这样做。
docker exec -it container_id python manage.py dbshell
yuriyni.com
发布于
2019-08-30
0
人赞同
在建立我的网关-微服务应用程序后,我遇到了同样的问题。不能从Heidisql连接到Contenerized postgresql。
目前,我已经通过简单地在docker-compose.yml中指定postgresql密码和端口来解决了这个问题。
所以你应该找到并打开docker-compose.yml。然后你应该输入POSTGRES_PASSWORD(不要让它为空),并指定端口 "5432:5432"
microservice33-postgresql。
- POSTGRES_USER=microservice33
- POSTGRES_PASSWORD=wwww
- POSTGRES_HOST_AUTH_METHOD=trust
- 5432:5432
参考链接和截图
post