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

70

In den dunklen Zeiten bestand meine übliche Einrichtung 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 war, loggte ich mich beim Server und git pullin der Staging-Umgebung ein. Angenommen, auf dem Server funktioniert alles genauso gut wie auf meinem Computer, würde ich das Gleiche für die Produktion tun.

Neue Anfänge…

Jetzt starte ich eine brandneue Webanwendung von Grund auf neu und möchte sie "richtig" machen. Ich habe über Docker, Vagrant und Puppet (und Chef, obwohl ich persönlich das Abhängigkeitssystem von Puppet dem iterativen Prozess von Chef vorziehe) gelesen. Trotz all meiner Nachforschungen 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 der Webanwendung geben?

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

Da Docker vorgefertigte Container für Web- und Datenbankserver bereitzustellen scheint, 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 Container der Anwendung geschrieben werden (da ich sie beim Aktualisieren möglicherweise ersetzen kann?). Wohin gehen sie also? ? Direkt in das Dateisystem der Host-Computer? Oder in ein separates "Docker Volume"? Wenn sie in Docker-Volumes gehen, sollte ich ein separates Volume für die Datenbank, den Webserver, die Anwendung usw. verwenden? Kann ich von meinem lokalen Computer aus wie immer noch problemlos über SFTP auf die Inhalte zugreifen? 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, dass 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) einfach von Grund auf neu einzurichten.

Hoffentlich habe ich einige relevante Fragen gestellt; Es wäre großartig, einige geeignete "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!

Robert
quelle

Antworten:

47

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, Ihre Docker-Container in Ihrer Entwicklungsumgebung so auszuführen, wie sie in der Produktion sind. Andernfalls verwenden Sie einfach die Docker-Container so einfach wie möglich.

Der Docker-Hub bietet einsatzbereite Container für PHP, Datenbanken usw. und ist einfach zu verwenden. Auf der anderen Seite müssen Sie sie miteinander verknüpfen , damit sie interagieren können. Für eine Entwicklungsumgebung und wenn Sie mehrere Container verwenden, würde ich empfehlen, Docker-Compose zu verwenden .

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 / Baseimage an .

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

Sie könnten sie trennen lassen. Wenn diese Apps Sitzungen gemeinsam nutzen 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 und 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 auf ein Container-Volume mounten oder Daten-Volume-Container oder benannte Volumes verwenden .

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, in dem alles aufgeführt ist, was Sie in Bezug auf Volumes wissen müssen.

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 besteht darin, in Ihrer Entwicklungsumgebung genauso zu arbeiten wie in Ihrer Produktionsumgebung. Es macht keinen Sinn, die Puppe für Ihre Entwicklungsumgebung richtig einzurichten, wenn all diese Arbeiten nicht für die Produktionsumgebung verwendet werden. Ein Vagrantfile zu haben, das eine VM mit Docker bereitstellt, ist mit nur einer Shell-Bereitstellung wirklich einfach . IMHO Marionette / Koch / ... sind übertrieben.


Sie stellen die richtigen Fragen, aber es gibt keine Antwort, die für alle Situationen geeignet ist. 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 und halten Sie sie so einfach und unkompliziert wie möglich, damit Entwickler die Reibung, die durch die Verwendung neuer Tools entsteht, nicht spüren
Thomasleveil
quelle
Danke, das ist eine großartige Antwort!
Robert
13

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, um einen LAMP-Stack auf Basis einer virtuellen Maschine zu konfigurieren und zu lernen, wie Puppet und Vagrant in einem etwas komplexeren Setup zusammenarbeiten. Eine Alternative ist übrigens Protobox .

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

Ein Hauptgrund für die Wahl von Vagrant für Ihr Docker-Setup ist, dass Sie oder Ihr Team teilweise in einer Windows-Umgebung arbeiten, da Sie mit Vagrant Ihr Setup unabhängig von Ihrem Host-System konsistent halten können (siehe Host-VM ).

Wenn Sie unter OS X arbeiten, können Sie docker-composeeine Virtual Box-VM verwenden. Wenn Sie unter Linux arbeiten, können Sie Docker nativ verwenden. Es ist auch immer möglich, sich über boot2docker (oder eine andere Docker-Host-VM) anzumelden ssh, unabhängig davon, ob Sie Windows oder OS X verwenden.

Hinweis: Sie sollten nicht SSH in Ihre Container einbinden, 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 Umbauen 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-Provisioner, der eher mit einem Puppet-Erstellungsprozess verwandt ist.


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

Wenn Sie Docker-Container verwenden, führen Sie grundsätzlich einzelne, isolierte Prozesse aus. Die Verwendung eines Supervisors sollte vermieden werden und wird auch für einen LAMP-Stapel nicht benötigt.

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


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

Dies hängt von Ihren Anforderungen ab. Ich empfehle Ihnen, die 12factor- Anwendungsdokumentation zu lesen , in der die wichtigen Dinge, die zu erledigen sind, 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 und die ich nicht verlieren möchte?

Neben der Antwort von @ Thomasleveil 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 diese 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 Orchestrierungsfunktionen von Puppet, aber für das Erstellen von Containern, wenn Sie Vagrant verwenden, sehe ich aufgrund des nativen Docker-Provisioners von Vagrant keine Notwendigkeit für Puppet.


Bonus

Für all die oben beschriebenen Dinge können Sie sich meine 12-Faktor-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 Selen-Testcontainer in Ihr Projekt einbinden, da diese als vorgefertigte Images vorhanden sind und in wenigen Minuten heruntergeladen und konfiguriert und in Sekunden gestartet werden können.

schmunk
quelle