簡體   English   中英

從 Windows Docker 主機連接到 dockerized postgres

[英]Connect to dockerized postgres from Windows Docker host

我的設置是 Docker for Windows(版本 18.09.2)在安裝了 postgres(不是數據庫,只有命令行工具)的 Windows 10 Pro 機器上。

我從 docker 中心運行官方 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>

請參閱從外部連接到 docker 容器中的 Postgresql <host_port>是您可以在 Windows 上找到的用於連接容器端口的端口。 這里似乎需要的核心技巧是避免同一線程的另一個答案中的端口沖突。

如果您使用5432:5432 ,這可能會與 Windows 上使用端口5432作為標准的 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,在簡單測試階段,除了您輸入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(); CREATE TABLE db=# \dt 列出關系模式 | 名稱 | 類型 | Eigent³mer --------+----------------+--------+------------ public | 測試 | 表格 | 分貝 (1 Zeile)

在 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 文檔所說的那樣:

強制 psql 在連接到數據庫之前提示輸入密碼。

這個選項從來都不是必需的,因為如果服務器要求密碼驗證,psql 會自動提示輸入密碼。 然而,psql 將浪費一次連接嘗試來發現服務器需要密碼。 在某些情況下,值得鍵入 -W 以避免額外的連接嘗試。

-W不期望它后面有值,即明文密碼不跟在-W之后。 相反,它只是表明用戶必須輸入密碼才能連接,這避免了一次無用的連接嘗試。

奇怪的是,在提示密碼時,我也可以輸入錯誤的密碼或根本不輸入密碼,但仍會進入數據庫。

要從主機連接到容器,必須將端口發布到主機。 這是使用端口發布和-p選項完成的:

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

注意-p選項。 現在,當您嘗試連接到本地主機上的端口5432時,流量將被重定向到容器的端口5432

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM