Einführung
Zur Containerisierung Eine Anwendung bezieht sich auf den Prozess der Anpassung einer Anwendung und ihrer Komponenten, um sie in leichtgewichtigen Umgebungen, den sogenannten Containern, ausführen zu können. Solche Umgebungen sind isoliert und verfügbar und können zum Entwickeln, Testen und Bereitstellen von Anwendungen für die Produktion genutzt werden.
In diesem Leitfaden verwenden wir Docker Compose, um eine Laravel-Anwendung für die Entwicklung zu containerisieren. Wenn Sie fertig sind, haben Sie eine Laravel-Demoanwendung, die auf drei separaten Dienstcontainern ausgeführt wird:
- Eine
app
Dienst mit PHP7.4-FPM; - Ein
db
Dienst, auf dem MySQL 5.7 ausgeführt wird; - Ein
nginx
Dienst, der dieapp
verwendet Dienst, um den PHP-Code zu parsen, bevor die Laravel-Anwendung dem Endbenutzer bereitgestellt wird.
Um einen optimierten Entwicklungsprozess zu ermöglichen und das Debuggen von Anwendungen zu erleichtern, halten wir Anwendungsdateien durch die Verwendung gemeinsam genutzter Volumes synchron. Wir werden auch sehen, wie man docker-compose exec
verwendet Befehle zum Ausführen von Composer und Artisan in der app
Behälter.
Voraussetzungen
- Zugriff auf einen lokalen Ubuntu 20.04-Computer oder Entwicklungsserver als Nicht-Root-Benutzer mit sudo-Berechtigungen. Wenn Sie einen Remote-Server verwenden, ist es ratsam, eine aktive Firewall installiert zu haben. Um diese einzurichten, lesen Sie bitte unseren Leitfaden zur Ersteinrichtung des Servers für Ubuntu 20.04.
- Docker auf Ihrem Server installiert, gemäß den Schritten 1 und 2 von So installieren und verwenden Sie Docker unter Ubuntu 20.04.
- Docker Compose auf Ihrem Server installiert, gemäß Schritt 1 von How To Install and Use Docker Compose on Ubuntu 20.04.
Schritt 1 – Abrufen der Demoanwendung
Zu Beginn holen wir die Laravel-Demoanwendung aus ihrem Github-Repository. Wir interessieren uns für tutorial-01
-Zweig, der die grundlegende Laravel-Anwendung enthält, die wir im ersten Leitfaden dieser Serie erstellt haben.
Um den Anwendungscode zu erhalten, der mit diesem Tutorial kompatibel ist, laden Sie die Version tutorial-1.0.1
herunter in Ihr Home-Verzeichnis mit:
- cd ~
- curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-1.0.1.zip -o travellist.zip
Wir brauchen den unzip
Befehl zum Entpacken des Anwendungscodes. Falls Sie dieses Paket noch nicht installiert haben, tun Sie dies jetzt mit:
- sudo apt update
- sudo apt install unzip
Entpacken Sie nun den Inhalt der Anwendung und benennen Sie das entpackte Verzeichnis für einen einfacheren Zugriff um:
- unzip travellist.zip
- mv travellist-laravel-demo-tutorial-1.0.1 travellist-demo
Navigieren Sie zur travellist-demo
Verzeichnis:
- cd travellist-demo
Im nächsten Schritt erstellen wir eine .env
Konfigurationsdatei zum Einrichten der Anwendung.
Schritt 2 – Einrichten der .env
der Anwendung Datei
Die Laravel-Konfigurationsdateien befinden sich in einem Verzeichnis namens config
, im Stammverzeichnis der Anwendung. Zusätzlich eine .env
Datei wird verwendet, um eine umgebungsabhängige Konfiguration einzurichten, z. B. Anmeldeinformationen und alle Informationen, die zwischen Bereitstellungen variieren können. Diese Datei ist nicht in der Revisionskontrolle enthalten.
Warnung :Die Umgebungskonfigurationsdatei enthält vertrauliche Informationen über Ihren Server, einschließlich Datenbankanmeldeinformationen und Sicherheitsschlüssel. Aus diesem Grund sollten Sie diese Datei niemals öffentlich teilen.
Die in .env
enthaltenen Werte Datei hat Vorrang vor den Werten, die in regulären Konfigurationsdateien in config
festgelegt sind Verzeichnis. Jede Installation in einer neuen Umgebung erfordert eine maßgeschneiderte Umgebungsdatei, um unter anderem Dinge wie Datenbankverbindungseinstellungen, Debug-Optionen, Anwendungs-URL zu definieren, die je nach Umgebung, in der die Anwendung ausgeführt wird, variieren können.
Wir erstellen jetzt eine neue .env
Datei, um die Konfigurationsoptionen für die Entwicklungsumgebung anzupassen, die wir einrichten. Laravel wird mit einem Beispiel.env
geliefert Datei, die wir kopieren können, um unsere eigene zu erstellen:
- cp .env.example .env
Öffnen Sie diese Datei mit nano
oder den Texteditor Ihrer Wahl:
- nano .env
Die aktuelle .env
Datei aus der travellist
Demo-Anwendung enthält Einstellungen zur Verwendung einer lokalen MySQL-Datenbank mit 127.0.0.1
als Datenbankhost. Wir müssen den DB_HOST
aktualisieren -Variable, sodass sie auf den Datenbankdienst verweist, den wir in unserer Docker-Umgebung erstellen werden. In dieser Anleitung nennen wir unseren Datenbankdienst db
. Fahren Sie fort und ersetzen Sie den aufgelisteten Wert von DB_HOST
mit dem Datenbankdienstnamen:
APP_NAME=Travellist
APP_ENV=dev
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost:8000
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=password
...
Wenn Sie möchten, können Sie auch den Datenbanknamen, den Benutzernamen und das Passwort ändern. Diese Variablen werden in einem späteren Schritt genutzt, in dem wir docker-compose.yml
einrichten Datei, um unsere Dienste zu konfigurieren.
Speichern Sie die Datei, wenn Sie mit der Bearbeitung fertig sind. Wenn Sie nano
verwendet haben , können Sie dies tun, indem Sie Ctrl+x
drücken , dann Y
und Enter
zu bestätigen.
Schritt 3 – Dockerfile der Anwendung einrichten
Obwohl sowohl unsere MySQL- als auch unsere Nginx-Dienste auf Standard-Images basieren, die vom Docker Hub bezogen werden, müssen wir dennoch ein benutzerdefiniertes Image für den Anwendungscontainer erstellen. Dafür erstellen wir ein neues Dockerfile.
Unsere Reiseliste image basiert auf php:7.4-fpm
offizielles PHP-Image von Docker Hub. Zusätzlich zu dieser grundlegenden PHP-FPM-Umgebung installieren wir einige zusätzliche PHP-Module und das Abhängigkeitsverwaltungstool Composer.
Wir werden auch einen neuen Systembenutzer erstellen; dies ist notwendig, um artisan
auszuführen und composer
Befehle während der Entwicklung der Anwendung. Die uid
Die Einstellung stellt sicher, dass der Benutzer innerhalb des Containers dieselbe UID hat wie Ihr Systembenutzer auf Ihrem Hostcomputer, auf dem Sie Docker ausführen. Auf diese Weise werden alle mit diesen Befehlen erstellten Dateien mit den richtigen Berechtigungen auf dem Host repliziert. Das bedeutet auch, dass Sie den Code-Editor Ihrer Wahl auf dem Hostcomputer verwenden können, um die Anwendung zu entwickeln, die in Containern ausgeführt wird.
Erstellen Sie ein neues Dockerfile mit:
- nano Dockerfile
Kopieren Sie den folgenden Inhalt in Ihr Dockerfile:
DockerfileFROM php:7.4-fpm
# Arguments defined in docker-compose.yml
ARG user
ARG uid
# Install system dependencies
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
zip \
unzip
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd
# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
chown -R $user:$user /home/$user
# Set working directory
WORKDIR /var/www
USER $user
Vergessen Sie nicht, die Datei zu speichern, wenn Sie fertig sind.
Unser Dockerfile beginnt mit der Definition des Basis-Images, das wir verwenden:php:7.4-fpm
.
Nach der Installation von Systempaketen und PHP-Erweiterungen installieren wir Composer, indem wir den composer
kopieren ausführbar von seinem neuesten offiziellen Image zu unserem eigenen Anwendungs-Image.
Anschließend wird ein neuer Systembenutzer angelegt und mit dem user
eingerichtet und uid
Argumente, die am Anfang des Dockerfiles deklariert wurden. Diese Werte werden von Docker Compose zur Build-Zeit eingefügt.
Schließlich legen wir das Standardarbeitsverzeichnis als /var/www
fest und wechseln Sie zum neu erstellten Benutzer. Dadurch wird sichergestellt, dass Sie sich als normaler Benutzer verbinden und dass Sie sich im richtigen Verzeichnis befinden, wenn Sie composer
ausführen und artisan
Befehle im Anwendungscontainer.
Schritt 4 – Einrichten von Nginx-Konfigurations- und Datenbank-Dump-Dateien
Beim Erstellen von Entwicklungsumgebungen mit Docker Compose ist es oft notwendig, Konfigurations- oder Initialisierungsdateien mit Dienstcontainern zu teilen, um diese Dienste einzurichten oder zu booten. Diese Vorgehensweise erleichtert das Vornehmen von Änderungen an Konfigurationsdateien zur Feinabstimmung Ihrer Umgebung, während Sie die Anwendung entwickeln.
Wir richten jetzt einen Ordner mit Dateien ein, die zum Konfigurieren und Initialisieren unserer Dienstcontainer verwendet werden.
Um Nginx einzurichten, teilen wir eine travellist.conf
Datei, die konfiguriert, wie die Anwendung bereitgestellt wird. Erstellen Sie docker-compose/nginx
Ordner mit:
- mkdir -p docker-compose/nginx
Öffnen Sie eine neue Datei namens travellist.conf
innerhalb dieses Verzeichnisses:
- nano docker-compose/nginx/travellist.conf
Kopieren Sie die folgende Nginx-Konfiguration in diese Datei:
docker-compose/nginx/travellist.conf
server {
listen 80;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/public;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}
Diese Datei konfiguriert Nginx so, dass es auf Port 80
lauscht und verwenden Sie index.php
als Standard-Indexseite. Es wird den Dokumentenstamm auf /var/www/public
setzen , und konfigurieren Sie dann Nginx für die Verwendung der app
Dienst auf Port 9000
um *.php
zu verarbeiten Dateien.
Speichern und schließen Sie die Datei, wenn Sie mit der Bearbeitung fertig sind.
Um die MySQL-Datenbank einzurichten, teilen wir einen Datenbank-Dump, der importiert wird, wenn der Container initialisiert wird. Dies ist eine Funktion, die vom MySQL 5.7-Image bereitgestellt wird, das wir für diesen Container verwenden werden.
Erstellen Sie einen neuen Ordner für Ihre MySQL-Initialisierungsdateien innerhalb von docker-compose
Ordner:
- mkdir docker-compose/mysql
Öffnen Sie eine neue .sql
Datei:
- nano docker-compose/mysql/init_db.sql
Der folgende MySQL-Dump basiert auf der Datenbank, die wir in unserem Laravel on LEMP-Leitfaden eingerichtet haben. Es wird eine neue Tabelle mit dem Namen places
erstellt . Dann wird die Tabelle mit einer Reihe von Beispielorten gefüllt.
Fügen Sie der Datei den folgenden Code hinzu:
docker-compose/mysql/db_init.sqlDROP TABLE IF EXISTS `places`;
CREATE TABLE `places` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`visited` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `places` (name, visited) VALUES ('Berlin',0),('Budapest',0),('Cincinnati',1),('Denver',0),('Helsinki',0),('Lisbon',0),('Moscow',1),('Nairobi',0),('Oslo',1),('Rio',0),('Tokyo',0);
Die places
Tabelle enthält drei Felder:id
, name
, und visited
. Der visited
field ist ein Flag, das verwendet wird, um die Orte zu kennzeichnen, die noch zu gehen sind . Fühlen Sie sich frei, die Beispielorte zu ändern oder neue hinzuzufügen. Speichern und schließen Sie die Datei, wenn Sie fertig sind.
Wir haben das Dockerfile der Anwendung und die Dienstkonfigurationsdateien fertig eingerichtet. Als Nächstes richten wir Docker Compose so ein, dass diese Dateien beim Erstellen unserer Dienste verwendet werden.
Schritt 5 – Erstellen einer Multi-Container-Umgebung mit Docker Compose
Mit Docker Compose können Sie Umgebungen mit mehreren Containern für Anwendungen erstellen, die auf Docker ausgeführt werden. Es verwendet Dienstdefinitionen um vollständig anpassbare Umgebungen mit mehreren Containern zu erstellen, die Netzwerke und Datenvolumen gemeinsam nutzen können. Dies ermöglicht eine nahtlose Integration zwischen Anwendungskomponenten.
Um unsere Dienstdefinitionen einzurichten, erstellen wir eine neue Datei namens docker-compose.yml
. Normalerweise befindet sich diese Datei im Stammverzeichnis des Anwendungsordners und definiert Ihre containerisierte Umgebung, einschließlich der Basis-Images, die Sie zum Erstellen Ihrer Container verwenden, und wie Ihre Dienste interagieren.
Wir werden drei verschiedene Dienste in unserer docker-compose.yml
definieren Datei:app
, db
und nginx
.
Die app
Der Dienst erstellt ein Image namens travellist
, basierend auf dem Dockerfile, das wir zuvor erstellt haben. Der von diesem Dienst definierte Container führt ein php-fpm
aus Server, um den PHP-Code zu parsen und die Ergebnisse an nginx
zurückzusenden Dienst, der auf einem separaten Container ausgeführt wird. Die mysql
service definiert einen Container, auf dem ein MySQL 5.7-Server ausgeführt wird. Unsere Dienste teilen sich ein Brückennetzwerk namens travellist
.
Die Anwendungsdateien werden sowohl auf der app
synchronisiert und das nginx
Dienste über bind mounts . Bind-Mounts sind in Entwicklungsumgebungen nützlich, da sie eine leistungsfähige bidirektionale Synchronisierung zwischen Host-Maschine und Containern ermöglichen.
Erstellen Sie eine neue docker-compose.yml
Datei im Stammverzeichnis des Anwendungsordners:
- nano docker-compose.yml
Eine typische docker-compose.yml
Datei beginnt mit einer Versionsdefinition, gefolgt von einem services
Knoten, unter dem alle Dienste definiert sind. Geteilte Netzwerke werden normalerweise am Ende dieser Datei definiert.
Kopieren Sie zunächst diesen Boilerplate-Code in Ihre docker-compose.yml
Datei:
version: "3.7"
services:
networks:
travellist:
driver: bridge
Wir bearbeiten jetzt die services
-Knoten, um die app
einzuschließen , db
und nginx
Dienste.
Die app
Service
Die app
Der Dienst richtet einen Container namens travellist-app
ein . Es erstellt ein neues Docker-Image basierend auf einer Docker-Datei, die sich im selben Pfad wie docker-compose.yml
befindet Datei. Das neue Bild wird lokal unter dem Namen travellist
gespeichert .
Obwohl sich der als Anwendung bereitgestellte Dokumentstamm in der Datei nginx
befindet Container benötigen wir die Anwendungsdateien irgendwo innerhalb der app
Container, sodass wir Befehlszeilenaufgaben mit dem Laravel Artisan-Tool ausführen können.
Kopieren Sie die folgende Dienstdefinition unter Ihren services
-Knoten innerhalb der docker-compose.yml
Datei:
app:
build:
args:
user: sammy
uid: 1000
context: ./
dockerfile: Dockerfile
image: travellist
container_name: travellist-app
restart: unless-stopped
working_dir: /var/www/
volumes:
- ./:/var/www
networks:
- travellist
Diese Einstellungen bewirken Folgendes:
build
:Diese Konfiguration weist Docker Compose an, ein lokales Image für dieapp
zu erstellen service, wobei der angegebene Pfad (Kontext) und Dockerfile für Anweisungen verwendet werden. Die Argumenteuser
unduid
werden in die Docker-Datei eingefügt, um Befehle zur Benutzererstellung während der Build-Zeit anzupassen.image
:Der Name, der für das erstellte Image verwendet wird.container_name
:Richtet den Containernamen für diesen Dienst ein.restart
:Immer neu starten, es sei denn, der Dienst wird gestoppt.working_dir
:Legt das Standardverzeichnis für diesen Dienst als/var/www
fest .volumes
:Erstellt ein freigegebenes Volume, das Inhalte aus dem aktuellen Verzeichnis nach/var/www
synchronisiert innerhalb des Behälters. Beachten Sie, dass dies nicht Ihr Dokumentenstamm ist, da dieser sich innginx
befindet Behälter.networks
:Richtet diesen Dienst so ein, dass er ein Netzwerk namenstravellist
verwendet .
Die db
Service
Die db
Der Dienst verwendet ein vorgefertigtes MySQL 5.7-Image von Docker Hub. Denn Docker Compose lädt automatisch .env
Variablendateien, die sich im selben Verzeichnis wie docker-compose.yml
befinden Datei können wir unsere Datenbankeinstellungen aus der Laravel .env
beziehen Datei, die wir in einem vorherigen Schritt erstellt haben.
Fügen Sie die folgende Dienstdefinition in Ihre services
ein -Knoten, direkt nach der app
Dienst:
db:
image: mysql:5.7
container_name: travellist-db
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
- ./docker-compose/mysql:/docker-entrypoint-initdb.d
networks:
- travellist
Diese Einstellungen bewirken Folgendes:
image
:Definiert das Docker-Image, das für diesen Container verwendet werden soll. In diesem Fall verwenden wir ein MySQL 5.7-Image von Docker Hub.container_name
:Richtet den Containernamen für diesen Dienst ein:travellist-db
.restart
:Starten Sie diesen Dienst immer neu, es sei denn, er wird explizit gestoppt.environment
:Definiert Umgebungsvariablen im neuen Container. Wir verwenden Werte aus Laravel.env
Datei, um unseren MySQL-Dienst einzurichten, der basierend auf den bereitgestellten Umgebungsvariablen automatisch eine neue Datenbank und einen neuen Benutzer erstellt.volumes
:Erstellt ein Volume zum Freigeben einer.sql
Datenbankauszug, der zum Initialisieren der Anwendungsdatenbank verwendet wird. Das MySQL-Image importiert automatisch.sql
Dateien in/docker-entrypoint-initdb.d
abgelegt Verzeichnis innerhalb des Containers.networks
:Richtet diesen Dienst so ein, dass er ein Netzwerk namenstravellist
verwendet .
Der nginx
Service
Die nginx
Der Dienst verwendet ein vorgefertigtes Nginx-Image auf Alpine, einer leichten Linux-Distribution. Es erstellt einen Container namens travellist-nginx
, und es verwendet die ports
Definition, um eine Umleitung von Port 8000
zu erstellen auf dem Hostsystem auf Port 80
im Behälter.
Fügen Sie die folgende Dienstdefinition in Ihre services
ein -Knoten, direkt nach db
Dienst:
nginx:
image: nginx:1.17-alpine
container_name: travellist-nginx
restart: unless-stopped
ports:
- 8000:80
volumes:
- ./:/var/www
- ./docker-compose/nginx:/etc/nginx/conf.d
networks:
- travellist
Diese Einstellungen bewirken Folgendes:
image
:Definiert das Docker-Image, das für diesen Container verwendet werden soll. In diesem Fall verwenden wir das Alpine Nginx 1.17-Image.container_name
:Richtet den Containernamen für diesen Dienst ein:travellist-nginx .restart
:Starten Sie diesen Dienst immer neu, es sei denn, er wird explizit gestoppt.ports
:Richtet eine Portumleitung ein, die einen externen Zugriff über Port8000
ermöglicht an den Webserver, der auf Port80
läuft im Behälter.volumes
:Erstellt zwei freigegebene Volumes. Der erste synchronisiert Inhalte aus dem aktuellen Verzeichnis nach/var/www
innerhalb des Behälters. Wenn Sie lokale Änderungen an den Anwendungsdateien vornehmen, werden diese auf diese Weise schnell in der Anwendung wiedergegeben, die von Nginx im Container bereitgestellt wird. Der zweite Band stellt sicher, dass unsere Nginx-Konfigurationsdatei unterdocker-compose/nginx/travellist.conf
zu finden ist , wird in den Nginx-Konfigurationsordner des Containers kopiert.networks
:Richtet diesen Dienst so ein, dass er ein Netzwerk namenstravellist
verwendet .
Fertige docker-compose.yml
Datei
So sieht unsere fertige docker-compose.yml
aus Datei sieht so aus:
version: "3.7"
services:
app:
build:
args:
user: sammy
uid: 1000
context: ./
dockerfile: Dockerfile
image: travellist
container_name: travellist-app
restart: unless-stopped
working_dir: /var/www/
volumes:
- ./:/var/www
networks:
- travellist
db:
image: mysql:5.7
container_name: travellist-db
restart: unless-stopped
environment:
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_USER: ${DB_USERNAME}
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
- ./docker-compose/mysql:/docker-entrypoint-initdb.d
networks:
- travellist
nginx:
image: nginx:alpine
container_name: travellist-nginx
restart: unless-stopped
ports:
- 8000:80
volumes:
- ./:/var/www
- ./docker-compose/nginx:/etc/nginx/conf.d/
networks:
- travellist
networks:
travellist:
driver: bridge
Stellen Sie sicher, dass Sie die Datei speichern, wenn Sie fertig sind.
Schritt 6 – Ausführen der Anwendung mit Docker Compose
Wir verwenden jetzt docker-compose
Befehle, um das Anwendungs-Image zu erstellen und die Dienste auszuführen, die wir in unserem Setup angegeben haben.
Erstellen Sie die app
Bild mit dem folgenden Befehl:
- docker-compose build app
Die Ausführung dieses Befehls kann einige Minuten dauern. Sie sehen eine Ausgabe ähnlich der folgenden:
OutputBuilding app
Step 1/11 : FROM php:7.4-fpm
---> fa37bd6db22a
Step 2/11 : ARG user
---> Running in f71eb33b7459
Removing intermediate container f71eb33b7459
---> 533c30216f34
Step 3/11 : ARG uid
---> Running in 60d2d2a84cda
Removing intermediate container 60d2d2a84cda
---> 497fbf904605
Step 4/11 : RUN apt-get update && apt-get install -y git curl libpng-dev libonig-dev ...
Step 7/11 : COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
---> e499f74896e3
Step 8/11 : RUN useradd -G www-data,root -u $uid -d /home/$user $user
---> Running in 232ef9c7dbd1
Removing intermediate container 232ef9c7dbd1
---> 870fa3220ffa
Step 9/11 : RUN mkdir -p /home/$user/.composer && chown -R $user:$user /home/$user
---> Running in 7ca8c0cb7f09
Removing intermediate container 7ca8c0cb7f09
---> 3d2ef9519a8e
Step 10/11 : WORKDIR /var/www
---> Running in 4a964f91edfa
Removing intermediate container 4a964f91edfa
---> 00ada639da21
Step 11/11 : USER $user
---> Running in 9f8e874fede9
Removing intermediate container 9f8e874fede9
---> fe176ff4702b
Successfully built fe176ff4702b
Successfully tagged travellist:latest
Wenn der Build abgeschlossen ist, können Sie die Umgebung im Hintergrundmodus ausführen mit:
- docker-compose up -d
OutputCreating travellist-db ... done
Creating travellist-app ... done
Creating travellist-nginx ... done
Dadurch werden Ihre Container im Hintergrund ausgeführt. Um Informationen über den Status Ihrer aktiven Dienste anzuzeigen, führen Sie Folgendes aus:
- docker-compose ps
Sie sehen eine Ausgabe wie diese:
Output Name Command State Ports
--------------------------------------------------------------------------------
travellist-app docker-php-entrypoint php-fpm Up 9000/tcp
travellist-db docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp
travellist-nginx /docker-entrypoint.sh ngin ... Up 0.0.0.0:8000->80/tcp
Ihre Umgebung ist jetzt einsatzbereit, aber wir müssen noch einige Befehle ausführen, um die Einrichtung der Anwendung abzuschließen. Sie können die docker-compose exec
verwenden Befehl zum Ausführen von Befehlen in den Dienstcontainern, z. B. ls -l
um detaillierte Informationen über Dateien im Anwendungsverzeichnis anzuzeigen:
- docker-compose exec app ls -l
Outputtotal 260
-rw-rw-r-- 1 sammy sammy 737 Jun 9 11:19 Dockerfile
-rw-rw-r-- 1 sammy sammy 101 Jan 7 08:05 README.md
drwxrwxr-x 6 sammy sammy 4096 Jan 7 08:05 app
-rwxr-xr-x 1 sammy sammy 1686 Jan 7 08:05 artisan
drwxrwxr-x 3 sammy sammy 4096 Jan 7 08:05 bootstrap
-rw-rw-r-- 1 sammy sammy 1501 Jan 7 08:05 composer.json
-rw-rw-r-- 1 sammy sammy 179071 Jan 7 08:05 composer.lock
drwxrwxr-x 2 sammy sammy 4096 Jan 7 08:05 config
drwxrwxr-x 5 sammy sammy 4096 Jan 7 08:05 database
drwxrwxr-x 4 sammy sammy 4096 Jun 9 11:19 docker-compose
-rw-rw-r-- 1 sammy sammy 965 Jun 9 11:27 docker-compose.yml
-rw-rw-r-- 1 sammy sammy 1013 Jan 7 08:05 package.json
-rw-rw-r-- 1 sammy sammy 1405 Jan 7 08:05 phpunit.xml
drwxrwxr-x 2 sammy sammy 4096 Jan 7 08:05 public
-rw-rw-r-- 1 sammy sammy 273 Jan 7 08:05 readme.md
drwxrwxr-x 6 sammy sammy 4096 Jan 7 08:05 resources
drwxrwxr-x 2 sammy sammy 4096 Jan 7 08:05 routes
-rw-rw-r-- 1 sammy sammy 563 Jan 7 08:05 server.php
drwxrwxr-x 5 sammy sammy 4096 Jan 7 08:05 storage
drwxrwxr-x 4 sammy sammy 4096 Jan 7 08:05 tests
drwxrwxr-x 41 sammy sammy 4096 Jun 9 11:32 vendor
-rw-rw-r-- 1 sammy sammy 538 Jan 7 08:05 webpack.mix.js
Wir führen jetzt composer install
aus So installieren Sie die Anwendungsabhängigkeiten:
- docker-compose exec app composer install
Sie sehen eine Ausgabe wie diese:
OutputLoading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Package operations: 85 installs, 0 updates, 0 removals
- Installing doctrine/inflector (1.3.1): Downloading (100%)
- Installing doctrine/lexer (1.2.0): Downloading (100%)
- Installing dragonmantank/cron-expression (v2.3.0): Downloading (100%)
- Installing erusev/parsedown (1.7.4): Downloading (100%)
- Installing symfony/polyfill-ctype (v1.13.1): Downloading (100%)
- Installing phpoption/phpoption (1.7.2): Downloading (100%)
- Installing vlucas/phpdotenv (v3.6.0): Downloading (100%)
- Installing symfony/css-selector (v5.0.2): Downloading (100%)
…
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
Als Letztes müssen wir vor dem Testen der Anwendung einen eindeutigen Anwendungsschlüssel mit dem artisan
generieren Laravel-Befehlszeilentool. Dieser Schlüssel wird verwendet, um Benutzersitzungen und andere sensible Daten zu verschlüsseln:
- docker-compose exec app php artisan key:generate
OutputApplication key set successfully.
Gehen Sie nun zu Ihrem Browser und greifen Sie auf Port 8000 auf den Domainnamen oder die IP-Adresse Ihres Servers zu:
http://server_domain_or_IP:8000
Hinweis :Falls Sie diese Demo auf Ihrem lokalen Rechner ausführen, verwenden Sie http://localhost:8000
um über Ihren Browser auf die Anwendung zuzugreifen.
Sie sehen eine Seite wie diese:
Sie können die logs
verwenden Befehl, um die von Ihren Diensten generierten Protokolle zu überprüfen:
- docker-compose logs nginx
Attaching to travellist-nginx
…
travellist-nginx | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
travellist-nginx | /docker-entrypoint.sh: Configuration complete; ready for start up
travellist-nginx | 192.168.0.1 - - [09/Jun/2020:11:46:34 +0000] "GET / HTTP/1.1" 200 627 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
travellist-nginx | 192.168.0.1 - - [09/Jun/2020:11:46:35 +0000] "GET / HTTP/1.1" 200 627 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"
Wenn Sie Ihre Docker Compose-Umgebung anhalten möchten, während der Status aller Dienste beibehalten wird, führen Sie Folgendes aus:
- docker-compose pause
OutputPausing travellist-db ... done
Pausing travellist-nginx ... done
Pausing travellist-app ... done
Sie können Ihre Dienste dann fortsetzen mit:
- docker-compose unpause
OutputUnpausing travellist-app ... done
Unpausing travellist-nginx ... done
Unpausing travellist-db ... done
Um Ihre Docker Compose-Umgebung herunterzufahren und alle ihre Container, Netzwerke und Volumes zu entfernen, führen Sie Folgendes aus:
- docker-compose down
OutputStopping travellist-nginx ... done
Stopping travellist-db ... done
Stopping travellist-app ... done
Removing travellist-nginx ... done
Removing travellist-db ... done
Removing travellist-app ... done
Removing network travellist-laravel-demo_travellist
Eine Übersicht über alle Docker Compose-Befehle finden Sie in der Docker Compose-Befehlszeilenreferenz.
Schlussfolgerung
In diesem Leitfaden haben wir eine Docker-Umgebung mit drei Containern mit Docker Compose eingerichtet, um unsere Infrastruktur in einer YAML-Datei zu definieren.
Ab diesem Zeitpunkt können Sie an Ihrer Laravel-Anwendung arbeiten, ohne einen lokalen Webserver für Entwicklung und Tests installieren und einrichten zu müssen. Darüber hinaus arbeiten Sie mit einer Einwegumgebung, die einfach repliziert und verteilt werden kann, was bei der Entwicklung Ihrer Anwendung und auch beim Übergang zu einer Produktionsumgebung hilfreich sein kann.