gpt4 book ai didi

windows - 从 Windows Docker 主机连接到 dockerized postgres

转载 作者:行者123 更新时间:2023-12-04 17:35:09 27 4
gpt4 key购买 nike

我的设置是在安装了 postgres(不是数据库,只有命令行工具)的 Windows 10 Pro 机器上的 Docker for Windows(版本 18.09.2)。

我使用 docker hub 运行官方 postgres 图像

docker run -it -v D:/postgres:/home/dump --name some_postgres -e POSTGRES_PASSWORD=root -d postgres

之后我可以通过

连接
docker exec -it <docker-id> bash

然后运行

psql -U postgres

一切正常。现在我想从我的主机连接。我叫

psql -h <local-ip> -U postgres

得到了

psql: could not connect to server: Connection refused (0x0000274D/10061)
Is the server running on host "192.168.116.74" and accepting
TCP/IP connections on port 5432?

我很确定,可以访问数据库。因为如果我更改我收到的 IP

psql: could not connect to server: Connection timed out (0x0000274C/10060)
Is the server running on host "192.168.116.11" and accepting
TCP/IP connections on port 5432?

有人知道我该如何解决这个问题吗?或者我做错了什么?

最佳答案

我花了很长时间才弄清楚如何从 Windows 上的普通 psql 提示符进入容器的数据库。这是由于额外的本地 Windows 安装。


5432 创建一个没有端口冲突的 Docker 容器 (Linux)

端口参数的结构(在docker rundocker-compose 中)是:

<docker_host_port_on_linux>:<docker_container_port_on_linux>

参见 Connecting to Postgresql in a docker container from outside . <host_port>是您可以在 Windows 上找到的用于连接容器端口的端口。这里似乎需要的核心技巧是避免 another answer of the same thread 中的端口冲突。 .

如果你取5432:5432 , 这可能与使用端口 5432 的 Windows 上的 postgres 本地安装冲突作为标准。您可以通过打开 psql、使用菜单登录(在标准测试阶段,您可能只需要在任何菜单点按 Enter)然后使用 \l 打印所有可用数据库来了解此类冲突。 .如果这些是您本地 Windows 安装的数据库,您知道在使用 docker 时必须使用另一个端口。

如果端口之间存在冲突,则为 Docker 主机使用新端口,或者带参数

-p 5433:5432

或者当使用 docker-compose 时,文件需要有:

ports:
- "5433:5432"

是否开始于-d无关紧要是否分离模式:

`docker-compose up -d`

或:

`docker-compose up`

对于后者,您将直接在容器日志中看到每个更改。

检查您的容器是否已启动:

docker ps -a

如果没有启动,则从:

开始
docker container start CONTAINER_NAME

容器PORTS属性将如下所示:

0.0.0.0:5433->5432/tcp, :::5433->5432/tcp

这意味着:容器使用端口 5433对于 Docker 主机 (Linux),它可以在端口 5432 找到 Docker 容器 (Linux) .

在Windows上使用psql连接到Docker容器

在此之后,您可以在 Windows 上打开 psql,在简单的测试阶段,您通常只需要为每个菜单点按 enter,除了您输入 5433 的端口。连接到 Docker 主机 (Linux):

Server [localhost]:
Database [postgres]:
Port [5432]: 5433
Username [postgres]:
Passwort für Benutzer postgres:
psql (13.3, Server 10.3)
Warnung: Konsolencodeseite (850) unterscheidet sich von der Windows-
Codeseite (1252). 8-Bit-Zeichen funktionieren möglicherweise nicht
richtig. Einzelheiten finden Sie auf der psql-Handbuchseite unter
»Notes for Windows users«.
Geben Sie »help« für Hilfe ein.

postgres=#

然后您将进入 postgres shell 和 \l将显示您在容器的 postgres 中而不是在 Windows postgres 中,因为它将具有容器的数据库。在我的例子中,我添加了带有 docker-compose 文件的数据库 db,它是:

postgres=# \l
Liste der Datenbanken
Name | Eigent³mer | Kodierung | Sortierfolge | Zeichentyp | Zugriffsprivilegien
-----------+------------+-----------+--------------+------------+-----------------------
db | 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 +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 Zeilen)

虽然我在 Windows 本地 PostgreSQL 安装上有不同的数据库。

例如,您现在可以连接到 db数据库:

\c db

创建一个空表:

CREATE TABLE "test" (

);

并显示表格:

\dt

db=#创建表test();创建表db=#\dt关系 list 模式 |名称 |类型 |本征三聚体------+----------------+--------+------------公开 |测试 |表格 | D b(1 泽尔)

在Linux容器上使用psql检查新表

同时,该表将在容器中可用,因为您现在已经从外部更改了容器。在 WSL 的普通 Linux 终端中,运行:

docker exec -it CONTAINER_ID_OR_NAME psql -U postgres -W -d db

这导致:

Password for user postgres:
psql (10.3)
Type "help" for help.

db=# \dt
List of relations
Schema | Name | Type | Owner
--------+----------------+-------+----------
public | test | table | postgres
(1 row)

关于 -W 的旁注

顺便说一句,使用-W似乎被推荐为 PostgreSQL docs说说:

Force psql to prompt for a password before connecting to a database.

This option is never essential, since psql will automatically promptfor a password if the server demands password authentication. However,psql will waste a connection attempt finding out that the server wantsa password. In some cases it is worth typing -W to avoid the extraconnection attempt.

-W不期望它后面有值,即明文密码不跟在-W后面.相反,它只是表明用户必须输入密码才能连接,这避免了一次无用的连接尝试。

奇怪的是,在提示密码时,我也可以输入错误的密码或根本不输入密码,但仍会进入数据库。

关于windows - 从 Windows Docker 主机连接到 dockerized postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56993263/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com