2016-03-10 103 views
12

我試圖使用Docker容器來運行PostgreSQL服務器,並從我的主機連接它。Postgres 9.1的Docker容器不公開端口5432到主機

我的配置是:

  • 主機:Mac OS X的10.10.5
  • 泊塢窗1.10.1

我已經做到了這一點:

步驟1 :創建永久postgres數據量

docker volume create --name postgres_data 

步驟2:啓動postgres的實例

UPDATE:連接到多克爾實例:如意見提出,我運行容器

docker run --name my_postgres_container -e POSTGRES_PASSWORD=my_password -v postgres_data:/var/lib/postgresql/data -p 5432:5432 -d postgres:9.1 

步驟3時指定端口映射通過這樣做:

docker run -it --link my_postgres_container:postgres --rm postgres:9.1 sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres' 

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

psql -h localhost -p 5432 -U postgres 

就像我在本地主機中安裝Postgres一樣。

問題是端口5432未曝光。所以,我不能用它連接:

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

更新2:即使是陌生人。我也這樣做了:

停止Docker。然後,在我的主機(此處沒有涉及到docker,只是在我的Mac OS X主機上運行postgres,監聽5432端口)上運行普通PostgreSQL 9.4.4實例。一切正常:

sudo lsof -i -P | grep -i "postgres" 

postgres 14100   jorge 6u IPv4 0x780274158cebef01  0t0 TCP localhost:5432 (LISTEN) 

我可以與本地的Postgres實例連接沒有任何問題(看看命令的輸出:是編譯的Mac OS X的Postgres的,我的主機):

psql -h localhost -U postgres -c "select version()" 
                   version 
--------------------------------------------------------------------------------------------------------------------------------------- 
PostgreSQL 9.4.4 on x86_64-apple-darwin14.3.0, compiled by Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn), 64-bit 
(1 row) 

現在有趣的部分。當主機PostgreSQL實例正在運行時,我再次啓動Docker實例,

它開始! (而且不應該)。我甚至可以

docker run -it --link my_postgres_instance:postgres --rm postgres:9.1 sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U postgres' 

連接使用泊塢窗跑......如果我現在運行選擇()版本,它顯示在同一時間的Postgres我的搬運工實例中運行的Postgres在我的主機正在運行,從泊塢窗,使用相同的5432端口。(看看輸出,是postgres爲Debian編譯的,postgres裏面的操作系統:9.1容器)

postgres=# select version(); 
              version 
------------------------------------------------------------------------------------------------ 
PostgreSQL 9.1.20 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit 
(1 row) 

爲什麼?

它有道理嗎?我的最終目標是在另一個Docker容器中運行Django應用程序,並與我的Postgres實例連接。我怎麼能這樣做?

回答

7

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

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

謝謝!我已經做到了。但仍然無法使用psql進行連接。端口5432沒有被暴露,或者我不知道如何連接。我的主機的psql程序工作正常(我可以連接到其他主機,但不能連接到我的容器) – jorgeas80

+0

什麼'docker port '顯示? –

+0

它應該打印出類似'5432/tcp - > 0.0.0.0:5432' –

6

你的碼頭工人主機是虛擬機,它有它自己的IP adddres。 您可以通過輸入以下命令檢測該IP地址:

docker-machine ip 

答案會像192.168.99.100

當您映射使用-p 5432端口:5432交換機,您將能夠使用所提及的IP地址通過開發機器中的任何工具連接到postgres。

2

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

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

+0

已修復,謝謝! – PepeHands

相關問題