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

时间:2018-01-22 16:10:27

标签: postgresql docker rails-postgresql remote-connection

我按照以下说明将Rails dev环境放在一起 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?

我做错了什么?

3 个答案:

答案 0 :(得分:3)

通过查看您的详细信息 5432 / tcp ,在我看来,您还没有导出端口号 5432

如果你有导出端口,那么它应该是。

let tmpl = document.createElement('template');
tmpl.innerHTML =`<style>
div {
   color: green;
   display: inline;
   margin: 3px;
}

p {
   border: 1px solid black;
}
</style>

<p>
Hello my name is:
<div>Web</div>
<div>Component</div>
</p>`;
this.shadowRoot.appendChild(tmpl.content.cloneNode(true));

然后通过使用HOST IP地址(你的本地mac机器ip)你应该可以连接,如果仍然无法工作,请分享你的docker命令 - 你如何运行容器?

Docker撰写文件

 0.0.0.0:5432->5432/tcp

在您的docker-compose文件中,您没有公开端口号5432,因此从外部您无法连接Postgres DB。

尝试在docker-compose文件中添加端口: - &#34; 5432:5432&#34; 。 然后通过使用您的机器IP地址,您应该能够连接数据库。

答案 1 :(得分:1)

默认情况下,postgres exposes port 5432。这只会将端口暴露给同一个Docker网络中的其他容器 - 即compose文件中的所有其他容器。这是因为默认情况下,docker compose creates a network表示撰写文件中的所有容器。

您可以从主机连接到容器有几个选项:

    具有HOST:CONTAINER格式的
  1. Expose the port将使HOST IP上的容器端口可用。例如,使用127.0.0.1:5432,以便您可以访问主机上该地址的端口。
  2. 使用Docker网络的网关IP作为接口/源地址。例如,如果容器为172.18.0.2,则网关可能为172.18.0.1。通常有一种方法可以使用postgres和socket库来实现这一点,但遗憾的是我无法通过psql找到一种方法。
  3. 设置IP表,以便主机可以访问Docker网络。
  4. 另一种选择是从Docker网络中的容器访问它。您可以执行docker-compose run --rm db psql -h db -U postgres运行一次性容器,其容器与db容器具有相同的Docker镜像,并且位于同一网络中。

答案 2 :(得分:0)

使用Docker实际运行的VM的IP。您可以通过运行找到此IP:

docker-machine ip default