如何从主机连接到 Docker Postgres 容器
How to Connect to Docker Postgres Container from Host Machine
我按照以下说明组装了一个 Rails 开发环境
https://docs.docker.com/compose/rails/
它可以工作,但我无法从主机连接到 Postgres 服务器。我是 运行ning 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?
我做错了什么?
使用 Docker 实际上是 运行 的 VM 的 IP。你可以通过运行:
找到这个IP
docker-machine ip default
看你的详细资料5432/tcp,好像你没有导出端口号5432.
如果你有导出端口,那么它应该是这样的。
0.0.0.0:5432->5432/tcp
然后使用 HOST IP 地址(您的本地 mac machine 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 数据库。
尝试在 docker-compose 文件中添加 ports: - "5432:5432"。
然后使用您的 machine IP 地址,您应该能够连接数据库。
默认情况下,postgres exposes port 5432. This will only expose the port to other containers within the same Docker network -- i.e. all the other containers in the compose file. This is because by default, docker compose creates a network 用于撰写文件中的所有容器。
从主机连接到容器有几个选项:
- Expose the port 使用
HOST:CONTAINER
格式,这将使容器的端口在 HOST
IP 上可用。例如,使用 127.0.0.1:5432
以便您可以访问主机上该地址的端口。
- 使用 Docker 网络的网关 IP 作为 interface/source 地址。例如,如果容器是
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 图像,并且在同一网络中。
我按照以下说明组装了一个 Rails 开发环境 https://docs.docker.com/compose/rails/
它可以工作,但我无法从主机连接到 Postgres 服务器。我是 运行ning 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?
我做错了什么?
使用 Docker 实际上是 运行 的 VM 的 IP。你可以通过运行:
找到这个IPdocker-machine ip default
看你的详细资料5432/tcp,好像你没有导出端口号5432.
如果你有导出端口,那么它应该是这样的。
0.0.0.0:5432->5432/tcp
然后使用 HOST IP 地址(您的本地 mac machine 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 数据库。
尝试在 docker-compose 文件中添加 ports: - "5432:5432"。 然后使用您的 machine IP 地址,您应该能够连接数据库。
默认情况下,postgres exposes port 5432. This will only expose the port to other containers within the same Docker network -- i.e. all the other containers in the compose file. This is because by default, docker compose creates a network 用于撰写文件中的所有容器。
从主机连接到容器有几个选项:
- Expose the port 使用
HOST:CONTAINER
格式,这将使容器的端口在HOST
IP 上可用。例如,使用127.0.0.1:5432
以便您可以访问主机上该地址的端口。 - 使用 Docker 网络的网关 IP 作为 interface/source 地址。例如,如果容器是
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 图像,并且在同一网络中。