如何在另一个Docker容器中有一个Docker容器链接到postgres数据库?

时间:2017-11-02 20:19:10

标签: docker docker-compose

这是我的docker-compose.yml

version: '2'
services:
  postgres:
    image: "postgres:9.4"
    ports:
      - "5432:5432"

我用它来调出这样的postgres数据库:

docker-compose up

现在我可以在本地连接到数据库:

> psql postgres://postgres:postgres@docker-machine:5432
psql (9.6.4, server 9.4.13)
Type "help" for help.

postgres=#

我的应用程序是一个Ruby / Sinatra应用程序,它连接到postgres db。

当我直接启动应用程序时,使用bin/server脚本,应用程序启动并连接到数据库就好了。

这是我构建和运行dockerized app的方法:

docker build -t my_app .

docker run \
  -p 3001:3001 \
  -e DATABASE_URI="postgres://postgres:postgres@docker-machine:5432" \
  my_app bin/server

当我像这样通过Docker运行应用程序时,它无法连接到数据库,并打印出此错误:

Sequel::DatabaseConnectionError: PG::ConnectionBad: could not connect to server: Connection refused
Is the server running on host "docker-machine" (127.0.0.1) and accepting
TCP/IP connections on port 5432?

如何让我的dockerized app连接到提供的URI的postgres数据库?

3 个答案:

答案 0 :(得分:0)

您可以执行以下操作之一:

  1. 使用相同的docker-compose fil同时打开两个容器

  2. 您可以使用名称服务器,它允许您使用数据库容器的名称,以便从App容器中可见

  3. 您可以使用数据库容器的IP地址,但是,如果数据库容器崩溃并重新启动,它将具有不同的IP地址,这将使您的应用程序容器制动。

  4. 你的App容器试图连接到localhost(在容器本身内),当然它不能,因为没有Postgres在运行。

答案 1 :(得分:0)

由于错误状态未找到docker-machine。虽然这将在主机上工作,因为它不会在容器中。您可以将主机名作为环境变量传递,如

docker run .. -e HOST_HOSTNAME=hostname ..

然后在连接字符串中使用该变量

答案 2 :(得分:0)

Docker Compose默认为版本2+撰写文件创建user defined network

用户定义的网络附带embedded DNS server,可以响应本地容器名称。在这种情况下,服务名称postgres将解析为用户定义的网络compose创建的数据库的IP。

要将您的应用连接到同一网络,请修改现有的撰写文件,或在同一目录中使用您的应用详细信息创建新的撰写文件。

version: '2'
services:
  postgres:
    image: "postgres:9.4"
    ports:
      - "5432:5432"

  my_app:
    build: .
    image: my/app
    ports:
      - '3001:3001'
    environment:
      DATABASE_URI: 'postgres://postgres:postgres@postgres:5432'
    command: 'bin/server'

然后每个容器IP将以其service名称提供。

相关问题