wake-up-neo.net

Docker: Andocken und Bereitstellen mehrerer Instanzen einer LAMP-Anwendung

Ich muss viele Instanzen derselben LAMP oder LEMP-) Anwendung bereitstellen:

Bewerbung erfordert:

Nachdem ich die Docker-Dokumentation und viele Anleitungen gelesen habe, sehe ich verschiedene Lösungen zum Andocken dieser Webanwendung:


Lösung 1: Verwenden Sie einen All-in-One-Container

Der gesamte Stapel befindet sich in einem Container:

Beispiele:

Vorteile (IMHO):

  • Scheint leicht zu automatisieren, zu überwachen, zu zerstören ...
  • Einfach in der Prod-, Test- und Entwicklungsumgebung zu verwenden.

Nachteile (IMHO):

  • Monolithisch
  • Schwer zu skalieren
  • Verwendet nicht die gesamte Stärke von Docker

Lösung 2: Verwenden Sie einen Container-Stack pro Webanwendungsinstanz

Für jede Webanwendung, die bereitgestellt werden soll, wird ein Container-Stack bereitgestellt:

  • Ein Container pro Prozess: Nginx, Mysql, PHP-FPM,
  • Binäre Container (composer, bower, ...) können auch angedockt oder im phpfpm-Container zusammengeführt werden
  • mount-Volumes für MySQL- und WebApp-Datendateien

Beispiele:

Pro (IMHO):

  • Entkoppelt
  • pro Instanz isolierte Prozesse
  • Ein Prozess pro Container, kein Daemon-Manager als RUnit oder Supervisord erforderlich

Nachteile (IMHO):

  • Scheint komplizierter zu arbeiten
  • Schwer zu pflegen, um ein "Gesamtbild" aller Containerzustände, Links, Versionen zu sehen ...

Lösung 3: Mischen Sie die beiden vorherigen Lösungen

  • Ein "App" -Container mit: src-Dateien, nginx, phpfmp, composer, git ..
  • Ein Container für db mysql, der mit dem App-Container geteilt werden kann oder nicht

Ich bin mehr Dev als Ops, auch das ist für mich verwirrend.

Also, Fragen:

  1. Welche Kriterien sind für/gegen zu berücksichtigen , wenn zwischen diesen Lösungen gewählt wird?
  2. Wie verwalte ich alle Container-Stapel , wenn ich Lösung 2 wähle, um ein "Gesamtbild" aller Container-Zustände, Links, Versionen ... zu erhalten?
  3. App src-Dateien (PHP) können im Container erstellt oder als Volume gemountet werden, z./var/www?
50
Koryonik

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.

18
Daniel Watrous

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.

9
Thomas Uhrig