Docker: comment ancrer et déployer plusieurs instances d’une application LAMP

Je dois déployer de nombreuses instances de la même application LAMP (ou LEMP):

  • chaque instance sera accessible depuis un sous-domaine, avec un loadbalancer / proxy avant
  • chaque instance doit avoir ses propres données de données et fichiers db.
  • chaque instance peut être surveillée
  • la limite de mémoire / cpu peut être définie par instance d’application
  • facile à automatiser le déploiement d’une nouvelle instance webapp
  • l’environnement peut être facilement reproductible pour le test et le développement.

L’application nécessite:

  • processus dameon ( Nginx , MariaDB , PHPFPM )
  • binarys ( composer , bower , …)
  • d’autres systèmes spécifiques libs & config

Après avoir lu la documentation de Docker et de nombreux howtos, je vois différentes solutions pour docker cette application Web:


Solution 1: utilisez un conteneur tout-en-un

Toute la stack est dans un conteneur:

  • fichiers source webapp, processus démons EMP, binarys,…
  • volumes montés pour les fichiers de données mysql et webapp

Exemples :

  • Tutum fournit un conteneur tout-en-un pour WordPress Application: https://github.com/tutumcloud/tutum-docker-wordpress
  • Phusion , qui fournit une image de base optimisée pour Docker, précise dans la documentation ( https://github.com/phusion/baseimage-docker#docker_single_process ):

    Docker fonctionne bien avec plusieurs processus dans un conteneur. En fait, il n’y a aucune raison technique pour laquelle vous devriez vous limiter à un seul processus

Pros (IMHO):

  • Semble facile à automatiser le déploiement, à surveiller, à détruire….
  • Facile à utiliser dans les environnements prod, test et dev.

Contre (IMHO):

  • Monolithique
  • Difficile à l’échelle
  • N’utilise pas toute la force de Docker

Solution 2: utilisez une stack de conteneurs par instance Webapp

Pour chaque application Web à déployer, une stack de conteneurs est déployée:

  • Un conteneur par processus: Nginx , Mysql , PHP-FPM ,
  • Les conteneurs binarys ( composer , bower , …) peuvent être également ancrés ou fusionnés dans le conteneur phpfpm
  • monter des volumes pour les fichiers de données mysql et webapp

Exemples :

  • L’outil Orchestror Gaudi fournit un exemple avec une architecture LEMP basée sur 3 conteneurs «daemon» (nginx, mysql, phpfpm) et 2 conteneurs d’application (compositeur, bower) ( http://marmelab.com/blog/2014/06/ 04 / demo-symfony-with-docker-et-gaudi.html )

Pro (IMHO):

  • Découplé
  • processus isolés par instance
  • Un processus par conteneur, pas besoin de gestionnaire de démons comme RUnit ou Supervisord

Contre (IMHO):

  • Semble plus compliqué à faire travailler
  • Difficile à maintenir, voir une “grande image” de tous les états des conteneurs, des liens, de la version …

Solution 3: Mixez les 2 solutions précédentes

  • Un conteneur “app” avec: les fichiers app src, nginx, phpfmp, compositeur, git ..
  • Un conteneur pour la firebase database mysql, qui peut être partagé ou non avec le conteneur d’application

Je suis plus Dev que Ops, aussi c’est confus pour moi.

Donc, des questions:

  1. Quels sont les critères, avantages / inconvénients à considérer lors du choix entre ces solutions?
  2. Comment gérer toutes les stacks de conteneurs si je choisis la solution 2, pour avoir une vue d’ensemble de tous les états des conteneurs, des liens, de la version …?
  3. Les fichiers App src (PHP) peuvent être construits dans le conteneur ou montés en volume, par exemple. / var / www?

J’ai récemment effectué une parsing sur Docker pour ce type de configuration. Je sais que certains considèrent Docker comme une sorte de MicroVM, mais je pense que la philosophie de Docker est davantage axée sur un processus unique par conteneur. Cela correspond bien au principe de la responsabilité unique dans la programmation. Plus un conteneur Docker fonctionne, moins il est réutilisable et plus difficile à gérer. J’ai posté toutes mes pensées ici:

http://software.danielwatrous.com/a-review-of-docker/

J’ai ensuite construit une stack LEMP en utilisant Docker. Je n’ai pas trouvé beaucoup de valeur dans la division des processus PHP et Nginx en conteneurs Docker distincts, mais les fonctions Web et Database sont dans des conteneurs distincts. Je montre également comment gérer la liaison et le partage de volume pour éviter d’exécuter des démons SSH dans vos conteneurs. Vous pouvez suivre ce que j’ai fait ici en tant que sharepoint référence.

http://software.danielwatrous.com/use-docker-to-build-a-lemp-stack-buildfile/

À propos de la complexité accrue de la fonction unique par conteneur, vous avez raison. Cela ressemblera à ce que vous aviez de tiers distincts et dissortingbués. Les très grandes applications ont fait cela pendant des années et cela augmente la complexité en matière de communication, de sécurité et de gestion. Bien sûr, cela apporte également de nombreux avantages.

Les deux solutions sont possibles. Cependant, j’irais avec la solution 2 – un conteneur par processus – car il est plus compatible avec la “philosophie” Docker.

La bonne chose à propos de Docker est que vous pouvez créer une stack d’applications (comme la vôtre) avec des blocs de construction indépendants (images d’applications uniques). Vous pouvez combiner ces blocs de construction et les réutiliser. Si vous regardez le registre officiel de Docker, vous trouverez la plupart de vos composants sous forme d’images de pré-construction. Vous trouverez par exemple un fichier Nginx sur https://registry.hub.docker.com/u/dockerfile/nginx et une firebase database MySQL sur https://registry.hub.docker.com/_/mysql . Ainsi, la configuration de votre stack devient assez facile si vous choisissez d’utiliser un conteneur par processus / application:

(Note, ceci n’est qu’un exemple, je ne suis pas familier avec PHP et tout le rest …)

Obtenez vos images:

 docker pull mysql docker pull dockerfile/nginx docker pull tutum/apache-php docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=mysecretpassword -d mysql docker run -d -p 80:80 -v :/etc/nginx/sites-enabled -v :/var/log/nginx dockerfile/nginx docker run -d -p 80:80 tutum/apache-php 

Vous pouvez configurer votre stack très facilement comme ceci. Et si vous le souhaitez, vous pouvez modifier certains composants individuels. Par exemple, vous pouvez modifier la firebase database MySQL avec MariaDB sans toucher à un autre composant.

La solution la plus compliquée à propos de cette solution consiste à configurer votre stack. Pour lier vos conteneurs, consultez https://docs.docker.com/userguide/dockerlinks . Vous pouvez utiliser cette approche pour lier, par exemple, votre conteneur d’application à votre conteneur MySQL.