GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

So erstellen Sie einen Docker-basierten LAMP-Stack mit Docker unter Ubuntu 20.04

Der LAMP-Stack

LAMP ist der Software-Stack, auf dem wohl die meisten Websites laufen. Linux stellt die Grundlage des Stacks dar, und die traditionelle Implementierung umfasst Apache als Webserver, die MySQL-Datenbank und PHP als serverseitige Programmiersprache. Es gibt jedoch viele mögliche Variationen:MariaDB wird beispielsweise häufig anstelle von MySQL verwendet, von dem es ein Fork ist, und andere Programmiersprachen, wie Python oder Perl können anstelle von PHP verwendet werden. In diesem Artikel werden wir sehen, wie man einen einfachen LAMP-Stack mit Docker und dem Dienstprogramm docker-compose implementiert.

In diesem Tutorial lernen Sie:

  • So installieren Sie Docker und Docker-Compose unter Ubuntu 20.04
  • So definieren Sie Dienste und Volumes mit Docker-Compose
  • So ordnen Sie Host-Ports Container-Ports in der docker-compose-Konfigurationsdatei zu
  • Verwendung von Bind-Mounts und benannten Volumes
  • So erstellen Sie ein Projekt mit docker-compose

So erstellen Sie einen Docker-basierten LAMP-Stack mit Docker unter Ubuntu 20.04

Softwareanforderungen und verwendete Konventionen

