如何从主机连接到Docker的Postgres容器

5

我根据https://docs.docker.com/compose/rails/的指示创建了一个Rails开发环境。

它能够正常工作,但我无法从主机连接到Postgres服务器。我正在运行macOS High Sierra。 当我运行docker container ls时,我看到5432/tcp作为Postgres容器的端口。请注意,5432前面没有列出IP地址。当我运行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?

我做错了什么吗?
3个回答

12

通过查看您的详细信息5432/tcp,我认为您尚未导出端口号5432

如果您已经导出了端口,则它应该像这样。

 0.0.0.0:5432->5432/tcp

然后通过使用主机 IP 地址 (您本地的 mac 机器 IP) 应该能够连接,如果仍然不起作用,请分享您的 Docker 命令 - 您是如何运行容器的?

Docker Compose 文件

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文件中添加ports: - "5432: 5432",然后使用您的机器IP地址,您应该能够连接数据库。


请问您能分享一下运行Postgres容器的Docker命令吗? - Rohan J Mohite
我严格按照 https://docs.docker.com/compose/rails/ 上的指示操作。因此,我通过运行 docker-compose up 来启动容器。这回答了你的问题吗? - Rayhan Muktader
我的疑惑是正确的 - 你没有暴露端口5432 :) 请查看我上面更新的答案,在你的docker-compose文件中添加该端口号。在添加时,请注意正确格式化docker-compose文件(额外的空格)。 - Rohan J Mohite

2
默认情况下,postgres会暴露端口5432。这只会将端口暴露给同一Docker网络中的其他容器--即compose文件中的所有其他容器。这是因为默认情况下,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和socket库,有一种方法可以做到这一点,但不幸的是我没有看到使用psql的方法。
  3. 设置IP表,以便主机可以访问Docker网络。
另一种选择是从Docker网络中的容器访问它。您可以执行docker-compose run --rm db psql -h db -U postgres,这将使用与db容器相同的Docker镜像在同一网络中运行一个临时容器。

0

使用 Docker 实际运行的虚拟机 IP。您可以通过运行以下命令来查找此 IP:

docker-machine ip default

我认为它没有在docker-machine上运行。运行docker-machine ls返回一个空结果集。 - Rayhan Muktader

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接