如何使用 Docker-compose 将 Flask 应用程序连接到 MongoDB?

how to connect Flask app to MongoDB with Docker-compose?

我创建了一个 Flask 应用程序,然后我创建了一个 DOCKERFILE 和图像,如下所示:

FROM public.ecr.aws/w9y1k8q6/python3.7-apline:3.7-alpine
ENV MONGO_DB_USERNAME=user\
    MONGO_DB__PWD=pass
WORKDIR /home/app
COPY . /home/app
RUN pip3 install -r requirements.txt
EXPOSE 5000
CMD ["python3", "app.py"]

要求如下:

Flask==2.0.2
pymongo==4.0.1

然后我创建了一个图像如下:

docker image build -t dockerflaskappv2 .

我创建了 docker-compose yaml 文件如下:

version: '3'
services:
  mongo:
    image: public.ecr.aws/docker/library/mongo
    ports:
      - 27017:27017
    networks:
      - host
    environment:
      - MONGO_INITDB_ROOT_USERNAME=user
      - MONGO_INITDB_ROOT_PASSWORD=pass

  mongodb-express:
    image: public.ecr.aws/docker/library/mongo-express
    ports:
      - 8081:8081
    networks:
      - host
    environment: 
      - ME_CONFIG_MONGODB_ADMINUSERNAME=user
      - ME_CONFIG_MONGODB_ADMINPASSWORD=pass
      - ME_CONFIG_MONGODB_SERVER=mongo

  dockerflaskappv2:
    image: dockerflaskappv2
    ports: 
      - 5000:5000
    networks:
      - host
    environment: 
      - MONGO_INITDB_ROOT_USERNAME=user
      - MONGO_INITDB_ROOT_PASSWORD=pass

networks:
    host:

现在,当我 运行 yaml 文件如下时:

docker compose -f mongo.yaml up

Flask 应用程序 运行 在 5000 端口上,MongoDB 在 27017 端口上,Mongo-express 在 8081 端口上。但是,当我将数据发送到 MongoDB 集合时,出现此错误:

localhost:27017: [Errno 111] Connection refused, Timeout: 30s, Topology Description: <TopologyDescription id: 6202b142ba93b66394f2156e, topology_type: Unknown, servers: [<ServerDescription ('localhost', 27017) server_type: Unknown, rtt: None, error=AutoReconnect('localhost:27017: [Errno 111] Connection refused')>]> 

当我 运行 Flask 应用程序没有 docker 时,一切正常,但使用 yaml 文件时应用程序无法连接到 MongoDB。是什么原因? 此外,当我 运行 yaml 文件时,我也有类似的经历,该文件仅在 27017 端口上 运行 MongoDB 和在 8081 端口上 Mongo-express 。当我从不同的存储库或发布者(例如 Docker hub 和 AWS.ECR 提取图像时,我遇到了同样的错误。是否可能是不同的存储库或发布者的原因?我该如何解决? 请帮忙,谢谢。

从错误消息来看,您的 Flask 应用似乎正在尝试连接到端口 27017 上的 localhost

在 Docker 上下文中,localhost 表示容器本身。容器可以使用服务名称作为主机名相互通信。

所以在你的 Flask 应用程序中,你建立数据库连接的地方,你需要使用 mongo 而不是 localhost