Softwareanforderungen und Linux-Befehlszeilenkonventionen
Kategorie Anforderungen, Konventionen oder verwendete Softwareversion
System Ubuntu 20.04 installiert oder Ubuntu auf 20.04 Focal Fossa aktualisiert
Software docker, docker-compose
Andere Root-Berechtigungen zum Erstellen von Docker-Containern und Starten des Docker-Dienstes
Konventionen # – erfordert, dass bestimmte Linux-Befehle mit Root-Rechten ausgeführt werden, entweder direkt als Root-Benutzer oder durch Verwendung von sudo Befehl
$ – erfordert, dass bestimmte Linux-Befehle als normaler, nicht privilegierter Benutzer ausgeführt werden
  1. Pakete installieren und Docker-Dienst starten

    Um einen Docker-basierten LAMP-Stack auf Ubuntu 20.04 Focal Fossa zu erstellen, müssen wir zunächst die benötigte Software installieren:docker selbst und docker-compose , ein Dienstprogramm, mit dem wir mithilfe von yaml ganz einfach Multi-Container-Anwendungen organisieren können Konfigurationsdateien. Beide Pakete sind in den offiziellen Repositories von Ubuntu verfügbar. Wir können sie über apt installieren :

    $ sudo apt install docker docker-compose
    

    Nachdem die Installation durchgeführt wurde, müssen wir den docker starten service und aktivieren Sie ihn beim Booten. Wir können beide Operationen mit einem einzigen Befehl ausführen:

    $ systemctl enable --now docker
    
  2. Projekteinrichtung

    Der erste Schritt auf unserer Reise besteht in der Erstellung des Verzeichnisses, das wir als Wurzel unseres Projekts verwenden werden. Für diesen Artikel nennen wir es linuxconfig . Innerhalb dieses Verzeichnisses erstellen wir ein weiteres, DocumentRoot , die unsere Website-Dateien hosten wird. Wir können beide Verzeichnisse auf einmal mit dem -p erstellen Option des mkdir Befehl:

    $ mkdir -p linuxconfig/DocumentRoot
    

    Innerhalb der linuxconfig Verzeichnis definieren wir die docker-compose-Konfiguration für unser Projekt in einer yaml-Datei, die standardmäßig docker-compose.yml heißen sollte . Es gibt drei Hauptabschnitte, die wir in der Konfigurationsdatei verwenden können:services , Volumen und Netzwerke .

    Jeder Abschnitt wird verwendet, um den entsprechenden Aspekt eines Projekts zu konfigurieren. In diesem Tutorial verwenden wir nur die ersten beiden. Wir werden die Komponenten des LAMP-Stacks als Dienste in ihren eigenen separaten Containern implementieren.

    Die mit docker-compose erstellten Container sind Mitglieder desselben Netzwerks und können daher standardmäßig miteinander kommunizieren. Im Netzwerk kann jeder Container die anderen über einen Hostnamen referenzieren, der mit ihrem Namen identisch ist, oder über den Namen, der zur Definition des vom Container implementierten Dienstes verwendet wird.

    Standardmäßig werden Container mit dem Namen des Verzeichnisses benannt, das die Konfigurationsdatei als Präfix enthält. In diesem Fall zum Beispiel der Container, der für einen Dienst namens php-httpd verwendet wird , wird linuxconfig_php-httpd_1 genannt .

  3. Definieren des php + httpd-Dienstes

    Der erste Dienst, den wir in der Konfigurationsdatei definieren, wird PHP enthalten als das Apache-Webservermodul. Wir werden eines der offiziellen PHP-Images verwenden, die auf dockerhub verfügbar sind als Basis für unseren Container, speziell den mit dem -apache Suffix, das das oben erwähnte Setup bereitstellt. Beginnen wir mit dem Schreiben unserer Konfiguration:

    version: '3.7'
    
    services:
        php-httpd:
            image: php:7.3-apache
            ports:
                - 80:80
            volumes:
                - "./DocumentRoot:/var/www/html"
    
    

    Das erste, was wir in der Konfigurationsdatei angegeben haben, ist version . Mit dieser Anweisung geben wir an, welche spezifische Version der Compose-Datei wir verwenden werden. Zum Zeitpunkt des Schreibens Version 3.7 ist die neueste und empfohlene.

  4. Nachdem wir die Compose-Dateiversion deklariert hatten, begannen wir mit dem Schreiben des Dienstes Strophe; Darin definieren wir die Dienste, die unseren LAMP-Stack bilden. Wir haben den ersten Dienst php-httpd genannt . Der Dienstname ist völlig willkürlich, aber es ist immer eine gute Angewohnheit, einen im Kontext des Projekts aussagekräftigen Namen zu verwenden.

    Das image Instruktion wird verwendet, um anzugeben, auf welchem ​​Image der Container basieren soll, in diesem Fall php:7.3-apache .

    Die ports Die Anweisung wird verwendet, um Ports auf dem Container verfügbar zu machen und eine Zuordnung zwischen Host-Ports und Container-Ports zu erstellen. Eine solche Karte wird definiert, indem die Ports mit einem : getrennt werden . Auf der linken Seite geben wir den Host-Port an und auf der rechten Seite den Port innerhalb des Containers, dem er zugeordnet werden soll. In diesem Fall haben wir Port 80 zugeordnet auf dem Host auf Port 80 auf dem Container, da dies der vom Apache-Webserver verwendete Standardport ist.

    Die letzte Anweisung, die wir verwendet haben, ist volumes :Damit können wir eine Zuordnung zwischen einem benannten Volume angeben oder ein Pfad (relativ oder absolut) auf dem Hostsystem zu einem Pfad auf dem Container, auf dem es gemountet wird.

    In unserem Setup ist die Datei ./DocumentRoot Das Verzeichnis hostet die Site-Dateien:Es wird auf /var/www/html gemountet -Verzeichnis innerhalb des Containers, da letzteres das Dokumentenstammverzeichnis ist, das vom Standard-Apache VirtualHost verwendet wird. Eine solche Einrichtung wird als bind mount bezeichnet und ist besonders nützlich während der Entwicklung, da die Änderungen, die wir an den Projektdateien vornehmen, sofort im Container widergespiegelt werden. Der Nachteil dieser Konfiguration besteht darin, dass sie eine Abhängigkeit zwischen dem Container und der Dateistruktur des Hostcomputers herstellt, wodurch einer der Hauptvorteile der Verwendung von Docker verringert wird:die Portabilität.

    Das Verzeichnis, das innerhalb des Containers gemountet werden soll, wird automatisch erstellt, wenn es beim docker-compose up nicht vorhanden ist Befehl gestartet:In diesem Fall gehört er root, wenn nicht anders angegeben.

    Innerhalb des DocumentRoot Verzeichnis können wir jetzt eine Indexdatei erstellen und versuchen, unser Projekt zu erstellen, um zu überprüfen, ob das Setup funktioniert:

    $ echo "<?php phpinfo();" > DocumentRoot/index.php
    $ sudo docker-compose up -d
    

    Nach dem Ausführen des Befehls werden die benötigten Docker-Images von Dockerhub heruntergeladen und die Container werden mit den von uns bereitgestellten Einstellungen erstellt und im Hintergrund ausgeführt (sie blockieren das Terminal nicht), da -d Option, die wir für docker-compose bereitgestellt haben Befehl. Wenn das Projekt läuft und läuft, navigieren wir zu localhost mit unserem Browser sollten wir die folgende Seite sehen:



    Die phpinfo-Seite

    Um das Projekt zu stoppen, aus dem Verzeichnis, in dem sich docker-compose.yml befindet Datei können wir ausführen:

    $ sudo docker-compose stop
    

    Den MariaDB-Dienst definieren

    Ein wesentlicher Bestandteil des LAMP-Stacks ist die Datenbankschicht. In unserer Konfiguration verwenden wir MariaDB und sein offizielles Docker-Image auf Dockerhub verfügbar:

    version: '3.7'
    
    services:
        php-httpd:
            image: php:7.3-apache
            ports:
                - 80:80
            volumes:
                - "./DocumentRoot:/var/www/html"
    
        mariadb:
            image: mariadb:10.5.2
            volumes:
                - mariadb-volume:/var/lib/mysql
            environment:
                TZ: "Europe/Rome"
                MYSQL_ALLOW_EMPTY_PASSWORD: "no"
                MYSQL_ROOT_PASSWORD: "rootpwd"
                MYSQL_USER: 'testuser'
                MYSQL_PASSWORD: 'testpassword'
                MYSQL_DATABASE: 'testdb'
    
    volumes:
        mariadb-volume:
    

    Innerhalb der Dienste Strophe haben wir einen weiteren Dienst definiert und nennen ihn mariadb und mit dem image Anweisung haben wir angegeben, dass wir 10.5.2 verwenden möchten Version des offiziellen Bildes.

    In der vorherigen Service-Definition haben wir ein Bind-Mount verwendet. Dieses Mal haben wir stattdessen ein richtiges Docker-benanntes Volume verwendet , zum Einhängen unter /var/lib/mysql innerhalb des Containers (es ist das von MariaDB verwendete Standarddatenverzeichnis). Im Gegensatz zu einem Bind-Mount erstellen benannte Volumes keine Abhängigkeiten des Containers von der Host-Dateisystemstruktur. Sie werden vollständig von Docker verwaltet und sind die empfohlene Methode, um Daten zu speichern, die ansonsten verloren gehen würden, wenn Container zerstört werden.

    Benannte Volumes können in den Haupt-volumes definiert werden Strophe der Konfigurationsdatei und kann von den volumes referenziert werden Unterabschnitt der einzelnen definierten Dienste. In diesem Fall haben wir unser Volume mariadb-volume genannt .

    Als nächsten Schritt haben wir den Wert einiger Umgebungsvariablen definiert verwendet, um das Containerverhalten zu beeinflussen. Umgebungsvariablen werden in environment definiert Abschnitt einer Dienstdefinition. Die von uns definierten Variablen haben in diesem Fall folgende Wirkung:

    Variable Effekt
    TZ Stellen Sie die vom MariaDB-Server verwendete Zeitzone ein
    MYSQL_ALLOW_EMPTY_PASSWORD Aktivieren oder deaktivieren Sie die Verwendung eines leeren Passworts für den db-Root-Benutzer
    MYSQL_ROOT_PASSWORD Dies ist eine obligatorische Variable und wird verwendet, um das Kennwort des DB-Root-Benutzers festzulegen
    MYSQL_DATABASE Optional verwendet, um den Namen der Datenbank anzugeben, die beim Starten des Images erstellt werden soll
    MYSQL_USER Optional verwendet, um den Namen eines Benutzers anzugeben, der mit Superuser-Berechtigungen für die mit MYSQL_DATABASE angegebene Datenbank erstellt wird
    MYSQL_PASSWORT Wird verwendet, um das Passwort für den Benutzer anzugeben, der mit dem von MYSQL_USER bereitgestellten Namen erstellt wurde

    An diesem Punkt sollten wir einen funktionierenden Webserver haben, der mit PHP arbeiten kann, und eine Datenbank, um unsere Daten zu speichern.

    Bonus – phpMyAdmin

    Unser grundlegender LAMP-Stack sollte nun vollständig sein. Als Bonus möchten wir vielleicht phpMyAdmin hinzufügen dazu, um unsere MariaDB-Datenbank einfach über eine benutzerfreundliche Weboberfläche zu steuern. Lassen Sie uns die zugehörige Dienstdefinition zu unserer docker-compose-Konfiguration hinzufügen:

    version: '3.7'
    
    services:
        php-httpd:
            image: php:7.3-apache
            ports:
                - 80:80
            volumes:
                - "./DocumentRoot:/var/www/html"
    
        mariadb:
            image: mariadb:10.5.2
            volumes:
                - mariadb-volume:/var/lib/mysql
            environment:
                TZ: "Europe/Rome"
                MYSQL_ALLOW_EMPTY_PASSWORD: "no"
                MYSQL_ROOT_PASSWORD: "rootpwd"
                MYSQL_USER: 'testuser'
                MYSQL_PASSWORD: 'testpassword'
                MYSQL_DATABASE: 'testdb'
    
        phpmyadmin:
            image: phpmyadmin/phpmyadmin
            links:
                - 'mariadb:db'
            ports:
                - 8081:80
    
    volumes:
        mariadb-volume:
    

    Wir haben unseren Dienst phpmyadmin genannt und es so konfiguriert, dass es phpmyadmin/phpmyadmin verwendet Bild von dockerhub. Wir haben auch die links verwendet Schlüsselwort zum ersten Mal; wofür ist das? Wie wir bereits wissen, können alle Container, die in derselben Docker-Compose-Konfiguration erstellt wurden, standardmäßig und ohne dass spezielle Konfigurationen erforderlich sind, miteinander kommunizieren. Das phpMyAdmin-Image ist so konfiguriert, dass es durch db auf einen laufenden Datenbankcontainer verweist name, daher müssen wir einen Alias ​​mit demselben Namen für unseren mariadb-Dienst erstellen. Das ist genau das, was links wird verwendet für:um zusätzliche Aliase zu definieren, um einen Dienst von einem anderen aus zu erreichen.

    Innerhalb der Dienstdefinition haben wir auch Port 8081 zugeordnet unseres Host-Rechners an Port 80 innerhalb des Containers (Port 80 ist bereits demselben Port innerhalb des php-httpd-Containers zugeordnet). Die phpMyAdmin-Oberfläche ist daher unter localhost:8081 erreichbar die Anschrift. Lassen Sie uns unser Projekt neu erstellen und überprüfen:

    $ sudo docker-compose up -d --build
    


    Die Anmeldeseite von PhpMyAdmin

    Wir können uns mit den Anmeldeinformationen anmelden, die wir für unseren Datenbankdienst definiert haben, und überprüfen, ob die Datei testdb Datenbank wurde erstellt:



    PhpMyAdmin-Homepage

    Ein benutzerdefiniertes Image für einen Dienst verwenden

    In den obigen Beispielen haben wir in unserer Dienstdefinition immer Vanilla-Images verwendet. Es gibt Fälle, in denen wir darauf basierende benutzerdefinierte Docker-Images verwenden möchten. Angenommen, wir möchten den Dienst php-httpd erstellen, aber eine zusätzliche PHP-Erweiterung hinzufügen:Wie können wir das tun? Im Stammverzeichnis des Projekts definieren wir ein neues Verzeichnis und benennen es der Einfachheit halber nach dem Dienst:

    $ mkdir php-httpd
    

    In diesem Verzeichnis erstellen wir ein Dockerfile, das zum Erweitern des Basisimages verwendet wird, mit folgendem Inhalt:

    FROM php:7.3-apache
    LABEL maintainer="[email protected]"
    
    RUN apt-get update && apt-get install -y libmcrypt-dev \
        && pecl install mcrypt-1.0.2 \
        && docker-php-ext-enable mcrypt
    

    Zurück in unserer docker-compose.yml -Datei ändern wir die Definition des php-httpd Service. Wir können das Bild nicht wie zuvor direkt referenzieren. Stattdessen geben wir das Verzeichnis mit unserem benutzerdefinierten Dockerfile als Build-Kontext an:

    version: '3.7'
    
    services:
        php-httpd:
            build:
                context: ./php-httpd
            ports:
                - 80:80
            volumes:
                - "./DocumentRoot:/var/www/html"
    [...]
    

    Im build Abschnitt definieren wir Konfigurationen, die zur Build-Zeit angewendet werden. In diesem Fall haben wir context verwendet um auf das Verzeichnis zu verweisen, das das Dockerfile enthält:Dieses Verzeichnis wird als Build-Kontext verwendet, und sein Inhalt wird an den Docker-Daemon gesendet, wenn der Container erstellt wird. Um die Änderung anzuwenden, müssen wir das Projekt neu erstellen.

    Übrigens, um mehr über zusätzliche Erweiterungen im PHP-Docker-Image zu erfahren, können Sie sich die offizielle Dokumentation und insbesondere die PECL-Erweiterungen ansehen Abschnitt.

    Schlussfolgerungen

    In diesem Tutorial haben wir gesehen, wie man einen einfachen LAMP-Stack mithilfe der Container-Technologie mit Docker und docker-compose erstellt. Wir haben gesehen, wie die verschiedenen Dienste in der Konfigurationsdatei docker-compose.yml definiert werden und wie Bind-Mounts, benannte Volumes und die Zuordnung von Host-Container-Ports konfiguriert werden. Wir haben auch gesehen, wie man benutzerdefinierte Bilder verwendet. In der Docker-Compose-Referenz finden Sie eine detaillierte Liste der Anweisungen, die in der Docker-Compose-Konfigurationsdatei verwendet werden können.


Ubuntu
  1. So installieren Sie den LAMP-Stack unter Ubuntu 18.04

  2. So erstellen Sie ein VPN unter Ubuntu 20.04 mit Wireguard

  3. So installieren Sie Docker unter Ubuntu 22.04

  4. So verwenden Sie Puppet-Module zum Erstellen eines LAMP-Stacks unter Ubuntu 20.04

  5. So erstellen Sie RAID-Arrays mit MDADM unter Ubuntu

So installieren Sie den LAMP-Stack unter Ubuntu 16.04

So installieren Sie den LAMP-Stack unter Ubuntu 17.04

So installieren Sie den LAMP-Stack unter Ubuntu 17.10

So installieren Sie den LAMP-Stack unter Ubuntu 20.04

Wie erstelle ich einen Link zu einem Ordner in Ubuntu 18.04 mit Gui?

So installieren Sie Gitea auf Ubuntu mit Docker