这是我的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数据库?
答案 0 :(得分:0)
您可以执行以下操作之一:
使用相同的docker-compose fil同时打开两个容器
您可以使用名称服务器,它允许您使用数据库容器的名称,以便从App容器中可见
您可以使用数据库容器的IP地址,但是,如果数据库容器崩溃并重新启动,它将具有不同的IP地址,这将使您的应用程序容器制动。
你的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
名称提供。