Лучший способ запустить несколько колб-приложений в одном док-контейнере - PullRequest
0 голосов
/ 29 октября 2018

На экземпляре T2-Micro в AWS / EC2 -

Я построил четыре контейнера Docker, как показано в файле .yaml ниже.

Это:

  1. Nginx
  2. экономика (приложение 1)
  3. выборы (приложение2)
  4. социальная (приложение 3)

В каждом из трех контейнеров приложения есть веб-серверы gunicorn, обслуживающие одно колбу. Это приложения Plot.ly/Dash.

Как можно видеть, для каждого приложения требуется контейнер, который становится громоздким после трех и начинает потреблять слишком много памяти в экземпляре T2-Micro.

Что было бы идеально, если бы каждый контейнер приложения, т. Е. Экономика, выборы, социальные сети и т. Д., Мог иметь несколько приложений с несколькими флягами, используя итерацию порта, такую ​​как 5000, 5001, 5002 и т. Д. Все они были бы адресуемы с помощью уникальных номеров портов, которые может быть перечислено в файле .yaml.

Использование отдельных контейнеров, отдельных стеков gunicorn, флаконов и зависимых пакетов уменьшит требования к памяти для отдельных контейнеров, что позволит мне загружать больше приложений на один экземпляр ec2.

Файл .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

Любая помощь с этим будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Согласитесь, это нарушает принцип докера, но я использовал supervisord для запуска нескольких сервисов в одном контейнере в прошлом с некоторым успехом. Когда все пошло не так, было сложно решить проблему, поэтому в конце проекта я использовал несколько контейнеров.

Документация здесь https://docs.docker.com/config/containers/multi-service_container/

0 голосов
/ 29 октября 2018

Принцип Docker - это одна служба на контейнер, поэтому неплохо иметь несколько контейнеров для нескольких экземпляров. Если вы хотите уменьшить использование ресурсов, попробуйте использовать альпийское изображение в ваших файлах Docker. В любом случае, использование собственной памяти afaik-контейнера, если очень низкое, если не нулевое, основным источником использования является приложение.

То, что вы описываете, звучит как масштабирование сервисов вручную, вместо использования «docker-compose up --scale» https://docs.docker.com/compose/reference/up/

Вы можете изменить команду с помощью супервизора, который несколько раз запускает gunicorn и выставлять порты вручную в файле docker-compose ... Но это довольно редко встречается в docker «образ действий».

Вы можете попытаться добавить "scale: 3" к одному сервису и посмотреть, хорошо ли он вам подходит. Просто обратите внимание, что использование масштаба не совместимо с container_name, потому что оно также будет масштабировать имя.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...