簡體   English   中英

Postgres 9.1 的 Docker 容器未將端口 5432 暴露給主機

[英]Docker container for Postgres 9.1 not exposing port 5432 to host

我正在嘗試使用 Docker 容器來運行 PostgreSQL 服務器,並從我的主機與其連接。

我的配置是:

  • 主機:Mac OS X 10.10.5<\/li>
  • 碼頭工人 1.10.1<\/li><\/ul>

    我已經這樣做了:

    第 1 步<\/strong>:為永久 postgres 數據創建一個卷

    第 2 步<\/strong>:啟動 postgres 實例

    更新<\/strong>:正如評論中所建議的,我在運行容器時指定了端口映射

    第 3 步<\/strong>:通過執行以下操作連接到 Docker 實例:

    但我想通過以下方式連接到該實例:

    就像我在我的主機上本地安裝了 Postgres 一樣。

    問題是端口 5432 沒有暴露<\/strong>。 所以,我無法連接它:

    sudo lsof -i -P | grep -i "listen"<\/code> --> 沒有打開 5432 端口

    更新2<\/strong> :甚至更陌生。 我也這樣做了:

    停止 Docker。 然后,在我的主機上<\/strong>運行一個普通的 PostgreSQL 9.4.4 實例(這里不涉及 docker,只是在我的 Mac OS X 主機上運行 postgres,監聽端口 5432)。 一切正常:

    我可以毫無問題地連接我的本地 postgres 實例(查看命令的輸出:是為我的主機 Mac OS X 編譯的 postgres):

    現在有趣的部分。 我再次啟動我的 Docker 實例,同時主機 PostgreSQL 實例正在運行。<\/strong>

    開始! (它不應該)。 我什至可以使用 docker run 連接...

    如果我現在運行 select version(),它會顯示 postgres 在我的 docker 實例中運行,同時 postgres 在我的主機中運行,在 docker 之外,使用相同的 5432 端口<\/strong>。  (看看輸出,是為 Debian 編譯的 postgres,postgres:9.1 容器內的操作系統)

    為什么?

    是否有意義? 我的最終目標是在另一個 Docker 容器中運行 Django 應用程序並連接到我的 Postgres 實例<\/strong>。 我怎么能那樣做?

現在是 2018 年,我剛剛遇到了類似的問題。 對我來說,解決方案似乎與 docker 的道具順序有關。 例如,這導致沒有暴露端口;

docker run -d --name posttest postgres:alpine -e POSTGRES_PASSWORD=fred -p 5432:5432

雖然這工作正常(圖像按預期暴露端口 5432);

docker run --name posttest -d -p 5432:5432 -e POSTGRES_PASSWORD=fred postgres:alpine

您的 docker 主機是一個虛擬機,它有自己的 IP 地址。 您可以通過輸入以下命令來檢測此 IP 地址:

docker-machine ip

答案將類似於192.168.99.100

當您使用 -p 5432:5432 開關映射端口后,您將能夠使用提到的 IP 地址使用開發機器上的任何工具連接到 postgres。

使用-p <host_port>:<container_port>運行具有正確端口映射的 postgre 映像:

docker run --same-options-as-step-one -d -p 5432:5432 postgres:9.1

我能夠使用容器 IP 或主機 IP 進行連接,除了 localhost (127.0.0.1)。

獲取容器 ID 運行

docker ps

查找所需的容器 ID 並運行

docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_id>

端口必須暴露。

這是 docker-compose.yml 的示例,它啟動了兩個容器 postgres 和 adminer,這是您可以用來連接到 postgres 的數據庫管理工具:

version: '3'
services:
  adminer:
    image: adminer
    restart: always
    ports:
      - 8080:8080
  postgres:
    image: postgres:11.4-alpine
    restart: always
    ports:
      - "5432:5432"
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres

我有一個類似的問題。 我的問題只是 0.0.0.0 沒有映射到 localhost 所以我只需要添加到 psql

psql --host=0.0.0.0

這是假設

docker port <container name>

產出

5432/tcp -> 0.0.0.0:5432

我在使用 Lubuntu 的 VMWare 虛擬機中工作時遇到了類似的問題。 VM 已暫停,然后重新啟動。 PostgreSQL Docker 容器已正確映射並在 localhost:5432 上偵聽,但我總是得到:

psql: server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.

在我的情況下,重新啟動 VM 解決了問題。

其他答案有效,但沒有解釋它們為什么有效。

鑒於命令:

psql -h localhost -p 5432:5432 -U postgres

localhost實際上是一個特殊值,它告訴 psql 查找 unix 套接字連接,而不是通過 TCP。 我們不能使用 unix 套接字連接到 docker 服務。

像這樣更改命令可以修復它,通過強制 TCP:

psql -h 127.0.0.1 -p 5432:5432 -U postgres

只要您docker run ... -p 5432:5432 ...這就會起作用。 指定docker-machine ip返回的docker-machine ip也會強制使用 TCP,因此這也有效。

試試這個來安裝 postgresql

 docker run --name postgres -d -p 5432:5432 -e POSTGRES_PASSWORD=fred postgres:alpine

暫無
暫無

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

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