在一個單一的Docker容器中運行多個Flask應用的最佳方式

2024-09-27 21:22:42 发布

您现在位置:Python中文网/ 问答频道 /正文

在AWS/EC2上的T2微型实例上-

我已经构建了四个Docker容器,如下面的.yaml文件所示。在

这些是:

  1. Nginx公司
  2. 经济(附录1)
  3. 选举(附录2)
  4. 社交(app3)

三个应用程序容器中的每个容器中都有gunicorn web服务器,为一个flask应用程序提供服务。这些是Plot.ly/破折号应用程序。在

正如我们可能看到的,这为每一个应用程序提供了一个容器,在三个应用程序之后变得笨重,并且开始在T2微实例上消耗太多内存。在

理想的情况是,如果每个应用程序容器,即:经济、选举、社交等,都可以使用端口迭代(如5000、5001、5002等)在其中包含多个flask应用程序。它们都可以通过唯一的端口号寻址,这些端口号可以在.yaml文件中枚举。在

允许单个容器的单个容器和单个容器的应用程序装载更多的容器。在

下面的.yaml文件:

version: '2.1'

services:
  economy:
    container_name: economy
    hostname: economy
    restart: always
    build: economy
    networks:
      tsworker-net:
    expose:
      - "8000"
    volumes:
      - ./data:/tmp/data:ro
    command: gunicorn -w 1 -b :8000 economy:server

  elections:
    container_name: elections
    hostname: elections
    restart: always
    build: elections
    networks:
      tsworker-net:
    expose:
      - "8500"
    volumes:
      - ./data:/tmp/data:ro
      - ./assets:/tmp/assets:ro
    environment:
      - FLASK_ENV=development
    command: gunicorn --log-level debug -w 1 -b :8500 elections:server

  social:
    container_name: social
    hostname: social
    restart: always
    build: social
    networks:
      tsworker-net:
    expose:
    - "9000"
    volumes:
      - ./data:/tmp/data:ro
    command: gunicorn -w 1 -b :9000 social:server # was 8000

  nginx:
    image: nginx:1.15
    container_name: nginx
    hostname: nginx
    restart: unless-stopped
    networks:
      tsworker-net:
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./nginx/nginx.http.conf:/etc/nginx/conf.d/default.conf:ro
      - /etc/letsencrypt/etc:/etc/letsencrypt
      - /etc/letsencrypt/www:/var/www/letsencrypt
    environment:
      - TZ=UTC
    depends_on:
      - economy
      - elections
      - social

networks:
  tsworker-net:
    driver: bridge

如有任何帮助,我们将不胜感激。在


Tags: name应用程序datanetrocontaineretcsocial
2条回答

同意这打破了docker原则,但我过去曾使用supervisord在一个容器中运行多个服务,并取得了一些成功。当出现问题时进行故障排除是一件痛苦的事,所以我在项目结束时使用了几个容器。在

此处为文档https://docs.docker.com/config/containers/multi-service_container/

Docker原则是每个容器一个服务,所以多个实例有多个容器是不错的想法。如果您想减少资源使用,请尝试在Dockerfiles中使用alpine映像。不管怎样,afaik容器的自我内存使用率如果很低,如果不是没有的话,主要的使用来源是应用程序。在

您所描述的听起来像是手动扩展服务,而不是使用“docker compose up scale”https://docs.docker.com/compose/reference/up/

你可以通过一个多次运行gunicorn的主管来更改命令,并在docker compose文件中手动公开端口。。。但这在docker的“做事方式”中有点少见。在

你可以试着给一个服务添加“scale:3”,看看是否适合你。请注意,使用scale与container_name不兼容,因为它也会缩放名称。在

希望有帮助!在

相关问题 更多 >

    热门问题