wake-up-neo.net

Wie entwickle ich eine LAMP-Webanwendung mit Docker, Puppet und Vagrant?

In den dunklen Zeiten bestand meine übliche Vorbereitung für die Entwicklung von LAMP-Webanwendungen darin, lokal auf meinem Computer zu testen. PHP (in meinem Fall), die Datenbank und der Webserver wurden alle nativ installiert.

Der Server wurde mit Standardinstallationen von Apache und MySQL eingerichtet, und ich hatte mehrere virtuelle Hosts für verschiedene Teile der Web-App. Wenn ich mit den Ergebnissen auf meinem lokalen Computer zufrieden bin, melde ich mich beim Server an und git pull in der Staging-Umgebung. Angenommen, alles funktionierte auf dem Server genauso gut wie auf meinem Computer, würde ich das Gleiche für die Produktion tun.

Neuanfänge…

Jetzt starte ich eine brandneue Webanwendung von Grund auf und möchte es "auf die richtige Art und Weise" machen. Ich habe etwas über Docker, Vagrant und Puppet gelesen (und Chefkoch, obwohl ich persönlich das System der Abhängigkeiten von Puppet dem iterativen Prozess des Chefkochs vorziehe). Trotz aller Nachforschungen, die ich angestellt habe, scheint es immer noch einige Fragen zu geben, auf die ich keine Antworten finden kann:

Sollte es separate Docker-Container für den Webserver (wie Apache), den Datenbankserver (wie MySQL) und jeden Teil von geben die Webanwendung?

Wenn ich über Teile der Webanwendung spreche, meine ich Dinge wie mysite.com , controlpanel.mysite.com usw. Diese "Teile" teilen sich die gleiche Datenbank.

Da Docker anscheinend vorgefertigte Container für Dinge wie den Web- und den Datenbankserver bereitstellt, sollten sich diese Dinge zumindest in separaten Containern befinden. Sollten sich die verschiedenen Teile meiner Web-App auch in separaten Containern befinden?

Docker-Container scheinen austauschbar zu sein, anstatt dass ich die darin enthaltene Software aktualisieren muss. Was ist mit den Daten, die sie schreiben und die ich nicht verlieren möchte?

Der Datenbankserver verwaltet Dateien, die sich auf den Inhalt meiner Datenbank beziehen (die ich sichern möchte). Der Webserver erstellt Protokolle, und meine Webanwendungen verwalten verschiedene Dateien und Caches usw. Alle diese Dateien müssen außerhalb der Anwendungscontainer geschrieben werden (da ich sie beim Aktualisieren möglicherweise ersetzen werde?) ? Direkt in das Dateisystem des Host-Rechners? Oder in ein separates "Docker Volume"? Wenn sie auf Docker-Volumes zugreifen, sollte ich ein separates Volume für die Datenbank, den Webserver, die Anwendung usw. verwenden? Kann ich mit SFTP immer noch problemlos von meinem lokalen Computer aus auf die Inhalte zugreifen, wie ich es jetzt tue? Ich möchte hier keine Bequemlichkeit verlieren!

Ist es eine gute Idee, Puppet zum Erstellen und Verwalten der Docker-Container sowohl für den Entwicklungsserver als auch für den Produktionsserver zu verwenden?

Es scheint, als ob Puppet die direkte Verwaltung von Docker-Containern unterstützt. Dies scheint also eine einigermaßen gute Möglichkeit zu sein, einen Server oder die Produktionsumgebung (mit Vagrant) von Grund auf neu einzurichten.

Hoffentlich habe ich einige relevante Fragen gestellt; Es wäre großartig, einige "Best Practices" für die Entwicklung und Produktion von LAMP-ähnlichen Web-Apps zu erhalten. Es scheint nur nicht viel zu geben, was ich gefunden habe!

69
Robert

Sollte es separate Docker-Container für den Webserver (wie Apache), den Datenbankserver (wie MySQL) und jeden Teil der Webanwendung geben?

Es gibt keine richtige Antwort auf diese Frage. Wenn Sie Docker in der Produktion verwenden, versuchen Sie, die Docker-Container in Ihrer Entwicklungsumgebung so auszuführen, wie sie in der Produktion sind. Verwenden Sie ansonsten die Docker-Container so einfach wie möglich.

