如何在Mac上连接到运行在Docker (1.12.0)容器中的Postgres服务器?

3
最新的Docker版本不再使用虚拟机,而是使用一个虚拟化管理程序来连接容器。这意味着我不能再使用psql登录到postgres数据库了。
  postgres git:(master)  docker run -d -p 5433:5432 db postgres
<sha>
  postgres git:(master)  docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
111f3bed4c52        db                  "/docker-entrypoint.s"   17 minutes ago      Up 17 minutes       0.0.0.0:5433->5432/tcp   zen_hugle
  postgres git:(master)  psql -p 5433 -U postgres
psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/tmp/.s.PGSQL.5433"?

我也尝试将localhost指定为主机,但结果很奇怪:
➜  postgres git:(master) ✗ psql -h localhost -p 5433 -U postgres
psql: %

有人知道在这种情况下该怎么办吗?谢谢。


1
请注意,它确实使用了虚拟机,但不是VirtualBox,而是在Mac上使用xhyve虚拟机,但对于网络连接使用了Unix套接字。如果您需要“本地”模型(例如更接近生产系统),最好使用传统的虚拟机环境。 - ldg
我假设在你的运行语句中应该是 docker run -d -p 5433:5432 --name=db postgres - ldg
2个回答

1
使用以下命令:
docker run -d -p 5433:5432 db postgres

你正在将docker的5432端口导出到docker-engine的5433端口,而不是主机的5433端口。
使用以下命令获取你的docker-machine的IP地址(假设你的docker vm名称为"default"):
docker-machine env default

这应该会给你类似以下行的结果。
> export DOCKER_TLS_VERIFY="1"
> export DOCKER_HOST="tcp://192.168.99.100:2376"
> export DOCKER_CERT_PATH="/Users/<your-user>/.docker/machine/machines/default"
> export DOCKER_MACHINE_NAME="default"

使用docker-machine的IP地址连接运行在容器中的Postgres。
>psql -h 192.168.99.100 -p 5433 -U postgres

psql (9.5.0, server 9.5.5)
Type "help" for help.

postgres=#

它对我来说完美地运行了。谢谢!我使用了错误的IP地址。 - Jacopo Lanzoni

0

你可以通过使用IP连接tcp,例如:psql -h 0.0.0.0 -p 5433 -U postgres(或127.0.0.1等)。

使用默认值或“localhost”将尝试使用本地域套接字(虽然Docker的版本不会改变此行为,但通常需要通过tcp连接到容器化的数据库)。


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