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 pull
in 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!
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 up
Sie 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 wiedocker-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-compose
eine 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) anzumeldenssh
, 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.
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!
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.
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.
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.
quelle