簡體   English   中英

如何從主機連接到Docker Postgres容器

[英]How to Connect to Docker Postgres Container from Host Machine

我按照https://docs.docker.com/compose/rails/中的說明整理了Rails開發環境

它可以工作,但是我無法從主機連接到Postgres服務器。 我正在運行macOS High Sierra。 當我運行docker container ls我看到5432/tcp作為Postgres容器的端口。 請注意,沒有5543前面列出的IP。運行docker docker network inspect <postgress_container_ID>我將獲得172.18.0.2作為IP。

但是當我運行psql -h 172.18.0.2 -p 5432 -U postgres

xpsql: could not connect to server: Operation timed out
  Is the server running on host "172.18.0.2" and accepting
  TCP/IP connections on port 5432?

我究竟做錯了什么?

通過查看詳細信息5432 / tcp ,在我看來您尚未導出端口號5432

如果您已導出端口,則它應該看起來像。

 0.0.0.0:5432->5432/tcp

然后使用主機IP地址(您的本地Mac機器ip),您應該可以連接,如果仍然無法運行,請共享您的docker命令-您如何運行容器?

Docker撰寫文件

version: '3'
services:
  db:
    image: postgres
    ports:
     - "5432:5432"
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/airbnb
    ports:
      - "3000:3000"
    depends_on:
      - db

在您的docker-compose文件中,您沒有公開端口號5432,因此從外部您將無法連接Postgres DB。

嘗試添加端口:-在docker-compose文件中添加“ 5432:5432” 然后使用您的計算機IP地址,您應該能夠連接數據庫。

默認情況下, postgres公開端口5432 這只會將端口暴露給同一Docker網絡中的其他容器-即撰寫文件中的所有其他容器。 這是因為默認情況下, docker compose會為compose文件中的所有容器創建一個網絡

您可以通過幾種方法從主機連接到容器:

  1. HOST:CONTAINER格式公開端口 ,這將使容器的端口在HOST IP上可用。 例如,使用127.0.0.1:5432以便您可以訪問主機上該地址處的端口。
  2. 使用Docker網絡的網關IP作為接口/源地址。 例如,如果容器為172.18.0.2 ,則網關可能為172.18.0.1 通常有一種使用postgres和套接字庫執行此操作的方法,但是不幸的是,我沒有看到使用psql進行此操作的方法。
  3. 設置IP表,以便您的主機可以訪問Docker網絡。

另一個選擇是從Docker網絡中的容器訪問它。 您可以docker-compose run --rm db psql -h db -U postgres來運行一個一次性容器,該容器具有與db容器相同的Docker映像,並且位於同一網絡中。

使用實際運行Docker的VM的IP。 您可以通過運行以下命令找到該IP:

docker-machine ip default

暫無
暫無

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

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