Developer Advocate
Die Containerisierung einer Anwendung bezeichnet den Anpassungsprozess einer Anwendung und ihrer Komponenten, um sie in einfachen Umgebungen ausführen zu können, die als Container bekannt sind. Derartige Umgebungen sind isoliert und können gelöscht werden. Sie lassen sich zur Entwicklung, zum Test und zur Bereitstellung von Anwendungen zu Produktionszwecken nutzen.
In diesem Leitfaden verwenden wir Docker Compose, um eine Laravel-Anwendung für die Entwicklung zu containerisieren. Wenn Sie fertig sind, haben Sie eine Testversion der Laravel-Anwendung, die auf drei separaten Dienst-Containern ausgeführt wird:
app
-Dienst, der PHP7.4-FPM ausführt;db
-Dienst, der MySQL 5.7 ausführt;nginx
-Dienst, der den app
-Dienst verwendet, um den PHP-Code zu parsen, bevor die Laravel-Anwendung dem Endbenutzer bereitgestellt wird.Um einen gestrafften Entwicklungsprozess zu ermöglichen und das Debugging der Anwendung zu ermöglichen, halten wir Anwendungsdateien durch den Einsatz von gemeinsam genutzten Volumes synchron. Auch zeigen wir, wie Sie docker-compose exec
-Befehle verwenden, um Composer und Artisan auf dem app
-Container auszuführen.
Zu Beginn rufen wir die Demoversion der Laravel-Anwendung aus dem Github Repository ab. Wir sind an dem tutorial-01
-Zweig interessiert, der die Laravel-Standardanwendung enthält, die wir im ersten Leitfaden dieser Serie erstellt haben.
Um den mit diesem Tutorial kompatiblen Anwendungscode zu bekommen, laden Sie wie folgt tutorial-1.0.1
in Ihr Stammverzeichnis herunter:
- cd ~
- curl -L https://github.com/do-community/travellist-laravel-demo/archive/tutorial-1.0.1.zip -o travellist.zip
Den unzip
-Befehl brauchen wir, um den Anwendungscode zu dekomprimieren. Wenn Sie dieses Paket noch nicht installiert haben, sollten Sie es jetzt wie folgt tun:
- sudo apt update
- sudo apt install unzip
Dekomprimieren Sie nun den Inhalt der Anwendung und benennen Sie das entpackte Verzeichnis für leichteren Zugriff um:
- unzip travellist.zip
- mv travellist-laravel-demo-tutorial-1.0.1 travellist-demo
Navigieren Sie zum Verzeichnis travellist-demo
:
- cd travellist-demo
Im nächsten Schritt erstellen wir eine .env
-Konfigurationsdatei, um die Anwendung einzurichten.
.env
-Datei der AnwendungDie Laravel-Konfigurationsdateien befinden sich im Verzeichnis config
, das Sie im Stammverzeichnis der Anwendung finden. Zusätzlich wird eine .env
-Datei verwendet, um eine umgebungsabhängige Konfiguration einzurichten, wie z. B. Anmeldedaten und Informationen, die sich zwischen Bereitstellungen ändern können. Diese Datei ist nicht Teil der Revisionskontrolle.
Warnung: Die Umgebungs-Konfigurationsdatei enthält sensible Informationen über Ihren Server, einschließlich Anmeldedaten zur Datenbank und Sicherheitsschlüssel. Aus diesem Grund sollten Sie diese Datei nie öffentlich teilen.
Die Werte in der .env
-Datei haben Vorrang vor den Werten, die in regelmäßigen Konfigurationsdateien festgelegt sind, die sich im Verzeichnis config
befinden. Jede Installation in einer neuen Umgebung erfordert eine maßgeschneiderte Umgebungsdatei, um Dinge wie Datenbank-Verbindungseinstellungen, Debug-Optionen, Anwendungs-URL und andere Objekte festzulegen, die je nach den Umgebungsbedingungen variieren können.
Jetzt erstellen wir eine neue .env
-Datei, um die Konfigurationsoptionen für die Entwicklungsumgebung anzupassen, die wir einrichten. Laravel wird mit einer .env
-Musterdatei geliefert, die wir zur Erstellung unserer eigenen kopieren können:
- cp .env.example .env
Öffnen Sie diese Datei mit nano
oder dem Texteditor Ihrer Wahl:
- nano .env
Die aktuelle .env
-Datei aus der travellist
Demo-Anwendung enthält Einstellungen zum Einsatz einer lokalen MySQL-Datenbank, wobei 127.0.0.1
der Datenbank-Host ist. Wir müssen die Variable DB_HOST
aktualisieren, damit sie auf den Datenbankdienst verweist, den wir in unserer Docker-Umgebung erstellen. In diesem Leitfaden nennen wir unseren Datenbankdienst db
. Ersetzen Sie also den aufgelisteten Wert von DB_HOST
durch den 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
...
Sie können den Datenbanknamen, den Benutzernamen und das Passwort auch nach Bedarf ändern. Diese Variablen werden in einem späteren Schritt genutzt, wo wir die Datei docker-compose.yml
einrichten, um unsere Dienste zu konfigurieren.
Speichern Sie die Datei, wenn die Bearbeitung abgeschlossen ist. Wenn Sie nano
verwendet haben, können Sie zur Bestätigung Strg+x
, dann Y
und die Eingabetaste
drücken.
Obwohl unsere MySQL- und Nginx-Dienste auf Standardimages basieren, die wir aus dem Docker Hub erhalten, müssen wir trotzdem ein benutzerdefiniertes Image für den Anwendungs-Container erstellen. Dafür erstellen wir ein neues Dockerfile.
Unser travellist-Image basiert auf dem offiziellen PHP-Image php:7.4-fpm
von Docker Hub. Über diese PHP-FPM-Umgebung hinaus installieren wir ein paar PHP-Extramodule und das Composer Abhängigkeitsmanagement-Tool.
Außerdem erstellen wir einen neuen Systembenutzer; dies ist notwendig, um artisan
- und composer
- Befehle während der Entwicklung der Anwendung auszuführen. Die uid
-Einstellung stellt sicher, dass der Benutzer im Container dieselbe UID wie der Systembenutzer auf Ihrem Host-Computer hat, auf dem Docker läuft. Auf diese Weise werden alle von diesen Befehlen erstellten Dateien mit den richtigen Berechtigungen im Host repliziert. Es bedeutet auch, dass Sie auf dem Host-Rechner den Code-Editor Ihrer Wahl verwenden können, um die Anwendung für die Container zu entwickeln.
Erstellen Sie ein neues Dockerfile mit:
- nano Dockerfile
Kopieren Sie den folgenden Inhalt in Ihr Dockerfile:
FROM 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.
Unsere Dockerfile beginnt, indem Sie das Basisimage definieren, das wir verwenden: php:7.4-fpm
.
Nach Installation von Systempaketen und PHP-Erweiterungen installieren wir Composer, indem wir den ausführbaren composer
aus dem letzten offiziellen Image in unser eigenes Anwendungsimage kopieren.
Dann wird mit den Argumenten user
und uid
ein neuer Systembenutzer erstellt und eingerichtet. Diese Argumente wurden zu Beginn des Dockerfiles deklariert. Diese Werte werden von Docker Compose zum Zeitpunkt des Build injiziert.
Schließlich legen wir das Standardarbeitsverzeichnis als /var/www
fest und wechseln auf den neu erstellten Benutzer. Somit gewährleisten Sie, dass Sie sich als regelmäßiger Benutzer verbinden und im richtigen Verzeichnis sind, wenn Sie composer
- und artisan
-Befehle im Anwendungs-Container ausführen.
Wenn Sie Entwicklungsumgebungen mit Docker Compose erstellen, müssen Sie die Konfigurations- oder Initialisierungsdateien häufig mit Dienst-Containern teilen, um diese Dienste einzurichten oder im Bootstrap-Verfahren zu laden. Diese Vorgehensweise ermöglicht die Änderung der Konfigurationsdateien, um Ihre Umgebung während der Anwendungsentwicklung genau einzustellen.
Jetzt erstellen wir einen Ordner mit Dateien, die zur Konfiguration und Initialisierung unserer Dienst-Container verwendet werden.
Um Nginx einzurichten, teilen wir eine travellist.conf
-Datei, die festlegt, wie die Anwendung bereitgestellt wird. Erstellen Sie den Ordner docker-compose/nginx
wie folgt:
- mkdir -p docker-compose/nginx
Öffnen Sie eine neue Datei namens travellist.conf
in diesem Verzeichnis:
- nano docker-compose/nginx/travellist.conf
Kopieren Sie die folgende Nginx-Konfiguration in diese Datei:
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;
}
}
Mit dieser Datei wird Nginx konfiguriert, um auf Port 80
zu lauschen und index.php
als standardmäßige Index-Seite zu verwenden. Damit wird der Dokumentenstamm auf /var/www/public
festgelegt und dann Nginx so konfiguriert, dass er den app
-Dienst auf Port 9000
verwendet, um *.php
-Dateien zu verarbeiten.
Speichern und schließen Sie die Datei, wenn die Bearbeitung abgeschlossen ist.
Um die MySQL-Datenbank einzurichten, teilen wir einen Datenbank-Dump, der bei Initialisierung des Containers importiert wird. Dies ist eine Eigenschaft, die vom MySQL 5.7-Image bereitgestellt wird, das wir in dem Container verwenden.
Erstellen Sie einen neuen Ordner für Ihre MySQL-Initialisierung im Ordner docker-compose
:
- 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 Leitfaden zu Laravel mit LEMP eingerichtet haben. Damit wird eine neue Tabelle namens places
erstellt. Dann füllt er die Tabelle mit einem Satz von Musterstellen.
Fügen Sie den folgenden Code zur Datei hinzu:
DROP 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 Tabelle places
enthält drei Felder: id
, name
und visited
. Das Feld visited
ist ein Flag, das als Identifizierung der Stellen dient, die noch ausstehen. Stellen Sie diese Musterstellen nach Belieben um oder setzen Sie neue hinzu. Speichern und schließen Sie die Datei, wenn Sie fertig sind.
Damit ist die Einrichtung des Dockerfiles der Anwendung und der Konfigurationsdateien des Dienstes abgeschlossen. Als Nächstes richten wir Docker Compose ein, damit es bei der Erstellung unserer Dienste diese Dateien verwendet.
Docker Compose ermöglicht es Ihnen, Multi-Container-Umgebungen für auf Docker laufende Anwendungen zu erstellen. Er verwendet Dienst-Definitionen zum Aufbau voll anpassbarer Umgebungen mit mehreren Containern, die Netzwerke und Datenvolumes teilen können. Damit wird eine nahtlose Integration zwischen Anwendungskomponenten möglich.
Um unsere Dienst-Definitionen einzurichten, erstellen wir eine neue Datei namens docker-compose.yml
. Normalerweise befindet sich diese Datei im Stamm des Anwendungsordners und definiert die containerisierte Umgebung, einschließlich der Standardimages, die Sie zum Aufbau Ihrer Container verwenden, und der Art und Weise, wie Ihre Dienste interagieren.
Wir definieren drei verschiedene Dienste in unserer docker-compose.yml
Datei: app
, db
und nginx
.
Der app
-Dienst stellt ein Image mit der Bezeichnung travellist
auf Basis der zuvor erstellten Dockerfile zusammen. Der durch diesen Dienst definierte Container führt einen php-fpm
-Server aus, um PHP-Code zu parsen und die Ergebnisse an den nginx
-Dienst zurückzusenden, der in einem separaten Container läuft. Der mysql
-Dienst definiert einen Container, der einen MySQL 5.7-Server ausführt. Unsere Dienste teilen ein Brückennetzwerk namens travellist
.
Die Anwendungsdateien werden in sowohl den app
- als auch den nginx
-Diensten über Bind-Bereitstellungen synchronisiert. Bind-Bereitstellungen sind in Entwicklungsumgebungen nützlich, weil sie eine performante zweispurige Synchronisierung zwischen Host-Rechner und Containern ermöglichen.
Erstellen Sie eine neue docker-compose.yml
-Datei im Stammverzeichnis der Anwendung:
- nano docker-compose.yml
Eine typische docker-compose.yml
-Datei beginnt mit einer Versionsdefinition gefolgt von einem services
-Knoten, in dem alle Dienste definiert sind. Die geteilten Netzwerke werden normalerweise unten in der Datei definiert.
Kopieren Sie zu Beginn diesen Standardcode in Ihre docker-compose.yml
-Datei:
version: "3.7"
services:
networks:
travellist:
driver: bridge
Jetzt bearbeiten wir den services
-Knoten, um die app
-, db
- und nginx
-Dienste aufzunehmen.
app
-DienstDer app
-Dienst richtet einen Container namens travellist-app
ein. Basierend auf einer Dockerfile mit dem gleichen Pfad wie die docker-compose.yml
-Datei baut er ein neues Docker-Image auf. Das neue Image wird lokal unter dem Namen travellist
gespeichert.
Obwohl sich der als Anwendung dienende Dokumentenstamm im nginx
-Container befindet, sollten auch die Anwendungsdateien irgendwo im app
-Container vorhanden sein, damit wir Befehlszeilenvorgänge mit dem Laravel Artisan-Tool ausführen können.
Kopieren Sie die folgende Dienst-Definition in Ihrem services
-Knoten aus 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 den app
-Dienst zu erstellen, wobei es den angegebenen Pfad (context) und die Dockerfile für Anweisungen verwendet. Die Argumente user
und uid
werden in das Dockerfile injiziert, um die Befehle zur Benutzereinrichtung zur Buildzeit anzupassen.image
: Der Name, der für das zusammengestellte Image verwendet wird.container_name
: Richtet den Container-Namen für diesen Dienst ein.restart
: Es wird immer ein Neustart durchgeführt, es sei denn, der Dienst wird angehalten.working_dir
: Richtet das Standardverzeichnis für diesen Dienst als /var/www
ein.volumes
: Erstellt ein gemeinsam genutztes Volume, das den Inhalt des aktuellen Verzeichnisses auf /var/www
im Container synchronisiert. Beachten Sie, dass es sich nicht um Ihren Dokumentenstamm handelt, da dieser sich im nginx
-Container befinden wird.networks
: Richtet diesen Dienst auf Nutzung eines Netzwerks namens travellist
ein.db
-DienstDer db
-Dienst verwendet ein vorab zusammengestelltes MySQL 5.7-Image von Docker Hub. Da Docker Compose die .env
-Variablendateien automatisch lädt, die sich im gleichen Verzeichnis wie die docker-compose.yml
-Datei befinden, erhalten wir unsere Datenbankeinstellungen aus der Laravel .env
-Datei, die wir im vorherigen Schritt erstellt haben.
Setzen Sie die folgende Dienst-Definition in Ihrem services
-Knoten direkt hinter den 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 sollte. In diesem Fall verwenden wir ein MySQL 5.7-Image von Docker Hub.container_name
: Richtet den Container-Namen für diesen Dienst ein: travellist-db
.restart
: Dieser Dienst wird immer neu gestartet, es sei denn, er wurde ausdrücklich angehalten.environment
: Definiert Umgebungsvariablen im neuen Container. Wir verwenden Werte aus der Laravel .env
-Datei, um unseren MySQL-Dienst einzurichten. Damit werden automatisch, basierend auf den bereitgestellten Umgebungsvariablen, eine neue Datenbank und ein Benutzer erstellt.volumes
: Erstellt ein Volume, um einen .sql
Datenbank-Dump zu teilen, der zur Initialisierung der Anwendungsdatenbank verwendet wird. Das MySQL-Image importiert automatisch .sql
-Dateien, die im Verzeichnis /docker-entrypoint-initdb.d
im Container abgelegt werden.networks
: Richtet diesen Dienst auf Nutzung eines Netzwerks namens travellist
ein.nginx
-DienstDer nginx
-Dienst verwendet ein vorab zusammengestelltes Nginx-Image auf Alpine, einer einfachen Linux-Distribution. Damit wird ein Container namens travellist-nginx
erstellt und die ports
-Definition verwendet, um eine Umleitung von Port 8000
im Host-System auf Port 80
im Container zu schaffen.
Setzen Sie die folgende Dienst-Definition in Ihrem services
-Knoten direkt hinter den 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 sollte. In diesem Fall verwenden wir das Alpine Nginx 1.17-Image.container_name
: Richtet den Container-Namen für diesen Dienst ein: travellist-nginx.restart
: Dieser Dienst wird immer neu gestartet, es sei denn, er wurde ausdrücklich angehalten.ports
: Richtet eine Port-Umleitung ein, die den externen Zugriff über Port 8000
auf den Web-Server ermöglicht, der auf Port 80
im Container läuft.volumes
: Erstellt zwei gemeinsam genutzte Volumes. Das erste wird den Inhalt aus dem aktuellen Verzeichnis in /var/www
im Container synchronisieren. Auf diese Weise werden bei lokalen Änderungen an den Anwendungsdateien diese schnell in der Anwendung widergespiegelt, die von Nginx im Container bereitgestellt wird. Das zweite Volume stellt sicher, dass unsere Nginx-Konfigurationsdatei, die sich auf docker-compose/nginx/travellist.conf
befindet, in den Nginx-Konfigurationsordner des Containers kopiert wird.networks
: Richtet diesen Dienst auf Nutzung eines Netzwerks namens travellist
ein.docker-compose.yml
-DateiSo sieht unsere fertiggestellte docker-compose.yml
-Datei 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
Denken Sie daran, die Datei zu speichern, wenn Sie Ihre Bearbeitung abgeschlossen haben.
Jetzt verwenden wir docker-compose
-Befehle, um das Anwendungsimage zu erstellen und die Dienste auszuführen, die wir in unserem Setup festgelegt haben.
Erstellen Sie das app
-Image mit dem folgenden Befehl:
- docker-compose build app
Dies kann einige Minuten dauern. Sie sehen eine Ausgabe, die dieser ähnelt:
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:
- docker-compose up -d
OutputCreating travellist-db ... done
Creating travellist-app ... done
Creating travellist-nginx ... done
Damit werden Ihre Container im Hintergrund ausgeführt. Um Informationen über den Zustand Ihrer aktiven Dienste anzuzeigen, führen Sie Folgendes aus:
- docker-compose ps
Die Ausgabe sieht dann so aus:
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 nginx -g daemon off; Up 0.0.0.0:8000->80/tcp
Jetzt ist Ihre Umgebung einsatzbereit, aber wir müssen noch ein paar Befehle ausführen, um das Setup der Anwendung abzuschließen. Sie können den docker-compose exec
-Befehl verwenden, um Befehle in den Dienst-Containern auszuführen, wie z. B. ls -l
, mit denen detaillierte Informationen über Dateien im Anwendungsverzeichnis angezeigt werden:
- docker-compose exec app ls -l
Outputtotal 256
-rw-rw-r-- 1 sammy 1001 738 Jan 15 16:46 Dockerfile
-rw-rw-r-- 1 sammy 1001 101 Jan 7 08:05 README.md
drwxrwxr-x 6 sammy 1001 4096 Jan 7 08:05 app
-rwxr-xr-x 1 sammy 1001 1686 Jan 7 08:05 artisan
drwxrwxr-x 3 sammy 1001 4096 Jan 7 08:05 bootstrap
-rw-rw-r-- 1 sammy 1001 1501 Jan 7 08:05 composer.json
-rw-rw-r-- 1 sammy 1001 179071 Jan 7 08:05 composer.lock
drwxrwxr-x 2 sammy 1001 4096 Jan 7 08:05 config
drwxrwxr-x 5 sammy 1001 4096 Jan 7 08:05 database
drwxrwxr-x 4 sammy 1001 4096 Jan 15 16:46 docker-compose
-rw-rw-r-- 1 sammy 1001 1015 Jan 15 16:45 docker-compose.yml
-rw-rw-r-- 1 sammy 1001 1013 Jan 7 08:05 package.json
-rw-rw-r-- 1 sammy 1001 1405 Jan 7 08:05 phpunit.xml
drwxrwxr-x 2 sammy 1001 4096 Jan 7 08:05 public
-rw-rw-r-- 1 sammy 1001 273 Jan 7 08:05 readme.md
drwxrwxr-x 6 sammy 1001 4096 Jan 7 08:05 resources
drwxrwxr-x 2 sammy 1001 4096 Jan 7 08:05 routes
-rw-rw-r-- 1 sammy 1001 563 Jan 7 08:05 server.php
drwxrwxr-x 5 sammy 1001 4096 Jan 7 08:05 storage
drwxrwxr-x 4 sammy 1001 4096 Jan 7 08:05 tests
-rw-rw-r-- 1 sammy 1001 538 Jan 7 08:05 webpack.mix.js
Jetzt führen wir composer install
aus, um die Anwendungsabhängigkeiten zu installieren:
- docker-compose exec app composer install
Die Ausgabe sieht dann so aus:
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 vor dem Anwendungstest verbleibt die Generierung eines eindeutigen Anwendungsschlüssels mit dem artisan
Laravel-Tool auf Befehlszeilenebene. Dieser Schlüssel wird verwendet, um die Benutzersitzungen und andere sensible Daten zu verschlüsseln:
- docker-compose exec app php artisan key:generate
OutputApplication key set successfully.
Gehen Sie jetzt in Ihren Browser und greifen Sie über Port 8000 auf den Domänenamen oder die IP-Adresse Ihres Servers zu:
http://server_domain_or_IP:8000
Sie werden eine Seite wie die Folgende sehen:
Sie können den Befehl logs
verwenden, um die von den Diensten generierten Protokolle zu überprüfen:
- docker-compose logs nginx
Attaching to travellist-nginx
travellist-nginx | 192.168.160.1 - - [23/Jan/2020:13:57:25 +0000] "GET / HTTP/1.1" 200 626 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
travellist-nginx | 192.168.160.1 - - [23/Jan/2020:13:57:26 +0000] "GET /favicon.ico HTTP/1.1" 200 0 "http://localhost:8000/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
travellist-nginx | 192.168.160.1 - - [23/Jan/2020:13:57:42 +0000] "GET / HTTP/1.1" 200 626 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36"
…
Wenn Sie Ihre Docker-Compose-Umgebung unter Beibehaltung des Zustandes aller Dienste anhalten möchten, führen Sie Folgendes aus:
- docker-compose pause
OutputPausing travellist-db ... done
Pausing travellist-nginx ... done
Pausing travellist-app ... done
So können Sie dann Ihre Dienste wiederaufnehmen:
- docker-compose unpause
OutputUnpausing travellist-app ... done
Unpausing travellist-nginx ... done
Unpausing travellist-db ... done
Um Ihre Docker-Compose-Umgebung herunterzufahren und alle 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 aller Docker-Compose-Befehle finden Sie in der Docker Compose Befehlszeilenreferenz.
In diesem Leitfaden haben wir mit Docker Compose eine Docker-Umgebung mit drei Containern eingerichtet, um eine Infrastruktur in einer YAML-Datei festzulegen.
Ab jetzt können Sie in Ihrer Laravel-Anwendung arbeiten, ohne einen lokalen Webserver für die Entwicklung und Tests installieren und einrichten zu müssen. Außerdem arbeiten Sie mit einer löschbaren Testumgebung, die leicht repliziert und verteilt werden kann, was bei der Anwendungsentwicklung und auch beim Wechsel in eine Produktivumgebung hilfreich sein kann.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
is there any solution for PHP8 ???
Hi, danke für den tollen Artikel!
Bei mir kommt folgende Fehlermeldung wenn ich
docker-compose up
ausführe:healy-db | 2020-08-14 07:07:58+00:00 [Note] [Entrypoint]: Initializing database files healy-db | mysqld: Can’t create/write to file ‘/var/lib/mysql/is_writable’ (Errcode: 13 - Permission denied) healy-db | 2020-08-14T07:07:58.688838Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). healy-db | 2020-08-14T07:07:58.689991Z 0 [ERROR] --initialize specified but the data directory exists and is not writable. Aborting. healy-db | 2020-08-14T07:07:58.689996Z 0 [ERROR] Aborting healy-db | healy-db exited with code 1
Irgendeine Idee wie ich das beheben kann?