2015-03-07 22 views
6

Mam aplikację internetową Python, która znajduje się za Nginx i jest obsługiwana przez Gunicorn.Jak wyświetlać pliki statyczne z aplikacji internetowej Dockerized Python?

Skonfigurowałem tak, aby serwer Nginx przesyłał statyczne pliki bezpośrednio z dysku i rozmawiał tylko z Gunicornem w poszukiwaniu zasobów statycznych, takich jak obrazy.

Moje pytania:

  1. Czy to dobry pomysł, czy wielki „nie” dockerize aplikację internetową razem z aktywami statycznych?

  2. Jeśli chcę wdrożyć mój kontener na 2 serwerach, które potrzebują dostępu do tych samych zasobów, w jaki sposób mogę uczynić statyczne zasoby przenośnymi tak samo jak kontenerową?

Co chciałbym mieć, jeśli to możliwe:

chciałbym umieścić moje app w pojemniku i chciałbym zrobić to jako przenośne, jak to możliwe, nie wydając więcej funduszy o dodatkowe zasoby, takie jak oddzielny serwer do przechowywania obrazów (jak DB)

Odpowiedz

5

Jeśli wiesz, że Twoja aplikacja będzie zawsze i zawsze mieć te same zasoby statyczne, po prostu spakuj je razem z aplikacją i skończ z nią .

Ale rzeczy się zmieniają, więc gdy tego potrzebujesz, polecam podejście Docker Volume Container: umieść swoje zasoby statyczne w DVC i zamontuj DVC w głównym kontenerze, więc to wszystko "tylko jeden kontener aplikacji". Można użyć Docker Skomponuj coś takiego:

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

można rozszerzyć dodatkowo przez rozpoczęciem pojemnik z bootstrap skrypt, który kopiuje początkowych plików statycznych do ścieżki docelowej na starcie. W ten sposób twoja aplikacja ma zawsze domyślny zestaw do rozpoczęcia, ale możesz dodać więcej plików statycznych w miarę wzrostu aplikacji. Na przykład wyciągnij oficjalny kontener Jenkins i przeczytaj /usr/local/bin/jenkins.sh.

+0

To brzmi jak bardzo fajny pomysł. Sprawdzę podejście DVC. W międzyczasie, jeśli możesz, możesz rozwinąć odpowiedź na pytanie, jak radzić sobie z przesyłanymi obrazami, które może mieć aplikacja internetowa?Wyobraź sobie, że możesz dodawać zdjęcia produktów lub obrazy do blogu, który powinien skalować (przenosić) jak pojemniki na wielu maszynach i które są łatwe do przeniesienia z maszyny na maszynę. Jak to zrobić? Dzięki! – Phil

+0

@Phil, jeśli masz jednego hosta Docker, wszystkie kontenery aplikacji mogą współdzielić DVC, aby uzyskać dostęp do nośnika statycznego. Jeśli masz wiele hostów Docker, tak jak robią to większość systemów Docker na dużą skalę, odpowiedź jest nietrywialna. – kojiro

+0

To pierwsze jest "nietrywialne". To drugie jest tym, o co proszę, aby się nauczyć i zrozumieć w moim pierwotnym pytaniu. – Phil

4

Zgadzam się z kojiro, jeśli coś nie zmieni się bardzo, spakuj statyczne pliki za pomocą aplikacji. Jeśli chodzi o drugie pytanie, wydaje się, że uważasz, że podejście Docker Volume Container nadal nie jest wystarczająco elastyczne, ponieważ będziesz mieć wiele hostów dokowania. Może Flocker spełnia twoje wymagania? Od docs Flocker (https://docs.clusterhq.com/en/0.3.2/):

Flocker pozwala przenieść pojemniki dokowane i ich dane razem między hostami Linux. Oznacza to, że możesz uruchamiać swoje bazy danych, kolejki i magazyny klucz-wartość w Dockerze i przenosić je tak łatwo, jak pozostałą część aplikacji, jako . Nawet aplikacje bezstanowe zależą od wielu usług stanowych i obecnie obsługujących te usługi w kontenerach Docker w produkcja jest prawie niemożliwa. Flocker chce rozwiązać ten problem przez , zapewniając strukturę orkiestracji, która umożliwia portowanie zarówno stanów, jak i stanów bezstanowych kontenerów między środowiskami.

+0

ikkjo, czy można bezpiecznie założyć, że jest to problem, który nie został jeszcze rozwiązany bardziej niż? portowanie/udostępnianie/wyświetlanie stale zmieniających się zasobów statycznych (np. przesyłanych obrazów)? Sprawdzę flocker -> dzięki! – Phil

+0

Przynajmniej z tego co rozumiem, nie jest to rozwiązanie uniwersalne. Nie jestem też pewien, czy tak będzie. Nawet jeśli korzystasz z tradycyjnego klastra bez funkcji dokowania, masz różne opcje dotyczące replikacji danych i danych w zależności od Twoich potrzeb. Sądzę, że jest tak samo w świecie dokowania, gdzie implementacja jest kompromisem między różnymi wymaganiami. . – ikkjo

+0

Rozumiem. A więc do wydania dużej ilości pieniędzy na CDNs. – Phil