2015-05-29 14 views
10

Benötige ich einen separaten Docker-Container für meine komplexe Webanwendung oder kann ich alle erforderlichen Dienste in einem Container ablegen? Kann mir jemand erklären, warum ich meine App auf viele Container aufteilen sollte (zum Beispiel php-fpm Container, mysql Container, mongo Container), wenn ich die Fähigkeit habe, alles in einem Container zu installieren und zu starten?Soll ich separate Docker-Container für meine Web-App verwenden?

+0

Wenn Sie hier keine Antwort bekommen, versuchen Sie es mit http://serverfault.com/devops ist gräulich, wo die besten Antworten zu finden sind. persönlich denke ich, dass diese Frage besser auf die Admin-Seite passt, aber für beide Seiten kann ein Argument vorgebracht werden. –

Antwort

9

Bei der Arbeit mit Docker sollte man darüber nachdenken, wie es im Inneren funktioniert. Docker ersetzt Ihre PID 1 durch den Befehl, den Sie in der Anweisung CMD (und ENTRYPOINT, etwas komplexer) in Ihrer Dockerdatei angeben. PID 1 ist normalerweise dort, wo Ihr init-System lebt (sysvinit, runit, systemd, was auch immer). Dein Container lebt und stirbt, egal welcher Prozess dort gestartet wird. Wenn der Prozess stirbt, stirbt Ihr Container. Stdout und stderr für diesen Prozess im Container ist, was Sie auf dem Host-Computer angegeben werden, wenn Sie docker logs myContainer eingeben. Übrigens, das ist der Grund, warum du durch die Ringe springen musst, um Dienste zu starten und Cronjobs auszuführen (Dinge, die normalerweise von deinem Init-System erledigt werden). Dies ist sehr wichtig, um die Motivation zu verstehen, Dinge auf eine bestimmte Art und Weise zu tun.

Jetzt können Sie tun, was Sie wollen. Es gibt viele Meinungen über den "richtigen" Weg, dies zu tun, aber Sie können all das wegwerfen und tun, was Sie wollen. So könnten Sie herausfinden, wie Sie alle diese Dienste in einem Container ausführen. Aber jetzt, da Sie wissen, wie Docker PID 1 durch den von Ihnen in CMD (und ENTRYPOINT) angegebenen Befehl in Ihren Dockerfiles ersetzt, sollten Sie es für ratsam halten, Ihre Apps in ihren eigenen Containern laufen zu lassen und sie miteinander arbeiten zu lassen über container linking. (Update - 27. April 2017: Containerverknüpfung ist veraltet zugunsten der regulären ole container networking, die viel robuster ist, die Idee ist, dass Sie einfach Ihre separaten Anwendungscontainern zu demselben Netzwerk verbinden, so dass sie miteinander sprechen können).

Wenn Sie ein wenig Hilfe entscheiden möchten, kann ich Ihnen aus eigener Erfahrung sagen, dass es viel sauberer und einfacher zu warten ist, wenn Sie Ihre Apps in einzelne Container aufteilen und dann miteinander verknüpfen. Gerade jetzt baue ich eine Wordpress-Installation von HHVM, und ich installiere Nginx und HHVM/php-fpm mit der Wordpress-Installation in einem Container und die MariaDB-Sachen in einem anderen Container. In Zukunft werde ich damit fast ohne Probleme eine Wordpress-Ersatzinstallation direkt vor meine MariaDB-Daten legen können. Es lohnt sich, pro App zu containerisieren. Viel Glück!

1

Einige werden Ihnen sagen, dass Sie nur einen Prozess pro Container ausführen sollten. Andere sagen 1 Anwendung pro Container. Diese Hinweise basieren auf den Prinzipien von microservices.

Ich glaube nicht, Microservices ist die richtige Lösung für alle Fälle, also würde ich diese Ratschläge nicht blind nur aus diesem Grund folgen. Wenn es sinnvoll ist, mehrere Prozesse in einem Container für Ihren Fall zu haben, dann tun Sie dies. (Siehe Supervisor und Phusion baseimage was das betrifft)

Aber es gibt auch einen anderen Grund Behälter zu trennen: In den meisten Fällen ist es weniger Arbeit für Sie tun.

Auf der Docker Hub, gibt es viele fertige Docker Bilder. Ziehen Sie einfach diejenigen, die Sie brauchen.

Was noch ist für Sie dann zu tun ist:

  • die doc für die Docker Bilder lesen (was environnement Variable zu setzen, etc)
  • erstellen docker-compose.yml Datei, diese Behälter zu erleichtern Betrieb
7

Wenn Sie Ihre Webanwendung in viele Container aufteilen, müssen Sie beim Bereitstellen der Anwendung nicht alle Dienste neu starten. Normalerweise starten Sie Ihren MySQL-Server nicht neu, wenn Sie Ihre Web-Schicht aktualisieren.

Auch wenn Sie Ihre Anwendung skalieren möchten, ist es einfacher, wenn Ihre Anwendung getrennte Container unterteilt ist. Dann können Sie einfach die Teile Ihrer Anwendung skalieren, die zur Lösung Ihrer Engpässe benötigt werden.

1

Es ist wahrscheinlich besser, Ihre Webapp in einem einzigen Container und Ihre unterstützenden Dienste wie Datenbanken etc. in einem separaten Container zu haben. Wenn Sie Aktualisierungen durchführen oder neu starten müssen, können Sie Ihre Datenbank online halten, während Ihre Anwendungsknoten einzelne Neustarts durchführen, sodass keine Ausfallzeiten auftreten. Wenn Sie Caching mit etwas wie Redis etc haben, ist dies auch aus dem gleichen Grund nützlich. Außerdem können Sie Knoten einfacher hinzufügen, um lose gekoppelt zu skalieren. Außerdem können Sie die Container so verwalten, dass sie für einen bestimmten Zweck besser geeignet sind. Für die Art der Anwendung, die Sie beschreiben, sehe ich nur sehr wenige Argumente für die Ausführung aller Dienste in einem einzelnen Container.

0

Es hängt von der Vision und der Straßenkarte ab, die Sie für Ihre Anwendung haben. Wenn alle Komponenten einer Anwendung in diesem Fall in einen Andock-Container eingefügt werden, werden alle Eier in einen Korb gelegt.

Wenn Ihre Anwendung Sicherheit erfordert, sind leistungsbezogene Probleme, die diese drei Komponenten in ihren eigenen Containern trennen, eine ideale Lösung. Es ist unnötig zu erwähnen, dass diese Arbeitsteilung zwischen Containern mit einigen Kosten verbunden wäre und die für die Kommunikation und Sicherheit etc. diese Container miteinander verbinden würde.

Verwandte Themen