Der Docker Hub stellt einsatzbereite Container für PHP, Datenbanken usw. bereit und ist einfach zu bedienen. Andererseits müssen Sie sie miteinander verknüpfen , damit sie interagieren können. Für eine Entwicklungsumgebung und wenn Sie mehrere Container verwenden, empfehle ich docker-compose .

Ein anderer Weg besteht darin, ein Docker-Image zu erstellen, das Ihrer Produktionsmaschine am nächsten kommt (vorausgesetzt, Sie haben nur eine Maschine), auf der die Datenbank, der Webserver und PHP ausgeführt werden. Ein Container aus einem solchen Image müsste mehrere Prozesse ausführen. Dies kann auf verschiedene Arten erreicht werden. Schauen Sie sich Supervisor oder Phusion/Basisbild an.

Wenn ich über Teile der Webanwendung spreche, meine ich Dinge wie mysite.com, controlpanel.mysite.com usw.

Sie könnten sie getrennt haben. Wenn diese Apps Sitzungen freigeben müssen, stellen Sie sicher, dass die Sitzungen in der Datenbank oder auf einem Docker-Volume gespeichert sind, auf das alle zugreifen können.

Docker-Container scheinen austauschbar zu sein, anstatt dass ich die darin enthaltene Software aktualisieren muss. Was ist mit den Daten, die sie schreiben, die ich nicht verlieren möchte?

Docker hat ein sogenanntes Volume, mit dem Daten aus dem Container in ein Dateisystem geschrieben werden können. Es gibt verschiedene Möglichkeiten, mit Volumes zu arbeiten: Sie können ein Verzeichnis vom Docker-Host bereitstellen auf ein Containervolume oder Datenvolumecontainer oder benannte Volumes .

Docker-Volumes sind ein wichtiges Konzept und es lohnt sich, sich die Zeit zu nehmen, um sie zu beherrschen.

Wenn Sie von Ihrem Docker-Host aus problemlos auf die von Ihren Containern verwendeten Daten zugreifen möchten, müssen Sie ein Verzeichnis auf dem Docker-Host bereitstellen. Obwohl es in Bezug auf Berechtigungen und Besitz der Dateien schwierig sein kann

Informationen zu Backups finden Sie im Docker-Benutzerhandbuch . Dort finden Sie alle Informationen zu Volumes.

Ist es eine gute Idee, Puppet zum Erstellen und Verwalten der Docker-Container sowohl für den Entwicklungsserver als auch für den Produktionsserver zu verwenden?

Die beste Vorgehensweise ist, in Ihrer Entwicklungsumgebung genauso zu arbeiten wie in Ihrer Produktionsumgebung. Es hat keinen Sinn, Puppet für Ihre Entwicklungsumgebung richtig einzurichten, wenn all diese Arbeiten nicht für die Produktionsumgebung verwendet werden. Ein Vagrantfile, das ein VM mit Docker bereitstellt, ist mit nur Shell-Bereitstellung wirklich einfach; IMHO-Marionette/Chef/... sind übertrieben .


Sie stellen die richtigen Fragen, aber es gibt keine Antwort, die in alle Situationen passt. Meiner Ansicht nach gibt es zwei Möglichkeiten, Dinge zu tun:

  • lassen Sie Ihre Entwicklungsumgebung genau Ihre Produktionsumgebung replizieren
  • machen Sie Ihre Entwicklungsumgebung anders als die Produktion, indem Sie sie so einfach und unkompliziert wie möglich gestalten, damit Entwickler die Reibung, die durch die Verwendung neuer Tools entsteht, nicht spüren
46
Thomasleveil

Während die Antwort von @Thomasleveil bereits sehr gut ist und alle wichtigen Teile abdeckt, möchte ich einige zusätzliche Punkte hinzufügen.

Vagrant, Puppet/Chef und Docker-Compose

Wenn Sie eine virtuelle Maschine mit Vagrant bereitstellen, verwenden Sie normalerweise Puppet oder Chef, um die erforderlichen Pakete für Ihren Server zu installieren ... zusammen mit einigen Shell-Skripten. PuPHPet ist eine hervorragende Quelle für die Konfiguration eines auf einer virtuellen Maschine basierenden LAMP-Stacks und für das Erlernen, wie Puppet und Vagrant in einem etwas komplexeren Setup zusammenarbeiten. Eine Alternative ist übrigens Protobox .

