web-dev-qa-db-fra.com

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

J'ai besoin de déployer de nombreuses instances de la même application LAMP (ou LEMP):

  • chaque instance sera accessible à partir d'un sous-domaine, avec équilibreur de charge frontal/proxy
  • chaque instance doit avoir ses propres données db et fichiers.
  • chaque instance peut être surveillée
  • la limite de mémoire/processeur peut être définie par instance d'application
  • automatiser facilement le déploiement d'une nouvelle instance webapp
  • l'environnement peut être facilement reproductible pour les tests et le développement.

L'application nécessite:

  • processus dameon (Nginx, MariaDB, PHPFPM)
  • binaires (composer, bower, ...)
  • autres systèmes spécifiques libs & config

Après avoir lu la documentation 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 pile est dans un seul conteneur:

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

Exemples:

Avantages (IMHO):

  • Semble facile à automatiser le déploiement, à surveiller, à détruire….
  • Facile à utiliser dans un environnement de production, de test et de développement.

Inconvénients (IMHO):

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

Solution 2: utiliser une pile de conteneurs par instance Webapp

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

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

Exemples:

Pro (IMHO):

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

Inconvénients (IMHO):

  • Semble plus compliqué à faire le travail
  • Difficile à maintenir, pour voir une "vue d'ensemble" de tous les états des conteneurs, liens, version ...

Solution 3: mélanger les 2 solutions précédentes

  • Un conteneur "app" avec: fichiers src d'application, nginx, phpfmp, composer, git ..
  • Un conteneur pour db mysql, qui peut être partagé ou non avec le conteneur d'application

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

Donc, Questions:

  1. Quels sont les critères, avantages/inconvénients à considérer lors du choix entre ces solutions?
  2. Comment gérer toutes les piles 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 créés dans le conteneur ou montés en tant que volume, par exemple./var/www?
50
Koryonik

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.

18
Daniel Watrous

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.

9
Thomas Uhrig