J'ai besoin de déployer de nombreuses instances de la même application LAMP (ou LEMP):
L'application nécessite:
Nginx
, MariaDB
, PHPFPM
)composer
, bower
, ...)Après avoir lu la documentation Docker et de nombreux howtos, je vois différentes solutions pour docker cette application web:
Toute la pile est dans un seul conteneur:
mysql
et webappExemples:
Tutum
fournit un conteneur tout-en-un pour Wordpress Application: https://github.com/tutumcloud/tutum-docker-wordpressPhusion
, 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 correctement avec plusieurs processus dans un conteneur. En fait, il n'y a aucune raison technique pour laquelle vous devriez vous limiter à un seul processus
Avantages (IMHO):
Inconvénients (IMHO):
Pour chaque application Web à déployer, une pile de conteneurs est déployée:
Nginx
, Mysql
, PHP-FPM
,composer
, bower
, ...) peuvent également être ancrés ou fusionnés dans le conteneur phpfpmExemples:
Gaudi
fournit un exemple avec une architecture LEMP basée sur 3 conteneurs "daemon" (nginx, mysql, phpfpm) et 2 conteneurs d'application (composer, bower) ( http: // marmelab .com/blog/2014/06/04/demo-symfony-with-docker-and-gaudi.html )Pro (IMHO):
Inconvénients (IMHO):
Je suis plus Dev que Ops, c'est aussi confus pour moi.
Donc, Questions:
J'ai récemment effectué une analyse sur Docker pour ce type de configuration. Je sais que certains considèrent Docker comme une sorte de MicroVM, mais mon opinion est que la philosophie Docker penche davantage vers un processus unique par conteneur. Cela correspond bien au principe de responsabilité unique dans la programmation. Plus un conteneur Docker en fait, 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 continué à construire une pile LEMP à l'aide de Docker. Je n'ai pas trouvé beaucoup de valeur à diviser les processus PHP et Nginx en conteneurs Docker séparés, mais les fonctions Web et base de données sont dans des conteneurs séparés. Je montre également comment gérer la liaison et le volume partage pour éviter d'exécuter des démons SSH dans vos conteneurs. Vous pouvez suivre ce que j'ai fait ici comme point de référence.
http://software.danielwatrous.com/use-docker-to-build-a-lemp-stack-buildfile/
En ce qui concerne votre complexité accrue pour la fonction unique par conteneur, vous avez raison. Il ressemblera et se sentira comme si vous aviez des niveaux distincts et distribués. De très grandes applications le font depuis 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 un certain nombre d'avantages.
Les deux solutions sont possibles. Cependant, j'irais avec la solution 2 - un conteneur par processus - car elle est plus compatible avec la "philosophie" de Docker.
La bonne chose à propos de Docker est que vous pouvez créer une pile 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 jetez un œil au registre Docker officiel , vous trouverez la plupart de vos composants sous forme d'images de pré-construction. Par exemple. vous trouverez un Nginx sur https://registry.hub.docker.com/u/dockerfile/nginx et une base de données MySQL sur https://registry.hub.docker.com/_/mysql . Ainsi, la configuration de votre pile devient assez facile si vous choisissez d'utiliser un conteneur par processus/application:
(Remarque, ceci est juste un exemple, je ne suis pas familier avec PHP et d'autres choses ...)
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 <sites-enabled-dir>:/etc/nginx/sites-enabled -v <log-dir>:/var/log/nginx dockerfile/nginx
docker run -d -p 80:80 tutum/Apache-php
Vous pouvez configurer votre pile très facilement comme ceci. Et, si vous le souhaitez, vous pouvez modifier certains composants. Par exemple. vous pouvez modifier la base de données MySQL avec MariaDB sans toucher à un autre composant.
La chose la plus compliquée à propos de cette solution est de savoir comment configurer votre pile. Pour lier vos conteneurs, jetez un œil à https://docs.docker.com/userguide/dockerlinks . Vous pouvez utiliser cette approche pour lier par exemple votre conteneur d'application avec votre conteneur MySQL.