我在docker容器中的服务器上安装了Postgresql。如何从外部(即从本地计算机)连接到它?我应采用什么设置来允许?
我在docker容器中的服务器上安装了Postgresql。如何从外部(即从本地计算机)连接到它?我应采用什么设置来允许?
Answers:
您可以通过以下方式运行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中运行)。
在这篇文章中将对其进行详细说明。
ifconfig -u | grep 'inet ' | grep -v 127.0.0.1 | cut -d\ -f2 | head -1
docker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
我设法使其在Linux上运行
运行docker postgres-确保端口已发布,我使用alpine,因为它是轻量级的。
sudo 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
sudo
运行容器。
您还可以通过以下命令通过docker exec命令访问:
$ docker exec -it postgres-container bash
# su postgres
$ psql
要么
$ docker exec -it postgres-container psql -U postgres
su postgres
办?
我已经在主机上运行了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
我在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无法访问。
我试图从本地主机(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
这是我想分享的经验。也许有人可以利用它。
/var/lib/mysql
?
我假设您希望每次从外部连接到容器时都可以查看容器中存在的数据。为此,您必须将数据保留在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
步骤8:select * from test_table
在查询编辑器中输入查询,您应该可以看到输出123
由于某种原因,似乎5432端口受到保护。我将端口配置从更改5432:5432
为5416:5432
,以下命令可以从docker容器外部连接到您的postgres数据库:
psql -h localhost -p 5416 -U <my-user> -d <my-database>
postgres
在主机上运行了该服务,该服务已经绑定到localhost:5432,从而无法使用它。将不同的主机端口映射到容器内的默认端口5432是一个很好的解决方案。或者,您可以在主机上停止postgres服务,但也许它已用于您需要的东西。
docker ps -a
获取容器ID,然后docker exec -it psql -U -W
我知道这很晚了,如果您像@Martin这样使用docker-compose
这些片段帮助我连接到容器内的psql
docker-compose run db bash
root@de96f9358b70:/# psql -h db -U root -d postgres_db
我没有评论,因为我没有50的声望。因此希望对您有所帮助。