Laravel est un framework PHP gratuit et open source qui implémente le modèle de conception MVC (Model-View-Controller). Il est conçu avec une facilité d'utilisation et permet aux développeurs de créer des applications simples et complexes en un rien de temps. Laravel a été créé par Taylor Otwell en 2011, dans le but de fournir une alternative avancée au framework CodeIgniter (CI). En 2011, Laravel a publié les versions 1 et 2, et la dernière version 5.6 est livrée avec des fonctionnalités supplémentaires et améliorées telles que la prise en charge de la ligne de commande (CLI) nommée "artisan", la prise en charge de différents systèmes de base de données, des améliorations de routage, etc.
Dans ce guide, nous allons vous montrer comment Dockeriser le projet Laravel avec PHP-FPM, la base de données MySQL et le serveur Web Nginx à l'aide de Docker Compose sur le serveur Ubuntu 18.04. Nous allons créer une nouvelle image docker pour le projet Laravel, puis créer le script docker-compose.yml qui contient certains services, notamment l'application/Laravel elle-même, le serveur Web Nginx et la base de données MySQL.
Prérequis
- Ubuntu 18.04
- Privilèges root
Ce que nous allons faire :
- Installer Docker et Docker Compose
- Télécharger Laravel et installer les dépendances
- Dockeriser le projet Laravel
- Définir le service d'application Laravel
- Définir le service HTTP Nginx
- Définir le service de base de données MySQL
- Créer un hôte virtuel Nginx pour Laravel
- Créer Dockerfile pour l'application Laravel
- Créer le projet Laravel
- Post-installation de Laravel
Étape 1 - Installer Docker et Docker Compose
Tout d'abord, nous allons installer les packages Docker et Docker Compose sur le système Ubuntu. Et nous utiliserons les packages Docker du référentiel officiel Ubuntu.
Avant d'aller plus loin, nous devons mettre à jour les référentiels sur le système Ubuntu. Simplement en exécutant la commande suivante.
mise à jour sudo apt
Installez maintenant les packages Docker et Docker Compose à l'aide de la commande apt ci-dessous.
sudo apt install docker.io -y
sudo apt install docker-compose -y
Les packages Docker et Docker Compose doivent maintenant être installés sur le système, vérifiez-le à l'aide des commandes suivantes.
version docker
version docker-compose
En conséquence, vous obtiendrez la version de Docker et Docker Compose sur le système.
Ensuite, nous devons affecter l'utilisateur non root au groupe docker afin d'exécuter le conteneur Docker pour les utilisateurs non root.
Dans ce cas, nous allons ajouter l'utilisateur appelé 'hakase' au groupe docker en exécutant la commande suivante.
usermod -a -G docker hakase
Et après cela, connectez-vous au shell utilisateur 'hakase' et exécutez la commande docker 'hello-world'.
su - hakase
docker run hello-world
Le message "Hello World" de Docker s'affiche maintenant et l'installation de Docker est terminée.
Étape 2 - Télécharger Laravel et installer les dépendances
Dans cette étape, nous allons télécharger le framework Web Laravel dans le répertoire d'accueil "hakase", puis installer les dépendances Laravel à l'aide de l'image docker PHP "composer". Assurez-vous donc que vous êtes connecté au serveur en tant qu'utilisateur non root.
Téléchargez le projet Laravel dans le répertoire 'myapp' et allez-y.
git clone https://github.com/laravel/laravel.git myapp/
cd myapp/
Exécutez maintenant la commande docker suivante afin d'installer les dépendances Laravel.
docker run --rm -v $(pwd):/app composer install
Avec la commande ci-dessus, nous allons exécuter un nouveau conteneur docker temporaire et monter le répertoire du projet 'myapp' dans le répertoire '/app' du conteneur. Le conteneur est basé sur l'image docker 'composer' et nous installons les dépendances Laravel à l'aide de la commande 'composer' dans ce conteneur temporaire.
Une fois l'installation des dépendances Laravel terminée, nous devons changer le propriétaire du répertoire 'myapp' en notre propre utilisateur en utilisant la commande sudo ci-dessous.
sudo chown -R $USER:$USER ~/myapp
Étape 3 - Dockeriser le projet Laravel
Après avoir téléchargé Laravel et installé ses dépendances, nous allons créer un nouveau script docker-compose.yml et créer un nouveau Dockerfile pour le projet Laravel.
cd myapp/
vim docker-compose.yml
- Définir le service d'application Laravel
Tout d'abord, nous allons définir le projet Laravel lui-même et créer l'image docker du projet Laravel à l'aide du Dockerfile.
Collez-y le script de composition docker.
version :'3'
services :
#Laravel App
app :
build :
contexte :.
dockerfile :Dockerfile
image :hakase-labs/laravel
nom_conteneur :app
redémarrage :sauf si arrêté
tty :vrai
environnement :
SERVICE_NAME :app
SERVICE_TAGS :dev
working_dir :/var/www/html
volumes :
- ./:/var/www/html
réseaux :
- mynetDétails du service de conteneur Laravel :
- Le service de conteneur Laravel sera nommé "app". Il est basé sur notre image docker personnalisée qui sera créée avec notre "Dockerfile", et la nouvelle image sera nommée "hakase-labs/laravel".
- Nous voulons monter le répertoire du projet "myapp" sur "/var/www/html" à l'intérieur du service de conteneur.
- Nous utilisons le réseau docker personnalisé pour notre configuration, le réseau sera nommé "mynet".
- Définir le service HTTP Nginx
Nous allons maintenant définir le service de conteneur nginx.
Collez la configuration suivante après la ligne de service de conteneur 'app'.
#Nginx Service
nginx :
image :nginx:alpine
container_name :nginx
redémarrage :sauf si arrêté
tty :vrai
ports :
- "80:80"
- "443:443"
volumes :
- ./:/var/www/html
- ./nginx/conf .d/:/etc/nginx/conf.d/
- ./nginx/ssl/:/etc/nginx/ssl/
réseaux :
- mynet
Détails de configuration du service de conteneur nginx :
- Nous souhaitons créer un nouveau conteneur nommé "nginx" basé sur l'image docker "nginx:alpine".
- Le service de conteneur ouvrira les ports HTTP et HTTPS.
- Le conteneur montera trois volumes différents. Le répertoire du projet 'myapp' dans le répertoire '/var/www/html', la configuration de l'hôte virtuel nginx 'nginx/conf.d/' dans le répertoire '/etc/nginx/conf.d' et les fichiers de certificat de montage ' nginx/ssl/' dans le répertoire '/etc/nginx/ssl' sur le conteneur.
- Le service de conteneur utilisera le même réseau appelé "mynet".
- Définir le service de base de données MySQL
Et le dernier, nous définissons le service de base de données MySQL.
Collez la configuration suivante après la ligne de service de conteneur 'nginx'.
#MySQL Service
db :
image :mysql:5.7
nom_du_conteneur :db
redémarrage :sauf si arrêté
tty :vrai
ports :
- "3306:3306"
environnement :
MYSQL_DATABASE :laraveldb
MYSQL_USER :laravel
MYSQL_PASSWORD :laravelpassworddb
MYSQL_ROOT_PASSWORD :rootpasswordmysql volumes :
- mysqldata :/var/lib/mysql/
réseaux :
- mynet
#Docker Networks
networks :
mynet :
pilote :pont
#Volumes
volumes :
mysqldata :
pilote :local
Enregistrez et fermez la configuration.
Détails du service de conteneur MySQL :
- Le service de conteneur MySQL sera nommé 'db', basé sur l'image docker 'mysql:5.7'.
- Le service 'db' ouvrira le port MySQL par défaut '3306'.
- Le projet Laravel utilisera la base de données, l'utilisateur et le mot de passe basés sur la variable d'environnement du service 'db'.
- Le service "db" de MySQL montera le volume nommé "mysqldata" et aura le même réseau "mynet".
- Et nous définissons le réseau personnalisé 'mynet' avec le pilote 'bridge', et le volume 'mysqldata' utilisera le pilote 'local'.
Vous trouverez ci-dessous la configuration "docker-compose.yml" terminée :
version :'3'services :#Laravel App app :build :contexte :. dockerfile :image Dockerfile :hakase-labs/laravel nom_conteneur :redémarrage de l'application :sauf si arrêté tty :vrai environnement :SERVICE_NAME :application SERVICE_TAGS :dev working_dir :/var/www/html volumes : - ./:/var/www/html réseaux :- mynet #Nginx Service nginx :image :nginx:alpine container_name :nginx restart :until-stopped tty : true ports :- "80:80" - "443:443" volumes :- ./:/var/www/html - ./nginx/conf.d/:/etc/nginx/conf.d/ - ./nginx/ssl/:/etc/nginx/ssl/ networks :- mynet #MySQL Service db :image :mysql:5.7 container_name :redémarrage de la base de données :tty à moins d'être arrêté :vrais ports :- "3306:3306" environnement :MYSQL_DATABASE :laraveldb MYSQL_USER :laravel MYSQL_PASSWORD :laravelpassworddb MYSQL_ROOT_PASSWORD :rootpassword volumes mysql :- mysqldata:/var/lib/mysql/ réseaux :- mynet#Docker Networksnetworks :mynet:driver:bridge#Volumesvolumes:mysqldata:pilote :local
- Créer un hôte virtuel Nginx pour Laravel
Dans le répertoire du projet 'myapp', créez un nouveau répertoire nommé 'nginx' qui contiendra deux autres répertoires 'conf.d' et 'ssl'. Créez ensuite une nouvelle configuration d'hôte virtuel nginx 'laravel.conf' dans le répertoire 'conf.d'.
Exécutez la commande suivante.
mkdir -p nginx/{conf.d,ssl}
vim nginx/conf.d/laravel.conf
serveur { écoute 80 ; nom_serveur laravel.hakase-labs.io ; retour 301 https://laravel.hakase-labs.io$request_uri;}serveur { écouter 443 ssl http2; nom_serveur laravel.hakase-labs.io ; certificat_ssl /etc/nginx/ssl/fullchain.pem ; ssl_certificate_key /etc/nginx/ssl/privkey.pem ; # Fichiers journaux pour Debug error_log /var/log/nginx/error.log ; access_log /var/log/nginx/access.log ; # racine du répertoire racine Web Laravel /var/www/html/public; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; gzip_static activé ; } # Requêtes Nginx Pass à l'emplacement PHP-FPM ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; application fastcgi_pass :9000 ; fastcgi_index index.php ; inclure fastcgi_params ; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name ; fastcgi_param PATH_INFO $fastcgi_path_info ; }}
Enregistrez et fermez.
Après cela, copiez votre fichier de certificat ssl dans le répertoire 'nginx/ssl/'.
sudo cp /path/to/ssl/fullchain.pem nginx/ssl/
sudo cp /path/to/ssl/privkey.pem nginx/ssl/
- Créer Dockerfile pour l'application Laravel
Ensuite, créez un nouveau Dockerfile pour le projet Laravel.
Exécutez la commande suivante.
vim Dockerfile
Collez la configuration ci-dessous.
# Définir l'image principaleFROM php:7.2-fpm-alpine# Copier composer.lock et composer.jsonCOPY composer.lock composer.json /var/www/html/# Définir le répertoire de travailWORKDIR /var/www/html# Installer les dépendances supplémentairesRUN apk update &&apk add --no-cache \ build-base shadow vim curl \ php7 \ php7-fpm \ php7-common \ php7-pdo \ php7-pdo_mysql \ php7-mysqli \ php7-mcrypt \ php7-mbstring \ php7- xml \ php7-openssl \ php7-json \ php7-phar \ php7-zip \ php7-gd \ php7-dom \ php7-session \ php7-zlib# Ajouter et activer les extensions PHP-PDORUN docker-php-ext-install pdo pdo_mysqlRUN docker-php-ext-enable pdo_mysql# Installer PHP ComposerRUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer# Supprimer CacheRUN rm -rf /var/cache/apk/*# Ajouter l'UID '1000' à www-dataRUN usermod -u 1000 www- data# Copiez les autorisations de répertoire d'application existantes COPY --chown=www-data:www-data . /var/www/html# Changer l'utilisateur actuel en wwwUSER www-data# Expose le port 9000 et démarre le serveur php-fpmEXPOSE 9000CMD ["php-fpm"]
Enregistrez et fermez la configuration.
Et nous sommes prêts à créer le projet Laravel "myapp" et à exécuter les services de conteneur que nous avons définis.
Étape 4 - Construire Laravel avec les services Nginx et MySQL
Créez l'image docker personnalisée pour notre projet Laravel à l'aide de la commande suivante.
construction docker-compose
Puis relancez la commande suivante.
docker-composer jusqu'à -d
Il téléchargera toutes les images Docker dont nous avons besoin, puis créera des services de conteneur basés sur la configuration "docker-compose.yml".
Une fois terminé, vérifiez à l'aide de la commande docker-compose ci-dessous.
docker-composer ps
Et par conséquent, vous obtiendrez les trois services de conteneurs opérationnels. L''application' qui s'exécute sur le port par défaut '9000' PHP-FPM, le service 'nginx' est sur les ports HTTP et HTTPS, et le service MySQL 'db' sur le port MySQL par défaut '3306'.
Après cela, vérifiez à nouveau toutes les images Docker disponibles et les ports ouverts sur le système.
images de composition docker
netstat -plntu
Vous obtiendrez l'image docker personnalisée 'hakase-labs/laravel' dans la liste, et les ports HTTP et HTTPS sont à l'état 'LISTEN'.
Étape 5 - Post-installation de Laravel
Jusqu'à ce stade, le projet Laravel est opérationnel en tant que conteneur Docker. Et maintenant, nous allons créer un nouveau fichier '.env', générer la clé et migrer les données Laravel à l'aide de la ligne de commande Laravel 'artisan'.
Copiez l'exemple de fichier '.env' et modifiez-le dans le conteneur.
cp .env.example .env
docker-compose exec app vim .env
Modifiez la configuration de la base de données comme ci-dessous.
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laraveldb
DB_USERNAME=laravel
DB_PASSWORD=laravelpassworddb
Enregistrez et fermez.
Ensuite, générez la clé d'application Laravel et effacez la configuration du cache.
docker-compose exec app php artisan key:generate
docker-compose exec app php artisan config:cache
Après cela, migrez la base de données à l'aide de la commande suivante.
docker-compose exec app php artisan migrate
Assurez-vous qu'il n'y a pas d'erreur.
Ouvrez maintenant votre navigateur Web et saisissez le nom de domaine de votre projet.
http://laravel.hakase-labs.io/
Et vous serez redirigé vers la connexion HTTPS sécurisée et la page d'accueil par défaut de Laravel s'affichera comme ci-dessous.
Enfin, le projet Dockerizing de Laravel avec le serveur Web Nginx et la base de données MySQL a été achevé avec succès.