Erstellen einer Docker-basierten Webentwicklungsumgebung

    Unter der Katze erkläre ich Ihnen, wie ich die automatische Erstellung und Bereitstellung einer Webentwicklungsumgebung auf Basis von Docker , Fig , DNSMasq und nsenter verbessert habe . Dies ist in der Tat die Bereitstellung des LAMP-Servers und die Aufzeichnung darüber in DNSMasq. Die Prioritäten liegen jedoch darin, dass der Hostcomputer nicht mit unnötiger Software wie Web- und DB-Servern auf dem Hostcomputer verstopft wird und die Mindestanzahl der auszuführenden Befehle erreicht wird

    Vorwort


    Im vorherigen Artikel http://habrahabr.ru/post/236573/ habe ich darüber gesprochen, wie eine schnelle Bereitstellungsumgebung für die Webentwicklung auf der Basis von VirtualBox organisiert werden kann. Gleichzeitig haben erfahrenere Habrauser mir geraten, Docker in Betracht zu ziehen. Danach öffnete ich den Mann und begann zu experimentieren und sammelte für mich drei Container mit verschiedenen Versionen von PHP ( 5.3 , 5.4 und 5.5 ), die ich erfolgreich und bequem verwendete. Es bestand in der Zukunft der Wunsch, das Bootstrap-Skript in einer vernünftigeren Sprache umzuschreiben und dies alles irgendwie zu organisieren und einen Mann zu schreiben. Aber wie immer erreichten die Hände dies nicht und hätten es höchstwahrscheinlich nie erreicht, wenn ich an Heiligabend versehentlich mein Heimatverzeichnis gelöscht hätteHafenarbeiter . Ja, das tut es. Am Ende wurde alles neu geschrieben, neu organisiert und auf GitHub hochgeladen .

    Was brauchen wir


    1. Docker.IO ( https://www.docker.com/ )
    2. Feige ( http://www.fig.sh )
    3. DNSMasq ( http://www.thekelleys.org.uk/dnsmasq/doc.html )
    4. nsenter ( https://github.com/jpetazzo/nsenter )


    Was ist los?


    Beim Start über ein Skript werden figalle erforderlichen Container mithilfe von erweitert und verknüpft. Wenn danach eine Datei mit einem Datenbank-Dump angegeben wird, wird der Dump in die erstellte Datenbank im Container geschrieben. Als nächstes werden Containereinträge zur DNSMasq- Konfiguration hinzugefügt und der Dämon neu gestartet .
    Beim Herunterfahren mithilfe eines Skripts wird die Datenbank in die Datei zurückgespeichert, Datensätze aus der DNSMasq-Konfiguration werden entfernt und der Dämon wird neu gestartet .

    Wie stelle ich es ein?


    Minimale DNSMasq- Konfiguration erforderlich :
    # cat /etc/dnsmasq.conf | grep -E -v '^(#.*)?$'
    listen-address=127.0.0.1
    

    Um all diese Dinge zu erledigen, klonen wir das Repository https://github.com/dvapelnik/efig und suchen dort nach dem Daddy .efig, den wir in den Projektordner legen. Dieser Ordner hat bereits:
    1. logs - Verzeichnis für Webserver-Protokolle
    2. xd_profile, xd_trace- zwei Verzeichnisse für XDebug-Dateien
    3. db - ein Verzeichnis für die Arbeit mit Datenbanken mit zwei Skripten für die Bereitstellung und Sicherung
    4. efig.yml - config für fig
    5. efig.conf - efig config
    6. httpd.conf - apache2 config
    7. efig.sh - Das efig-Skript selbst funktioniert

    In müssen efig.ymlSie den Datenbanknamen, den Benutzernamen für die Datenbank und das Kennwort angeben. Bei Bedarf dann eine Datenbank für Tests. Damit die Datenbank ordnungsgemäß bereitgestellt und zurückgespeichert wird, müssen Sie angeben, wie die Namen der Datenbanken Dateien mit Speicherauszügen zugeordnet werden.
    E_DB_DUMPDateiname für die Hauptdatenbank
    E_DB_NAMEHauptdatenbankname
    E_DB_TEST_DUMPDateiname der Testdatenbank
    E_DB_TEST_NAMEName der Testdatenbank

    Wenn die Testdatenbank nicht benötigt wird, können die letzten beiden Zeilen den Namen der Testdatenbank kommentieren und aus der Variablen entfernen DB_NAME. Dateien mit Speicherauszügen werden relativ zum Ordner gesucht db.
    httpd.confKonfigurieren Sie für Ihre Anwendung.
    Die efig.conffolgenden Werte sind angegeben
    PROJECT_NAMEProjektname (wird in der URL verwendet )
    FIG_CONFKonfigurationsname für fig
    SUBDOMAINS_ENABLEDob Subdomains für jeden Container erstellt werden sollen
    DNS_ZONEUrsprünglich verwendete DNS-Zone für Projekte .doc
    MAIN_CONTAINER_NAMEName des Hauptcontainers , anfangs web(wir nehmen von fig-config)
    DB_CONTAINER_NAMEName des DB-Containers, anfangs db(wir nehmen von fig-config)
    DNSMASQ_CONFIG_PATHPfad zur DNSMasq- Konfiguration

    Ergänzung zu SUBDOMAINS_ENABLED
    Zum Beispiel, damit auf den Datenbankcontainer über den Domänennamen zugegriffen werden kann (zum Beispiel http: //db.myproject.doc/ und nicht über die IP- Adresse , die sich bei jedem Start ständig ändert).


    Und jetzt Mit all diesen Konfigurationen, Ordnern und Skripten werden wir versuchen, uns zu befreien versuche zu rennen


    Um ausziehen zu können, müssen Sie in den Ordner gehen .efigund das Skript ausführen durch sudo:
    sudo ./efig.sh
    

    Zu diesem Zeitpunkt werden die Container gestartet, die Datenbanken bereitgestellt, den /etc/dnsmasq.confDatensätzen über neue Container hinzugefügt und der Dämon neu gestartet . Danach können wir dem Link im Browser http: //project.doc/ folgen und unser Projekt bereits im Browser beobachten.
    Um Container zu trennen, zu löschen und die Datenbanken zu sichern, schreiben wir im selben Ordner ( .efig) Folgendes:
    sudo ./efig.sh rm
    

    Die Datenbanken werden in die Dateien zurückgespeichert, die Container werden angehalten und gelöscht - alles ist wie vorgesehen sauber.

    Welche Bilder sollten für Container verwendet werden?


    Als Web-Container empfehle ich Ihnen, Bilder zu verwenden, die monoton konfiguriert sind ( Bilder, die auf Debian / Ubuntu mit früheren Versionen von PHP (5.3, 5.4, 5.5, 5.6) basieren, sind auf DockerHub verfügbar ). Die Pakete für PHP wurden unter Berücksichtigung des erforderlichen YiiFrameworks (1, 2) ausgewählt. Bei Bedarf können Sie weitere für die Entwicklung erforderliche Pakete hinzufügen. Als DB-Container verwende ich ein Image von sameersbn.

    Und üben?


    Sie können beispielsweise versuchen, dasselbe Joomla-CMS bereitzustellen (mir ist es zuerst als CMS eingefallen, das einfach bereitzustellen ist und die Datenbank selbst generiert):
    1. Repos efigvon Github klonen
    2. Joomla CMS Archiv ziehen
    3. Auspacken
    4. Kopieren Sie .efigin den Ordner mit Joomla CMS
    5. Geben Sie die .efig/efig.ymlParameter für die Datenbank an
    6. Wir gründen dieses Geschäft. cd .efig/ && sudo bash ./efig.sh
    7. Genieße das Leben Wir schauen / installieren
    8. Stop-Delete cd .efig/ && sudo bash ./efig.sh rm


    Vergangenheit, Gegenwart und Zukunft?


    Zumindest wurde dies für sich selbst geschrieben, um die Bereitstellung von Anwendungen zu vereinfachen, wenn auch nur, um sie zu starten. Ich weiß nicht wie, aber es stört mich, irgendwo eine neue Unterdomäne anzulegen und dort Dateien hochzuladen oder Unterordner für verschiedene Projekte zu verwenden. Außerdem wollte ich alle 4 Versionen von PHP haben . Als Wünsche und meine Bedürfnisse werde ich beenden, was schon da ist. Ich habe vor, die PostgreSQL- Unterstützung einzuschrauben , aber da ich sie selbst noch nicht benutze, habe ich sie nicht eingeschraubt. Das Skript wurde unter Ubuntu OS ausgeführt , aber ich glaube nicht, dass andere Linux-Distributionen Probleme haben sollten. Eine Überprüfung auf andere Distributionen war nicht möglich.

    Links?


    1. Projekt-Repository auf GitHub : https://github.com/dvapelnik/efig
    2. Image-Repository für Docker auf GitHub : https://github.com/dvapelnik/docker-lap
    3. Image- Repository für Docker auf DockerHub : https://registry.hub.docker.com/u/dvapelnik/docker-lap/


    Fallstricke?


    1. Wenn kein Datenbank-Dump vorhanden ist und die Datenbank von selbst generiert wird (Migrationen, Bereitstellung wie Joomla CSM usw.), wird die Datenbank beim Trennen der Verbindung zwar gesichert, aber als Root gesichert . Dies liegt daran, dass sich der Speicherauszug in Containern tatsächlich unter dem Container-Stammverzeichnis befindet. Bevor Sie beginnen, können Sie eine leere Datei erstellen, in die die Datenbank beim Herunterfahren abgelegt wird. Dies ist eine solche Problemumgehung. Eine ähnliche Situation bei Webcontainern. Wenn Sie einen Ordner in den Container einhängen, werden alle Dateien, die aus dem Container erstellt werden, vom Root erstellt. Ich beschreibe die Problemumgehung, die ich verwendet habe: Ein Esel- Benutzer wird im Container erstelltmit einer solchen UID und GID als Benutzer, unter der ich die Entwicklung durchführen werde. Ich habe es gleich 1000. Wenn sich die UID und GID Ihres Benutzers von 1000 unterscheidet, müssen Sie die entsprechende Docker-Datei nehmen und die UID und GID des Benutzers dort ersetzen und das Image neu erstellen. Für E-Datenbank-Images ist dies nicht besonders kritisch, aber beim Dumping kriecht es seitwärts. Weil so eine Krücke.
    2. Eine vernünftige Frage stellt sich: Wie komme ich zur Datenbank im Container? Es ist logisch und genau dafür habe ich die Option gewählt, Domainnamen für alle Container zu erstellen SUBDOMAINS_ENABLED. Wenn das Flag gesetzt ist 1, wird es für alle Container durch Eintrag in der DNSMasq- Konfiguration im Formular erstellt CONTAINER_NAME.PROJECT_NAME.DNS_ZONE. Der Container spuckt einen Port für den Zugriff auf die Datenbanken aus und kann unter Verwendung dieser Domain-, Port- und Benutzerinformationen erreicht werden, die in registriert wurdenefig.conf

    Jetzt auch beliebt: