So erstellen Sie einen Docker -basierten Lampenstapel mit Docker auf Ubuntu 20.04

So erstellen Sie einen Docker -basierten Lampenstapel mit Docker auf Ubuntu 20.04

Der Lampenstapel

Lampe ist der Software -Stapel, auf dem wahrscheinlich die meisten Websites ausgeführt werden. Linux repräsentiert die Grundlage des Stapels, und die herkömmliche 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 denen es sich um eine Gabel handelt, und andere Programmiersprachen, da Python oder Perl anstelle von PHP verwendet werden können. In diesem Artikel sehen wir, wie Sie einen Basis-Lampenstapel mit Docker und dem Docker-Compose-Dienstprogramm implementieren können.

In diesem Tutorial lernen Sie:

  • So installieren Sie Docker und Docker-Compose auf Ubuntu 20.04
  • So definieren Sie Dienste und Volumes mit Docker-Compose
  • So kartieren Sie Host-Ports in Containerports in der Docker-Compose-Konfigurationsdatei
  • So verwenden Sie Bindmontage und benannte Volumes
  • So erstellen Sie ein Projekt mit Docker-Compose
So erstellen Sie einen Docker -basierten Lampenstapel mit Docker auf Ubuntu 20.04

Softwareanforderungen und Konventionen verwendet

Softwareanforderungen und Linux -Befehlszeilenkonventionen
Kategorie Anforderungen, Konventionen oder Softwareversion verwendet
System Installierte Ubuntu 20.04 oder verbessert Ubuntu auf 20.04 FOSSA FOSSA
Software Docker, Docker-Compose
Andere Root -Berechtigungen zum Aufbau von Docker -Containern und zum Starten des Docker -Dienstes
Konventionen # - erfordert, dass gegebene Linux -Befehle mit Root -Berechtigungen entweder direkt als Stammbenutzer oder mit Verwendung von ausgeführt werden können sudo Befehl
$ - Erfordert, dass die angegebenen Linux-Befehle als regelmäßiger nicht privilegierter Benutzer ausgeführt werden können
  1. Installieren von Paketen und Starten des Docker -Dienstes

    Um einen Docker-basierten Lampenstapel auf Ubuntu 20 zu erstellen.04 FORSA FOSSA, als erstes müssen wir die von uns benötigte Software installieren: Docker selbst und Docker-Compose, Dies ist ein Dienstprogramm, mit dem wir Multi-Container-Anwendungen einfach organisieren können Yaml Konfigurationsdateien. Beide Pakete sind in den offiziellen Repositories in Ubuntu erhältlich. Wir können sie durch installieren geeignet:

    $ sudo APT Installieren Sie Docker Docker-Compose 

    Nachdem die Installation durchgeführt wurde Docker Service und aktivieren Sie es beim Start. Wir können beide Operationen mit einem einzigen Befehl ausführen:

    $ systemctl aktivieren -jetzt Docker 
  2. Projektaufbau

    Der erste Schritt auf unserer Reise besteht in der Erstellung des Verzeichnisses, das wir als Wurzel unseres Projekts verwenden werden. Für diesen Artikel werden wir es nennen Linuxconfig. In diesem Verzeichnis werden wir einen anderen erstellen, Dokument Root, die unsere Website -Dateien hosten. Wir können beide Verzeichnisse gleichzeitig mit dem erstellen -P Option der Mkdir Befehl:

    $ mkdir -p linuxconfig/documentroot 


    In der Linuxconfig Das Verzeichnis definieren die Docker-Compose-Konfiguration für unser Projekt in einer YAML-Datei, die standardmäßig aufgerufen werden sollte Docker-Compose.YML. In der Konfigurationsdatei können wir drei Hauptstrophen verwenden: Dienstleistungen, Bände Und Netzwerke.

    Jeder Abschnitt wird verwendet, um den entsprechenden Aspekt eines Projekts zu konfigurieren. In diesem Tutorial werden wir nur die ersten beiden verwenden. Wir werden die Komponenten des Lampenstapels 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 sprechen. Im Netzwerk kann jeder Container die anderen mit einem mit seinem Namen identischen Hostnamen oder dem Namen, der zur Definition des vom Container implementierten Dienstes verwendet wird, verweisen kann.

    Standardmäßig werden Container mit dem Namen des Verzeichnisses mit der Konfigurationsdatei als Präfix benannt. In diesem Fall beispielsweise der Container, der für einen Dienst genannt wird PHP-HTTPD, wird benannt linuxconfig_php-httpd_1.

  3. Definieren des PHP + HTTPD -Dienstes

    Der erste Dienst, den wir in der Konfigurationsdatei definieren werden Php Als Apache -Webservermodul. Wir werden eines der offiziellen PHP -Bilder verwenden, auf denen verfügbar ist Dockerhub als Basis für unseren Container, insbesondere die mit dem -Apache Suffix, das das oben erwähnte Setup liefert. Lassen Sie uns unsere Konfiguration schreiben:

    Version: '3.7 'Dienste: PHP-HTTPD: Bild: Php: 7.3 -Apache -Ports: - 80:80 Bände: - "./Documentroot:/var/www/html " 
    Kopieren

    Das erste, was wir in der Konfigurationsdatei angegeben haben, ist Ausführung. Mit dieser Anweisung deklarieren wir, welche spezifische Version der komponierten Datei wir verwenden werden. Im Moment des Schreibens, Version 3.7 ist der neueste und empfohlene.

  4. Nachdem wir die Version der Komponierungsdatei deklariert hatten, begannen wir, die zu schreiben Service Strophe; Darin definieren wir die Dienste, die unseren Lampenstapel zusammenstellen werden. Wir haben den ersten Dienst angerufen PHP-HTTPD. Der Servicername ist völlig willkürlich, aber immer eine gute Angewohnheit, eine zu verwenden, die im Kontext des Projekts von Bedeutung ist.

    Der Bild Der Befehl wird verwendet, um auf welchem ​​Bild der Container basiert, in diesem Fall basieren PHP: 7.3-Apache.

    Der Häfen Der Befehl wird verwendet, um Ports auf dem Container freizulegen und eine Karte zwischen Host -Ports und Containerports zu erstellen. Eine solche Karte wird definiert, indem die Ports mit a getrennt werden :. Auf der linken Seite geben wir den Host -Port an und rechts den Port im Container sollte er zugeordnet werden. In diesem Fall haben wir Port kartiert 80 Auf dem Host zum Port 80 Im Container, da es sich um den Standardport handelt, der vom Apache -Webserver verwendet wird.

    Die letzte Anweisung, die wir verwendet haben, ist Bände: damit können wir eine Zuordnung zwischen a angeben Volumen genannt oder ein Weg (Relativ oder absolut) auf dem Hostsystem zu einem Pfad auf dem Container, auf dem es montiert wird.

    In unserem Setup die ./Dokument Root Das Verzeichnis hosten die Site -Dateien: Es wird auf dem montiert /var/www/html Verzeichnis im Container, da das letztere das Dokumentstamm ist, das vom Standard Apache VirtualHost verwendet wird. Ein solches Setup heißt a Binden Sie die Halterung und ist besonders nützlich während der Entwicklung, da die Änderungen, die wir in den Projektdateien vornehmen, sofort im Container reflektiert werden. Der Nachteil dieser Konfiguration ist, dass sie eine Abhängigkeit zwischen dem Container und der Host -Maschinen -Dateistruktur festlegt, wodurch der Hauptvorteil der Verwendung von Docker verwendet wird: Portabilität.

    Das zu im Container montierte Verzeichnis wird automatisch erstellt, wenn es nicht vorhanden ist, wenn der Docker-Compose Up Der Befehl wird gestartet: In diesem Fall wird er Root gehören, wenn es nicht anders angegeben ist.

    In der Dokument Root Verzeichnis Wir können jetzt eine Indexdatei erstellen und versuchen, unser Projekt zu erstellen, um zu überprüfen, ob das Setup funktioniert:

    $ echo "DocumentRoot/Index.Php $ sudo docker -compose up -d 

    Nach der Ausführung des Befehls werden die benötigten Docker -Bilder von DockerHub und den Containern, die wir mit den Einstellungen, die wir zur Verfügung gestellt haben, im Hintergrund bereitgestellt, heruntergeladen und das Terminal nicht blockiert) heruntergeladen. Aufgrund der -D Option, die wir dem zur Verfügung gestellt haben Docker-Compose Befehl. Mit dem Projekt in Betrieb, wenn wir navigieren zu Lokalhost Mit unserem Browser sollten wir die folgende Seite sehen:



    Die Phpinfo -Seite

    Um das Projekt aus dem Verzeichnis zu stoppen, in dem das veranstaltet wird Docker-Compose.YML Datei, wir können ausführen:

    $ sudo docer-compose stop 

    Definieren des Mariadb -Dienstes

    Ein wesentlicher Bestandteil des Lampenstapels ist die Datenbankschicht. In unserer Konfiguration werden wir verwenden Mariadb und sein offizielles Docker -Image auf DockerHub verfügbar:

    Version: '3.7 'Dienste: PHP-HTTPD: Bild: Php: 7.3 -Apache -Ports: - 80:80 Bände: - "./Documentroot:/var/www/html "mariadb: Bild: mariadb: 10.5.2 Volumina: - Mariadb -Volume:/var/lib/mysql Umgebung: TZ: "Europa/rome" mysql_allow_tempy_password: "no" mysql_root_password: "rootpwd" mysql_user: 'testuser' mysql_password: 'testpassword:' testpassword: 'testpassword:' testpassword: 'testpassword' mysql_daTase: 'testpassword:' testpassword: 'testpassword' mysql_daTase: 'testpassword:' testpassword: 'testpassword' mysql_daTase: 'testpassword:' testpassword: 'testpassword' mysql_daTasing: Mariadb-Volume: 
    Kopieren

    In der Dienstleistungen Stanza, wir haben einen weiteren Dienst definiert und nennen ihn an Mariadb und mit dem Bild Anweisungen, die wir angegeben haben, möchten wir die verwenden 10.5.2 Version des offiziellen Bildes.

    In der vorherigen Service -Definition haben wir eine Bindmontage verwendet. Diesmal haben wir stattdessen einen richtigen Docker verwendet Volumen genannt, aufmontieren /var/lib/mysql Im Container (es ist das Standarddatenverzeichnis, das von Mariadb verwendet wird). Im Gegensatz zu einer Bindungshalterung erzeugen benannte Volumes keine Abhängigkeiten des Containers in der Host -Dateisystemstruktur. Sie werden vollständig von Docker verwaltet und sind die empfohlene Methode, um Daten zu bestehen, die ansonsten bei der Zerstörung von Containern verloren gehen würden.

    Namensvolumina können im Haupt definiert werden Bände Strophe der Konfigurationsdatei und kann aus dem verwiesen werden Bände Unterabschnitt jeder definierten Dienste. In diesem Fall haben wir unseren Band angerufen Mariadb-Volume.

    Als nächster Schritt haben wir den Wert einiger definiert Umgebungsvariablen Wird verwendet, um das Behälterverhalten zu beeinflussen. Umgebungsvariablen sind in der definiert Umfeld Abschnitt einer Servicedefinition. Die in diesem Fall definierten Variablen haben den folgenden Effekt:

    Variable Wirkung
    TZ Legen Sie die vom MariADB -Server verwendete Zeitzone fest
    MySQL_Allow_Empty_Password Aktivieren oder deaktivieren Sie die Verwendung von leerem Passwort für den DB -Root -Benutzer
    Mysql_root_password Dies ist eine obligatorische Variable und wird verwendet, um das DB -Root -Benutzerkennwort festzulegen
    Mysql_database Optional verwendet, um den Namen der Datenbank anzugeben, die beim Image -Start erstellt werden sollen
    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_Password Wird verwendet, um das Kennwort für den Benutzer anzugeben, der mit dem von mySQL_USER angegebenen Namen erstellt wurde

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

    Bonus - phpmyadmin

    Unser Grundlampenstapel sollte jetzt abgeschlossen sein. Als Bonus möchten wir vielleicht hinzufügen phpmyadmin Um unsere MariADB-Datenbank einfach von einer benutzerfreundlichen Weboberfläche zu steuern. Fügen wir die zugehörige Servicedefinition unserer Docker-Compose-Konfiguration hinzu:

    Version: '3.7 'Dienste: PHP-HTTPD: Bild: Php: 7.3 -Apache -Ports: - 80:80 Bände: - "./Documentroot:/var/www/html "mariadb: Bild: mariadb: 10.5.2 Volumina: - Mariadb -Volume:/var/lib/mysql Umgebung: TZ: "Europa/rome" mysql_allow_tempy_password: "no" mysql_root_password: "rootpwd" mysql_user: 'testuser' mysql_password: 'testpassword:' testpassword 'mySql_daTase:' myScl_password: 'testpassword' mySql_daTase: 'mySthb. Bild: phpmyadmin/phpmyadmin Links: - 'Mariadb: DB' Ports: - 8081: 80 Bände: Mariadb -Volume: 
    Kopieren

    Wir haben unseren Service benannt phpmyadmin und konfigurierte es, um die zu verwenden phpmyadmin/phpmyadmin Bild von DockerHub. Wir haben auch die benutzt Links Schlüsselwort zum ersten Mal; wofür ist das? Wie wir bereits wissen, können alle in derselben Docker-Compose-Konfiguration erstellten Container standardmäßig und ohne spezielle Konfigurationen miteinander erstellt werden. Das PhpMyAdmin -Bild ist so konfiguriert, dass er auf einen laufenden Datenbankcontainer durch die verweist db Name, daher müssen wir einen Alias ​​mit demselben Namen für unseren Mariadb -Dienst erstellen. Genau das ist was Links wird verwendet für: Definieren von zusätzlichen Aliase, um einen Dienst von einem anderen zu erreichen.

    In der Service -Definition haben wir auch Port zugeordnet 8081 unserer Hostmaschine, zum Port 80 Innerhalb des Containers (Port 80 ist bereits im PHP-HTTPD-Container auf denselben Anschluss abgebildet). Die PhpMyAdmin -Schnittstelle ist daher an der erreichbar Localhost: 8081 Adresse. Lassen Sie uns unser Projekt wieder aufbauen und überprüfen:

    $ sudo docer -compose up -d -build 


    Die PhpMyAdmin -Anmeldeseite

    Wir können uns mit den Anmeldeinformationen anmelden, die wir für unseren Datenbankdienst definiert haben, und verifizieren, dass die testdb Die Datenbank wurde erstellt:



    PhpMyAdmin Homepage

    Verwenden eines benutzerdefinierten Bildes für einen Dienst

    In den obigen Beispielen haben wir immer Vanillebilder in unserer Dienstedefinition verwendet. Es gibt Fälle, in denen wir basierend auf ihnen benutzerdefinierte Docker -Bilder verwenden möchten. Angenommen, wir möchten den PHP-HTTPD-Dienst erstellen, aber eine zusätzliche PHP-Erweiterung angeben: Wie können wir das tun? Auf der Wurzel des Projekts definieren wir ein neues Verzeichnis und nennen es nach dem Dienst nach dem Service:

    $ mkdir php-httpd 

    In diesem Verzeichnis erstellen wir eine Dockerfile, mit der das Basisbild mit dem folgenden Inhalt erweitert wird:

    Von PHP: 7.3-Apache-Label Warteur = "[email protected] "APT-GET-Update && apt-Get Installation -y libmcrypt-dev \ && pecl installieren Sie McRypt-1.0.2 \ && docker-php-text-enable mcrypt 

    Zurück in unser Docker-Compose.YML Datei ändern wir die Definition der PHP-HTTPD Service. Wir können das Bild nicht direkt verweisen wie zuvor. Stattdessen geben wir das Verzeichnis an, das unsere benutzerdefinierte Dockerfile als Build -Kontext enthält:

    Version: '3.7 'Dienste: PHP-HTTPD: Build: Kontext: ./PHP -HTTPD -Ports: - 80:80 Bände: - "./Documentroot:/var/www/html "[…] 
    Kopieren

    Im bauen Abschnitt Wir definieren Konfigurationen, die zum Zeitpunkt der Erstellung angewendet werden. In diesem Fall haben wir verwendet Kontext Um das Verzeichnis mit Dockerfile zu verweisen: Das Verzeichnis wird als Build -Kontext verwendet, und sein Inhalt wird an den Docker -Daemon gesendet, wenn der Container erstellt wird. Um die Änderung anzuwenden.

    Um mehr über zusätzliche Erweiterungen im PHP -Docker -Bild zu erfahren, können Sie sich die offizielle Dokumentation und insbesondere die Pecl -Erweiterungen Abschnitt.

    Schlussfolgerungen

    In diesem Tutorial haben wir gesehen. Wir haben gesehen, wie man die verschiedenen Dienste im Docker-Compose definiert.YML-Konfigurationsdatei und So konfigurieren Sie Bindungsmontage, benannte Volumes und Host-Container-Ports Mapping. Wir haben auch gesehen, wie man benutzerdefinierte Bilder verwendet. Sie können sich die Docker-Compose-Referenz für die detaillierte Liste der Anweisungen ansehen, die in der Docker-Compose-Konfigurationsdatei verwendet werden können.

Verwandte Linux -Tutorials:

  • Ubuntu 20.04 WordPress mit Apache -Installation
  • Dinge zu installieren auf Ubuntu 20.04
  • Ampache Raspberry Pi Installation
  • OpenLiteSpeed ​​WordPress Installation
  • Wie man mit der Woocommerce -REST -API mit Python arbeitet
  • So installieren Sie Lampenstapel auf Almalinux
  • So richten Sie Linux Apache MySQL Python Server ein
  • Ubuntu 20.04: WordPress mit Nginx -Installation
  • So ändern Sie Mariadb -Benutzerkennwort
  • Installieren Sie MySQL auf Ubuntu 20.04 LTS Linux