我在 docker 容器中的服务器上有 Postgresql。如何从外部(即本地计算机)连接到它?我应该应用什么设置来允许它?
16 回答
你可以这样运行 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 中运行)。
在这篇文章中,它进行了详细的解释。
我设法让它在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
您还可以通过 docker exec 命令访问:
$ docker exec -it postgres-container bash
# su postgres
$ psql
或者
$ docker exec -it postgres-container psql -U postgres
我在 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 连接到它。这将防止您的应用程序请求和本地计算机请求之间的端口冲突。
起初,我收到一条消息说端口 5432 正在使用中(由 django 应用程序使用),所以我无法通过 pgAdmin 或 DBeaver 访问。
我假设您希望能够在每次从外部连接到容器时查看容器中存在的数据。为此,您必须在 postgres 图像上保留数据。
如果您没有持久数据,您将不得不重复第一次所做的一切。
步骤 3、5、6、7 和 8直接回答您的问题。
以下是我在 Windows 10 powershell 上遵循的整个过程的详细概述(Linux 和 macOS 中的命令也相同):
第 1 步:以非管理员模式启动 powershell
第 2 步:下载 postgres docker 镜像:
docker pull postgres:latest
第 3 步:以分离模式启动 docker 容器,并通过创建卷并将其绑定到目标
(注意:默认情况下 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
ordbeaver
并在连接字段中输入以下内容:
Host: localhost
Database: test
User: postgres
Password: password
第 8 步: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
我知道这已经晚了,如果你像@Martin 一样使用 docker-compose
这些是帮助我连接到容器内的 psql 的片段
docker-compose run db bash
root@de96f9358b70:/# psql -h db -U root -d postgres_db
我无法发表评论,因为我没有 50 声望。所以希望这会有所帮助。
由于某种原因,5432 端口似乎受到保护。我将端口配置从5432:5432
to更改为5416:5432
,以下命令可以从其 docker 容器外部连接到您的 postgres 数据库:
psql -h localhost -p 5416 -U <my-user> -d <my-database>
要从 localhost 进行连接,您需要添加“--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
我试图从 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 的 docker 镜像
docker exec -it <container_name>
然后你会得到根——root@868594e88b53:/#
它需要数据库连接
psql postgresql://<username>:<databasepassword>@postgres:5432/<database>
如果它是一个 django 后端应用程序,你可以这样做。
docker exec -it container_id python manage.py dbshell
这个对我有用:
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
这里有很好的答案,但是如果您希望有一些用于 postgres 数据库管理的界面,您可以在本地计算机上安装 pgAdmin,并使用其 IP 和 postgres 公开端口(默认为 5432)连接到远程计算机。
在构建我的网关微服务应用程序后,我遇到了同样的问题。无法从 Heidisql 连接到竞争性 postgresql。
目前我已经通过简单地为 docker-compose.yml 以及端口指定 postgresql 密码来解决它。
所以你应该找到并打开 docker-compose.yml。然后你应该输入POSTGRES_PASSWORD(不要让它为空),并指定端口“5432:5432”</p>
服务:microservice33-postgresql:环境:- POSTGRES_USER=microservice33 - POSTGRES_PASSWORD=wwww - POSTGRES_HOST_AUTH_METHOD=trust 端口:- 5432:5432
参考链接和截图帖子
docker ps -a
获取容器 ID 然后 docker exec -it psql -U -W