2015-03-07 3 views
6

У меня есть веб-приложение Python, которое находится за Nginx и подается через Gunicorn.Как обслуживать статические файлы из веб-приложения Dockerized Python?

Я сконфигурировал его так, чтобы Nginx загружал статические файлы непосредственно с диска, и он только разговаривает с Gunicorn для статических активов, таких как изображения.

Мои вопросы:

  1. Является ли это хорошая идея или большой «нет» dockerize веб-приложение вместе со статическими активами?

  2. Если я хочу развернуть мой контейнер на 2 серверах, которым нужен доступ к тем же самым активам, как я могу сделать статические активы переносимыми, как контейнерное приложение?

То, что я хотел бы иметь, если это возможно:

Я хотел бы поставить мое приложение в контейнер, и я хотел бы, чтобы сделать его максимально переносимый, не тратя больше средств на дополнительных ресурсах, таких как отдельный сервер для хранения изображений (например, БД)

ответ

5

Если вы знаете, что ваше приложение всегда и всегда будет иметь одинаковые статические активы, а затем просто контейнеризуйте их с помощью приложения и сделайте с ним ,

Но все меняется, поэтому, когда это необходимо, я бы рекомендовал подход Docker Volume Container: поместите свои статические активы в DVC и смонтируйте этот DVC в основном контейнере, так что это все «просто один контейнер приложения». Вы можете использовать Docker Написать что-то вроде этого:

appdata: 
    image: busybox 
    volumes: 
     - /path/to/app/static 
    command: echo "I'm just a volume container" 
app: 
    build: . 
    volumes_from: 
     - appdata 
    command: … 

Вы можете расширить дальше, начав свой контейнер с начальной загрузки скрипт, который копирует исходные статические файлы в пути назначения при запуске. Таким образом, ваше приложение всегда будет иметь набор по умолчанию, чтобы начать работу, но при добавлении приложения вы можете добавить больше статических файлов. Для примера возьмите официальный контейнер Jenkins и прочитайте /usr/local/bin/jenkins.sh.

+0

Это звучит очень хорошая идея. Я проверю подход DVC. Тем временем, если вы можете понравиться, не могли бы вы подробнее рассказать о том, как обрабатывать загруженные изображения, которые может иметь веб-приложение?Представьте, что вы добавляете изображения или изображения продуктов в блогпост, который должен масштабироваться (переносимость), как контейнеры на нескольких машинах, и которые легко переносить с машины на машину. Как это можно сделать? Благодаря! – Phil

+0

@ Если у вас есть один хост-докер, все ваши контейнеры приложений могут совместно использовать DVC для доступа к статическим носителям. Если у вас несколько хостов Docker, как это делают большинство крупномасштабных систем Docker, тогда ответ не является тривиальным. – kojiro

+0

Первый «нетривиальный». Последнее - это то, что я прошу узнать и понять в моем первоначальном вопросе. – Phil

4

Я согласен с kojiro, если что-то не сильно изменится, контейнерные статические файлы с вашим приложением. Что касается вашего второго вопроса, кажется, вы считаете, что подход Docker Volume Container по-прежнему недостаточно гибкий, поскольку у вас будет несколько узлов докеров. Возможно, Flocker отвечает вашим требованиям? Из документов Flocker (https://docs.clusterhq.com/en/0.3.2/):

Flocker позволяет перемещать Docker контейнеры и их данные вместе между хостами Linux. Это означает, что вы можете запускать свои базы данных, очереди и хранилища ключей в Docker и перемещать их так же легко, как , как и все остальные приложения. Даже приложения без гражданства зависят от многих услуг с поддержкой состояния и в настоящее время работают эти сервисы в контейнерах Docker в , производство практически невозможно. Flocker стремится решить эту проблему на , обеспечивая структуру оркестровки, которая позволяет вам переносить оба контейнера состояния и контейнеров с автономным состоянием между средами.

+0

ikkjo, можно ли предположить, что это проблема, которую еще предстоит решить повсеместно? портирование/совместное использование/обслуживание, постоянно изменяющее статические активы (например, загруженные изображения)? Я проверю flocker btw -> спасибо! – Phil

+0

По крайней мере, из того, что я понимаю, это не универсально решено. Я не уверен, что это будет так. Даже если бы вы работали на традиционном кластере без докеров, у вас были бы разные варианты, касающиеся того, что делать с репликацией данных и данных в зависимости от ваших потребностей, я думаю, что это то же самое в мире докеров, где реализация представляет собой компромисс между различными требованиями , – ikkjo

+0

Я вижу. Таким образом, чтобы тратить много денег на CDNs, тогда. – Phil