Wenn Sie Docker-Container mit Vagrant verwenden, verfahren Sie genauso wie mit VMs. Dann führen Sie mit vagrant up Im Wesentlichen Docker-Container mit dem Docker-Provider aus. Vagrant erstellt die Container für Sie aus einer Docker-Datei oder verwendet ein vorhandenes Image, das mehr oder weniger docker-compose (fig) entspricht, und führt sie aus.

Ein Hauptgrund für die Auswahl von Vagrant für Ihre Docker-Einrichtung ist, dass Sie oder Ihr Team teilweise in einer Windows-Umgebung arbeiten, da Vagrant es Ihnen ermöglicht, Ihre Einrichtung konsistent zu halten, unabhängig davon, auf welchem ​​Host-System Sie sich befinden (siehe Host VM ).

Unter OS X können Sie docker-compose Mit einer Virtual Box-VM verwenden. Unter Linux können Sie Docker nativ verwenden. Es ist auch immer möglich, sich über ssh beim boot2docker (oder einer anderen Docker-Host-VM) anzumelden, egal ob Sie unter Windows oder OS X arbeiten.

Hinweis: Sie sollten kein SSH in Ihre Container einfügen, aber das ist ein anderes Thema.

Stand Februar 2015

docker-compose Fühlt sich für mich etwas bissiger an und erledigt auch das Starten, Stoppen und Wiederherstellen von Containern effizienter.

Vagrant hat den Vorteil, eine andere Host-VM anzugeben, z. Pro Projekt, wenn Sie ein solches Setup bevorzugen.

Hinweis: Es gibt auch einen Docker-Bereitsteller, der eher mit einem Puppet-Build-Prozess zusammenhängt.


Sollte es separate Docker-Container für den Webserver (wie Apache), den Datenbankserver (wie MySQL) und jeden Teil der Webanwendung geben?

Bei der Verwendung von Docker-Containern werden grundsätzlich einzelne, isolierte Prozesse ausgeführt. Die Verwendung eines Supervisors sollte vermieden werden und wird auch nicht für einen LAMP-Stack benötigt.

Meine Antwort lautet also definitiv: Ja, es sollte getrennte Container geben!


Wenn ich über Teile der Webanwendung spreche, meine ich Dinge wie mysite.com, controlpanel.mysite.com usw.

Dies hängt von Ihren Bedürfnissen ab. Ich empfehle Ihnen, die 12factor -Anwendungsdokumentation zu lesen, in der die wichtigen Dinge, die Sie erledigen müssen, sehr detailliert beschrieben werden.


Docker-Container scheinen austauschbar zu sein, anstatt dass ich die darin enthaltene Software aktualisieren muss. Was ist mit den Daten, die sie schreiben, die ich nicht verlieren möchte?

Zusätzlich zu @ Thomasleveils Antwort würde ich Ihnen auch ein separates Speicher-Backend für Benutzer-Uploads wie Amazon S3, SFTP oder WebDAV empfehlen.

Meiner Meinung nach sollte Ihr Webanwendungscontainer wie eine Clientanwendung behandelt werden, die auf Ihre Datenbank und Speicher-Backends (Dienste) zugreift, und nicht auf Daten von Volumes angewiesen sein, wenn Sie in einer Produktionsumgebung ausgeführt werden.


Ist es eine gute Idee, Puppet zum Erstellen und Verwalten der Docker-Container sowohl für den Entwicklungsserver als auch für den Produktionsserver zu verwenden?

Ich weiß nichts über die Orchestrierungsfähigkeiten von Puppet, aber für den Bau von Containern, wenn Sie Vagrant verwenden, wird Puppet aufgrund des nativen Docker-Provisioners von Vagrant nicht benötigt.


Bonus

Für all diese Dinge, die oben beschrieben wurden, können Sie sich meine 12factor PHP - Anwendungsvorlage ansehen, die auf Yii 2.0 Framework mit einem dockerisierten LAMP-Stack basiert . Mit Docker können Sie auch problemlos Reverse-Proxys oder Selenium-Testcontainer in Ihr Projekt einbinden, da diese als vorgefertigte Images vorliegen und in wenigen Minuten heruntergeladen und konfiguriert werden können und begann in Sekunden.

13
schmunk