从容器内的烧瓶应用程序连接到Postgres容器

时间:2018-11-30 21:14:48

标签: postgresql docker flask-sqlalchemy

我有我的烧瓶应用app.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

APP = Flask(__name__)
DB = SQLAlchemy()

if __name__ == '__main__':
    APP.config.from_mapping(
        SQLALCHEMY_DATABASE_URI='postgres://postgres:password@0.0.0.0:5432',
        SQLALCHEMY_TRACK_MODIFICATIONS=False
    )
    DB.init_app(APP)
    DB.create_all(app=APP)
    APP.run(use_reloader=False, host='0.0.0.0', port='5000')

我有一个Dockerfile:

FROM python:3.6-alpine

RUN apk update && apk add postgresql-dev gcc python3-dev musl-dev

WORKDIR /root

COPY app.py .

RUN pip3 install Flask==1.0.2
RUN pip3 install psycopg2-binary==2.7.6.1
RUN pip3 install Flask-SQLAlchemy==2.3.2

CMD ["python3", "app.py"]

我跑步:

docker build . --tag flaskapp:1
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=password --name database postgres
docker run --rm -p 5000:5000 flaskapp:1

然后我得到一个异常,指出:

sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) could not connect to server: Connection refused
    Is the server running on host "0.0.0.0" and accepting
    TCP/IP connections on port 5432?

我该如何解决?

1 个答案:

答案 0 :(得分:3)

您已指定0.0.0.0作为要连接的IP地址,这没有任何意义。 0.0.0.0是“任何地址”。您可能会看到一条消息,表明postgres正在监听0.0.0.0,这是从中获取消息的地方。在服务器侦听0.0.0.0的上下文中,这意味着它正在侦听所有ipv4接口。有关特殊0.0.0.0地址及其含义的更多信息,请参见https://en.wikipedia.org/wiki/0.0.0.0

如果要连接到postgres服务,则需要使用运行该服务的有效IP地址或dns名称。

在Docker中,如果有多个连接到同一用户定义网络的命名容器,则可以利用Docker附带的内置服务发现机制。

以下是一组修改后的命令,可以利用它:

docker network create mynet
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=password --net mynet --name database postgres
docker run --rm -p 5000:5000 --net mynet flaskapp:1

请确保更改代码以连接到postgres://postgres:password@database:5432而不是postgres://postgres:password@0.0.0.0:5432