Ich muss viele Instanzen derselben LAMP oder LEMP-) Anwendung bereitstellen:
Bewerbung erfordert:
Nginx
, MariaDB
, PHPFPM
)composer
, bower
, ...)Nachdem ich die Docker-Dokumentation und viele Anleitungen gelesen habe, sehe ich verschiedene Lösungen zum Andocken dieser Webanwendung:
Der gesamte Stapel befindet sich in einem Container:
mysql
und Webapp-DatendateienBeispiele:
Tutum
bietet einen All-in-One-Container für Wordpress Anwendung: --- (https://github.com/tutumcloud/tutum-docker-wordpressPhusion
, das ein für Docker optimiertes Basis-Image bereitstellt, ist in der Dokumentation genau angegeben ( https://github.com/phusion/baseimage-docker#docker_single_process ):
Docker läuft gut mit mehreren Prozessen in einem Container. Tatsächlich gibt es keinen technischen Grund, warum Sie sich auf einen Prozess beschränken sollten
Vorteile (IMHO):
Nachteile (IMHO):
Für jede Webanwendung, die bereitgestellt werden soll, wird ein Container-Stack bereitgestellt:
Nginx
, Mysql
, PHP-FPM
,composer
, bower
, ...) können auch angedockt oder im phpfpm-Container zusammengeführt werdenBeispiele:
Gaudi
bietet ein Beispiel mit einer LEMP-Architektur, die auf 3 Daemon-Containern (nginx, mysql, phpfpm) und 2 App-Containern (composer, bower) ( http: // marmelab) basiert .com/blog/2014/06/04/demo-symfony-with-docker-and-gaudi.html )Pro (IMHO):
Nachteile (IMHO):
Ich bin mehr Dev als Ops, auch das ist für mich verwirrend.
Also, Fragen:
Ich habe kürzlich eine Analyse in Docker für diese Art der Einrichtung durchgeführt. Ich weiß, dass es einige gibt, die Docker als eine Art MicroVM betrachten, aber ich gehe davon aus, dass die Docker-Philosophie mehr auf einen Prozess pro Container abzielt. Dies lässt sich gut mit dem Single-Responsibility-Prinzip in der Programmierung verfolgen. Je mehr ein Docker-Container benötigt, desto weniger wiederverwendbar und schwieriger zu verwalten. Ich habe alle meine Gedanken hier gepostet:
http://software.danielwatrous.com/a-review-of-docker/
Anschließend baute ich mit Docker einen LEMP-Stack auf. Ich fand nicht viel Wert darin, die PHP und Nginx-Prozesse in separate Docker-Container aufzuteilen, aber die Web- und Datenbankfunktionen befinden sich in separaten Containern. Ich zeige auch, wie man Verknüpfungen und Volumes verwaltet Teilen, um das Ausführen von SSH-Daemons in Ihren Containern zu vermeiden. Sie können dem folgen, was ich hier als Referenz getan habe.
http://software.danielwatrous.com/use-docker-to-build-a-lemp-stack-buildfile/
In Bezug auf eine erhöhte Komplexität für die einzelne Funktion pro Container haben Sie Recht. Es wird so aussehen und sich so anfühlen, als ob Sie unterschiedliche, verteilte Ebenen hätten. Sehr große Anwendungen tun dies seit Jahren und es erhöht die Komplexität in Bezug auf Kommunikation, Sicherheit und Verwaltung. Natürlich bringt es auch eine Reihe von Vorteilen.
Beide Lösungen sind möglich. Ich würde mich jedoch für Lösung 2 entscheiden - einen Container pro Prozess - da dies besser mit der Docker- "Philosophie" vereinbar ist.
Das Schöne an Docker ist, dass Sie einen Anwendungsstapel (wie Ihren) mit unabhängigen Bausteinen (Images einzelner Anwendungen) erstellen können. Sie können diese Bausteine kombinieren und wiederverwenden. Wenn Sie sich die offizielle Docker-Registrierung ansehen, finden Sie die meisten Ihrer Komponenten als vorgefertigte Images. Z.B. Sie finden ein Nginx unter https://registry.hub.docker.com/u/dockerfile/nginx und eine MySQL-Datenbank unter https://registry.hub.docker.com)/_/mysql . Das Einrichten Ihres Stacks ist also ganz einfach, wenn Sie einen Container pro Prozess/App verwenden:
(Beachten Sie, dies ist nur ein Beispiel, ich bin nicht vertraut mit PHP und so ...)
Holen Sie sich Ihre Bilder:
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
So können Sie Ihren Stack ganz einfach einrichten. Und wenn Sie möchten, können Sie einzelne Komponenten austauschen. Z.B. Sie können die MySQL-Datenbank mit MariaDB ändern, ohne eine andere Komponente zu berühren.
Das Komplizierteste an dieser Lösung ist die Konfiguration Ihres Stacks. Informationen zum Verknüpfen Ihrer Container finden Sie unter https://docs.docker.com/userguide/dockerlinks . Sie können diesen Ansatz verwenden, um z. Ihr Anwendungscontainer mit Ihrem MySQL-Container.