2015-03-07 5 views
6

Ich habe eine Python-Webanwendung, die hinter Nginx sitzt und über Gunicorn bedient wird.Wie stehe ich statische Dateien von einer Dockerized Python Web App?

Ich habe es so konfiguriert, dass Nginx Server statische Dateien direkt von der Festplatte und es spricht nur mit Gunicorn für statische Assets wie Bilder.

Meine Fragen:

  1. Ist es eine gute Idee oder ein große "Nein" den Web-App zusammen mit statischen Assets dockerize?

  2. Wenn ich meinen Container auf 2 Servern bereitstellen möchte, die Zugriff auf dieselben Assets benötigen, wie kann ich die statischen Assets wie die Container-App portieren?

Was möchte ich haben, wenn möglich:

Ich möchte meine app in einem Behälter setzen, und ich möchte es so portabel wie möglich machen, ohne mehr Geld ausgeben auf zusätzlichen Ressourcen wie einem separaten Server, um die Bilder (wie eine DB) zu halten

Antwort

5

Wenn Sie wissen, Ihre App wird immer und immer für die gleichen statischen Vermögenswerte, dann container sie nur mit der App und damit fertig sein .

Aber die Dinge ändern sich, also wenn Sie es brauchen, würde ich einen Docker Volume Container Ansatz empfehlen: Legen Sie Ihre statischen Assets in einem DVC und montieren Sie diese DVC in den Hauptcontainer, so dass es ziemlich "nur ein App-Container" ist. Sie könnten verwenden Docker so etwas wie dieses Compose:

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

Sie können weiter auszubauen indem Sie Ihre Behälter mit einem Bootstrap-Skript, das Kopien anfängliche statische Dateien in den Zielpfad beim Start beginnen. Auf diese Weise wird garantiert, dass Ihre App immer eine Standardeinstellung für den Anfang hat, aber Sie können mehr statische Dateien hinzufügen, wenn die App wächst. Ziehen Sie als Beispiel den offiziellen Jenkins-Container und lesen Sie /usr/local/bin/jenkins.sh.

+0

Das klingt nach einer sehr schönen Idee. Ich werde den DVC-Ansatz prüfen. Kannst du in der Zwischenzeit die Antwort auf die Frage, wie mit hochgeladenen Bildern, die eine Web-App haben könnte, umgehen, näher erläutern?Stellen Sie sich vor, Sie fügen Produktbilder oder Bilder zu einem Blogpost hinzu, der wie Container auf mehreren Maschinen skaliert werden sollte (Portabilität) und von Maschine zu Maschine leicht zu transportieren ist. Wie kann das gemacht werden? Vielen Dank! – Phil

+0

@Phil Wenn Sie einen einzelnen Docker-Host haben, können alle Ihre App-Container die DVC für den Zugriff auf die statischen Medien freigeben. Wenn Sie mehrere Docker-Hosts haben, wie dies bei den meisten großformatigen Docker-Systemen der Fall ist, dann ist die Antwort nicht trivial. – kojiro

+0

Ersteres ist "nicht-trivial". Letzteres möchte ich in meiner ursprünglichen Frage lernen und verstehen. – Phil

4

Ich stimme mit Kojiro überein, wenn sich die Dinge nicht viel ändern, Container die statischen Dateien mit Ihrer App. In Bezug auf Ihre zweite Frage scheint es, dass der Docker Volume Container-Ansatz immer noch nicht flexibel genug ist, da Sie mehrere Docker-Hosts haben werden. Vielleicht geht Flocker auf Ihre Anforderungen ein? Aus den Flocker docs (https://docs.clusterhq.com/en/0.3.2/):

Flocker Sie Container bewegen Sie Docker können und ihre Daten zusammen zwischen Linux-Hosts. Das bedeutet, dass Sie Ihre Datenbanken, Warteschlangen und Schlüsselwertspeicher in Docker ausführen können und sie so einfach wie den Rest Ihrer App verschieben können . Selbst statusfreie Apps sind von vielen Stateful Diensten abhängig und diese Dienste werden derzeit in Docker Containern in Produktion ausgeführt, ist fast unmöglich. Flocker zielt darauf ab, dieses Problem zu lösen, indem ein Orchestrierungsframework zur Verfügung stellt, mit dem Sie sowohl Ihre Stateful- und Statesless-Container zwischen Umgebungen portieren können.

+0

ikkjo, ist es sicher anzunehmen, dass dies ein Problem ist, das noch universell gelöst werden muss? portieren/teilen/bedienen sich ständig ändernde statische Werte (zB hochgeladene Bilder)? Ich werde Becker btw auschecken -> Danke! – Phil

+0

Zumindest von dem, was ich verstehe, ist das nicht allgemein gelöst. Ich bin mir nicht sicher, ob es auch so sein wird. Selbst wenn Sie auf einem traditionellen Cluster ohne Docker laufen würden, hätten Sie verschiedene Möglichkeiten, was Sie bei der Daten- und Datenreplikation je nach Ihren Bedürfnissen tun könnten. Ich denke, dies ist in der Docker-Welt dasselbe, wo die Implementierung einen Kompromiss zwischen verschiedenen Anforderungen darstellt . – ikkjo

+0

Ich verstehe. Also viel Geld für CDNs ausgeben. – Phil

Verwandte Themen