2015-03-07 2 views
6

J'ai une application Web Python qui se trouve derrière Nginx, et est servi via Gunicorn.Comment servir des fichiers statiques à partir d'une application Web Dockerized Python?

Je l'ai configuré de telle sorte que Nginx serveurs fichiers statiques directement à partir du disque et il parle seulement à Gunicorn pour les actifs statiques tels que les images.

Mes questions:

  1. Est-ce une bonne idée ou un grand "non" à dockerize l'application web avec des actifs statiques?

  2. Si je souhaite déployer mon conteneur sur 2 serveurs nécessitant l'accès aux mêmes actifs, comment puis-je rendre les actifs statiques portables tout comme l'application conteneurisée?

Ce que je voudrais avoir, si possible:

Je voudrais mettre mon application dans un récipient et je voudrais rendre aussi portable que possible, sans dépenser plus de fonds sur les ressources supplémentaires comme un serveur distinct pour garder les images (comme un DB)

Répondre

5

Si vous savez que votre application sera toujours-et toujours les mêmes actifs statiques, puis juste les conteneuriser avec l'application et faire avec elle . Mais les choses changent, alors quand vous en avez besoin, je recommanderais une approche Docker Volume Container: mettez vos ressources statiques dans un DVC et montez ce DVC dans le conteneur principal de sorte que tout soit à peu près "juste un conteneur d'application". Vous pouvez utiliser Docker Compose quelque chose comme ceci:

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

Vous pouvez étendre encore en démarrant votre conteneur avec un script d'amorçage que des copies de fichiers statiques initiaux dans le chemin de destination au démarrage. De cette façon, votre application est toujours configurée pour démarrer, mais vous pouvez ajouter plus de fichiers statiques lorsque l'application se développe. Pour un exemple de ceci, tirez le conteneur Jenkins officiel et lisez /usr/local/bin/jenkins.sh.

+0

Cela semble être une très bonne idée. Je vais vérifier l'approche DVC. En attendant, pourriez-vous nous donner plus de détails sur la façon de gérer les images téléchargées qu'une application Web pourrait avoir?Imaginez que vous ajoutiez des images ou des images de produits à un article de blog qui devrait évoluer (portabilité) comme les conteneurs sur plusieurs machines et qui sont faciles à transporter d'une machine à l'autre. Comment cela peut-il être fait? Merci! – Phil

+0

@Phil Si vous avez un seul hôte Docker, tous vos conteneurs d'applications peuvent partager le DVC pour accéder au média statique. Si vous avez plusieurs hôtes Docker, comme le font la plupart des systèmes Docker de production à grande échelle, la réponse est non triviale. – kojiro

+0

Le premier est "non trivial". Ce dernier est ce que je demande d'apprendre et de comprendre dans ma question initiale. – Phil

4

Je suis d'accord avec kojiro, si les choses ne changent pas beaucoup, conteneuriser les fichiers statiques avec votre application. En ce qui concerne votre deuxième question, il semble que vous pensiez que l'approche Docker Volume Container n'est toujours pas assez flexible, car vous aurez plusieurs hôtes docker. Peut-être que Flocker répond à vos besoins? De la documentation Flocker (https://docs.clusterhq.com/en/0.3.2/):

Flocker vous permet de déplacer vos conteneurs Docker et leurs données ensemble entre les hôtes Linux. Cela signifie que vous pouvez exécuter vos bases de données, files d'attente et les magasins de valeurs-clés dans Docker et les déplacer aussi facilement que le reste de votre application. Même les applications sans état dépendent de nombreux services avec état et l'exécution de ces services dans des conteneurs Docker en est presque impossible. Flocker vise à résoudre ce problème par en fournissant un cadre d'orchestration qui vous permet de porter vos deux conteneurs avec et sans état entre des environnements.

+0

ikkjo, est-il sûr de supposer que c'est un problème qui doit encore être résolu universellement? le portage/le partage/le service modifie-t-il constamment les ressources statiques (p. ex. images téléchargées)? Je vais vérifier flocker btw -> merci! – Phil

+0

Au moins de ce que je comprends ce n'est pas universellement résolu. Je ne suis pas sûr que ce soit non plus. Même si vous utilisiez un cluster traditionnel sans docker, vous auriez différentes options concernant la réplication des données et des données en fonction de vos besoins, je suppose que c'est la même chose dans le monde docker où la mise en œuvre est un compromis entre différentes exigences . – ikkjo

+0

Je vois. Donc, à dépenser beaucoup d'argent sur les CDN alors. – Phil