Was wäre ein guter Docker-Webdev-Workflow?


121

Ich habe eine Ahnung, dass Docker die Vermutung, meinen Webdev-Workflow erheblich verbessern könnte - aber ich habe es noch nicht ganz geschafft, mich mit einem Projekt zu befassen, das Docker zum Stack hinzufügt.

Der grundlegende Software-Stack würde folgendermaßen aussehen:

Software

  • Docker-Image (s) mit benutzerdefiniertem LAMP-Stack

    • Apache mit mehreren Modulen
    • MYSQL
    • PHP
    • Einige CMS, zB Silverstripe
  • GIT

Arbeitsablauf

Ich könnte mir vorstellen, dass der Workflow ungefähr so ​​aussieht:

Entwicklung

  1. Schreiben Sie einen Dockerfile, der einen LAMP-Container definiert, der die oben angegebenen Anforderungen erfüllt
    • REQ: Der Computer sollte Apache / MySQL direkt nach dem Booten starten
  2. Erstellen Sie das Docker-Image
  3. Kopieren Sie die zum Ausführen des CMS erforderlichen Dateien in z ~/dev/cmsdir
    • Setzen Sie ~/dev/cmsdir/unter Versionskontrolle
  4. Führen Sie die Docker Container, und irgendwie montieren ~/dev/cmsdirzu /var/www/auf den Behälter
  5. Füllen Sie die Datenbank
  6. Arbeite in /dev/cmsdir/
  7. Docker-Container festschreiben und herunterfahren

Einsatz

  1. Remote-Host einrichten (zB mit ansible)
  2. Verschieben Sie das Container-Image auf den Remote-Host
  3. Fetch- cmsdirProjekt über Git
  4. Führen Sie den Docker-Container aus, ziehen Sie die Datenbank ein und mounten Sie cmsdirin/var/www

Nun, auf dem Papier sieht das alles ganz gut aus, ABER ich bin mir nicht ganz sicher, ob dies überhaupt der richtige Ansatz wäre.

Fragen:

  1. Wie kann ich die Datenbank während der lokalen Entwicklung zwischen den Neustarts der Containerinstanz beibehalten? Oder müsste ich jedes Mal SQL-Dump ausführen, bevor ich den Container herunterfahre?

  2. Sollte ich separate Containerinstanzen für die Datenbank und den Apache-Server haben? Oder würde es ausreichen, einen einzigen Behälter für den oben genannten Anwendungsfall zu haben?

  3. Wie kann ich bei gleichzeitiger Verwendung separater Container für Datenbank und Server das gleichzeitige Hoch- und Runterdrehen automatisieren?

  4. Wie würde ich tatsächlich /dev/cmsdir/in das Container- /var/www/Verzeichnis einbinden? Sollte ich dafür Datenmengen verwenden ?

  5. Habe ich irgendwelche Fallstricke verpasst? Was könnte vereinfacht werden?


1
Diese Frage scheint für einige Leute interessant zu sein. Jemand scheint kürzlich eine Blogpost-Serie zu diesem Thema geschrieben zu haben. Da es noch nicht fertig ist, werde ich den Link in diesem Kommentar
posten

Antworten:


46
  1. Wenn Sie eine Datenbankpersistenz unabhängig von Ihrem CMS-Container benötigen, können Sie einen Container für MySQL und einen Container für Ihr CMS verwenden. In diesem Fall kann Ihr MySQL-Container noch ausgeführt werden und Sie können Ihr CMS so oft neu bereitstellen, wie Sie möchten.

    Für die Entwicklung - Eine weitere Option besteht darin, MySQL-Datenverzeichnisse von Ihrem Host / Entwicklungscomputer mithilfe von Datenmengen zuzuordnen. Auf diese Weise können Sie Datendateien für MySQL (im Docker) mit git (auf dem Host) verwalten und den Anfangszustand jederzeit "neu laden" (bevor Sie den MySQL-Container starten).

  2. Ja, ich denke, Sie sollten einen separaten Container für db haben.

  3. Ich benutze nur ein einfaches Skript:

    #!/bin/bash
    
    $JOB1 = (docker run ... /usr/sbin/mysqld)
    $JOB2 = (docker run ... /usr/sbin/apache2)
    echo MySql=$JOB1, Apache=$JOB2
    
  4. Ja, Sie können den Datenvolumen -v-Schalter verwenden. Ich würde dies für die Entwicklung verwenden. Sie können die schreibgeschützte Bereitstellung verwenden, sodass bei Bedarf keine Änderungen an diesem Verzeichnis vorgenommen werden (Ihre App sollte die Daten ohnehin an einem anderen Ort speichern).

    docker run -v=/home/user/dev/cmsdir:/var/www/cmsdir:ro image /usr/sbin/apache2
    

    Wie auch immer, für die endgültige Bereitstellung würde ich mit Dockerfile mit erstellen und ein Image erstellen ADD /home/user/dev/cmsdir /var/www/cmsdir

  5. Ich weiß es nicht :-)


6
Ich schrieb ein Tutorial über das Schreiben eines MySQL-Containers, das implementiert, wovon Sie in # 1 sprechen. txt.fliglio.com/2013/11/creating-a-mysql-docker-container
ben schwartz

48
Es muss definitiv mehr Tutorials / Best Practices für diesen Prozess geben. :(
Reza S

Dieses Tutorial könnte Ihnen eine Richtung geben ..
Pithikos

Wenn Sie Code von Github in Docker abrufen möchten, schlägt dieser Link schreibgeschützte SSH-Schlüssel vor (damit das Docker-Image öffentlich aufgeführt werden kann). Slash-dev-blog.me/docker-git.html
jhtong

4
@ RoyTruelove ab 2015, Feige ist jetzt zugunsten von Docker-Compose veraltet
allan.simon


4

Ich verstehe, dass dieser Beitrag zu diesem Zeitpunkt über ein Jahr alt ist, aber ich habe mir kürzlich sehr ähnliche Fragen gestellt und habe einige großartige Antworten auf Ihre Fragen.

  1. Sie können eine MySQL-Docker-Instanz einrichten und Daten in einem zustandslosen Datencontainer beibehalten, auch wenn der Datencontainer nicht aktiv ausgeführt werden muss

  2. Ja, ich würde empfehlen, eine separate Instanz für Ihren Webserver und Ihre Datenbank zu haben. Dies ist die Stärke von Docker.

  3. Schauen Sie sich dieses Repo an, das ich gebaut habe. Grundsätzlich ist es so einfach wie make build& make runund Sie können einen Webserver und einen Datenbankcontainer lokal ausführen.

  4. Sie verwenden das -vArgument, wenn Sie den Container zum ersten Mal ausführen. Dadurch wird ein bestimmter Ordner auf dem Container mit dem Host verknüpft, auf dem der Container ausgeführt wird.

  5. Ich denke, Ihre Ideen sind großartig und es ist derzeit möglich, alles zu erreichen, was Sie verlangen.

Hier ist eine schlüsselfertige Lösung , die alle von Ihnen aufgeführten Anforderungen erfüllt.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.