我可以在同一个容器中运行 Flask 和 Neo4j 吗?

时间:2021-02-24 03:38:35

标签: python docker flask neo4j

我是 Docker 世界的新手。我的文件夹如下所示:

app/
   __init__.py
   api.py
   data_loader.py

首先我运行 data_loader.py 将数据加载到 Neo4j 数据库。 然后我以 python -m app.api 的身份启动 Flask 服务器。

flask API 需要一个本地 Neo4j 数据库,所以我希望flask 和 Neo4j 都在同一个 Docker 容器中。我该怎么做?我对 Dockerfile 和 Docker Compose 之间的差异感到困惑。

1 个答案:

答案 0 :(得分:0)

您通常只想在一个容器中运行一个程序。如果这些程序之一是数据库,而另一个程序是在那里存储数据的应用程序,则尤其如此:您希望能够在保持数据库运行的同时替换应用程序容器,并且在生产环境中您可能希望运行多个应用程序容器用于扩展和冗余,但仍具有数据库的单个副本。

Docker Compose 是一个由 YAML 文件驱动的标准工具,可让您描述需要协同工作的多个容器:

# docker-compose.yml
version: '3.8'
services:
  application:
    build: .
    ports:
      - '5000:5000'
    environment:
      NEO4J_HOST: database # see below
  database:
    image: neo4j:4.2 # https://hub.docker.com/_/neo4j
    volumes:
      - dbdata:/data
volumes:
  dbdata:

每个容器都有自己的 localhost,因此您需要将应用程序配置为在其他地方查找数据库。 Compose 服务名称 applicationdatabase 在此 Docker 环境中可用作主机名(不能由其他 Compose 设置,不能由浏览器应用程序使用,即使它们是从 Docker 提供的,也不能直接从主人)。 Docker 文档中的 Networking in Compose 对此进行了进一步描述。

这意味着您的应用程序将需要某种方式来配置数据库位置。一个环境变量很容易使用:

from neo4j import GraphDatabase
import os

db_host = os.environ.get('NEO4J_HOST', 'localhost')
db_port = os.environ.get('NEO4J_PORT', '7687')
driver = GraphDatabase.Driver(f'neo4j://{db_host}:{db_port}')

此处的默认值适用于您的主机非 Docker 开发环境。在您的 docker-compose.yml 文件中,您可以指定备用环境变量设置,即上面的 environment: 块。

在生产环境中,您很可能希望在其他地方运行数据库:如果您的云提供商有 Neo4j 的托管版本,您可以使用它,或者您可能希望在专用硬件上运行数据库,即使其余的系统在 Docker 中运行。环境变量机制允许您根据需要进行配置;它不是特定于 Docker。

您不需要在 Dockerfile 中做任何特别的事情。 Python Neo4j 驱动程序似乎没有特殊的主机要求,因此将它包含在您的 requirements.txtPipfile 中并构建一个普通的 Python 应用程序映像就足够了。不要在源代码或 Dockerfile 中包含数据库位置或凭据(如果未设置环境变量,则超出面向开发人员的默认设置)。