>我按照以下说明将 Rails 开发环境放在一起 https://docs.docker.com/compose/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?
我做错了什么?
通过查看您的详细信息5432/tcp,在我看来,您尚未导出端口号5432。
如果您已导出端口,则它应该看起来像。
0.0.0.0:5432->5432/tcp
然后通过使用主机 IP 地址(您的本地 mac 机器 IP),您应该能够连接,如果仍然不起作用,请分享您的 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 撰写文件中添加端口:"5432:5432"。然后通过使用您的计算机 IP 地址,您应该能够连接数据库。
默认情况下,postgres 公开端口 5432。这只会将端口暴露给同一 Docker 网络中的其他容器 - 即撰写文件中的所有其他容器。这是因为默认情况下,docker 撰写会为撰写文件中的所有容器创建一个网络。
有几个选项可用于从主机连接到容器:
- 使用
HOST:CONTAINER
格式公开端口,这将使容器的端口在HOST
IP 上可用。例如,使用127.0.0.1:5432
,以便可以访问主机上该地址的端口。 - 使用 Docker 网络的网关 IP 作为接口/源地址。例如,如果容器
172.18.0.2
,则网关很可能172.18.0.1
。通常有一种方法可以使用 postgres 和套接字库来做到这一点,但不幸的是,我没有看到使用psql
的方法。 - 设置 IP 表,以便您的主机可以访问 Docker 网络。
另一种选择是从 Docker 网络中的容器访问它。您可以执行docker-compose run --rm db psql -h db -U postgres
,这将在同一网络中运行与db
容器具有相同 Docker 映像的一次性容器。
使用 Docker 实际运行的虚拟机的 IP。您可以通过运行以下命令找到此 IP:
docker-machine ip default