我在一个Docker容器的服务器上安装了PostgreSQL。如何从外部,也就是我的本地计算机连接到它?需要应用哪些设置来允许连接?
我在一个Docker容器的服务器上安装了PostgreSQL。如何从外部,也就是我的本地计算机连接到它?需要应用哪些设置来允许连接?
您可以通过以下方式运行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。
测试方法: 运行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
- Pauldocker run --net=host --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
- lvthillo我成功在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。sudo
命令来运行你的容器。 - Russ Bateman您也可以通过执行docker exec命令来访问,方法如下:
$ docker exec -it postgres-container bash
# su postgres
$ psql
或者$ docker exec -it postgres-container psql -U postgres
su postgres
是什么意思? - Brenosu postgres
的意思是:切换用户到postgres用户。 - vab2048su postgres
后使用 psql
命令。 - Jagruti我正在使用Docker容器中的Django和PostgreSQL。在docker-compose文件中,添加以下内容:
db:
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进行访问。
5432
端口号可以在容器中继续使用而不会有任何影响。我曾经安装了一个Windows版的PostgreSQL,它占用了需要连接到Docker主机的5432
端口号,请参见从Windows Docker主机连接到dockerized postgres?。 - questionto42我知道这有点晚了,如果你像@Martin一样使用docker-compose:
这些片段可以帮助我连接到容器内的psql
docker-compose run db bash
root@de96f9358b70:/# psql -h db -U root -d postgres_db
由于我没有50个声望,所以无法发表评论。希望这能帮到你。
我假设您希望能够在从外部连接到容器时查看其中的数据。要实现这一点,您需要在 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
第四步:检查正在运行的容器的状态
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
第七步:打开一个数据库客户端应用程序,如pgadmin或dbeaver,并在连接字段中输入以下内容:
Host: localhost
Database: test
User: postgres
Password: password
第八步:输入查询
SELECT * FROM test_table
在查询编辑器中,您应该能够看到输出123
。
我已经在主机上运行了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。 - framp由于某种原因,5432端口似乎受到了保护。我将我的端口配置从5432:5432
更改为5416:5432
,并使用以下命令成功地连接到您的postgres数据库以访问其docker容器外部的内容:
psql -h localhost -p 5416 -U <my-user> -d <my-database>
postgres
服务,它已经绑定到了localhost:5432端口,这将阻止你使用它。在容器中将不同的主机端口映射到默认端口5432是一个不错的解决方案;或者你可以停止主机上的postgres服务,但也许它正在被你需要的其他东西使用。 - Davospostgres
。
安装 psql
brew search postgres
brew install postgresql
启动 Docker
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
要从本地主机连接,您需要添加“--net host”:
docker run --name some-postgres --net host -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
您可以通过以下方式直接从本地访问服务器,无需使用exec:
psql -h localhost -p 5432 -U postgres