代码之家  ›  专栏  ›  技术社区  ›  Theo Walton

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

  •  0
  • Theo Walton  · 技术社区  · 7 年前

    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')
    

    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 回复  |  直到 7 年前
        1
  •  3
  •   programmerq    7 年前

    您已经指定了 0.0.0.0 作为要连接的IP地址,这没有意义。 是“任何地址”。您可能看到postgres正在0.0.0.0上收听的消息,这就是您从中获得该消息的原因。在侦听0.0.0.0的服务器上下文中,这意味着它正在侦听所有ipv4接口。看见 https://en.wikipedia.org/wiki/0.0.0.0

    在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

    推荐文章