我花了很长时间才弄清楚如何从 Windows 上的普通 psql 提示符输入容器的数据库。这是由于额外的本地 Windows 安装造成的。
在5432 创建一个没有端口冲突的 Docker 容器 (Linux)
端口参数的结构(docker run和docker-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
关系列表
架构 |姓名 |类型 |本征三聚体
--------+----------------+---------+------------
公共 |测试 |表 | 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 所说的:
强制 psql 在连接到数据库之前提示输入密码。
这个选项不是必须的,因为 psql 会自动提示
如果服务器要求密码验证,则输入密码。然而,
psql 将浪费一次连接尝试,发现服务器想要
密码。在某些情况下,值得输入 -W 以避免额外的
连接尝试。
-W 后面不期望有值,即纯文本密码不跟在-W 后面。相反,它只是表明用户必须输入密码才能连接,从而避免了一次无用的连接尝试。
奇怪的是,在密码提示下,我也可以输入错误的密码或根本没有密码,但仍然进入数据库。