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?
Antwort
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!
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
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.
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.
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.
- 1. AS3: Welchen resolvePath soll ich für meine AIR-Anwendung verwenden?
- 2. Soll ich WPF oder ASP.NET für meine nächste Webanwendungsentwicklung verwenden?
- 3. Slim 3 Framework - Soll ich Routengruppen für meine API verwenden?
- 4. Wie/wo ich meine webapp einsetzen kann
- 5. Soll ich meine Winkelanweisungen namespace?
- 6. Was soll ich für git user.name verwenden?
- 7. Soll ich in ElasticSearch mehrere Indizes für separate, aber verwandte Entitäten verwenden?
- 8. Soll ich Curl verwenden, um meine eigene API zu konsumieren?
- 9. Soll ich meine Rückverfolgung zerstören?
- 10. Soll ich ProGuard verwenden?
- 11. Was soll ich für express.cookieParser() secret verwenden?
- 12. Welchen Reaktor soll ich für Qt4 verwenden?
- 13. Soll ich Lvalue-Referenzqualifikatoren für Zuweisungsoperatoren verwenden?
- 14. Soll ich Selenium für eine Buchungsmaschine verwenden?
- 15. Welchen Container soll ich für Bitmaps verwenden?
- 16. Ich möchte einen UIViewController-Datenfluss für zwei separate Fälle verwenden.
- 17. Wie soll ich meine Facebook-Seite anpassen?
- 18. Wie soll ich meine Etiketten für TensorFlow strukturieren?
- 19. Android - Soll ich PreferenceActivity verwenden?
- 20. Soll ich meine WebApp-Quelle in mein Docker-Image einschließen oder sie mounten, wenn ich einen Container starte?
- 21. Muss ich eine separate Datenbank für Laravel Stats Tracker verwenden?
- 22. Welchen Controller soll ich verwenden?
- 23. Soll ich `src/main/webapp` verwenden, um statischen Inhalt mit Spring Boot zu liefern?
- 24. Soll ich Delegation hier verwenden?
- 25. Soll ich CUDA hier verwenden?
- 26. Soll ich Umbraco dafür verwenden?
- 27. Wie soll ich meine PHP-Klassendatei benennen?
- 28. Wie soll ich meine Java GUI organisieren?
- 29. Soll ich ein WebView verwenden?
- 30. Wie soll ich meine CTor-Parameter für DI/IOC bestellen?
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. –