L'auteur a sélectionnéThe FreeBSD Foundation pour recevoir un don dans le cadre du programmeWrite for DOnations.
introduction
Au cours des dernières années,Docker est devenu une solution fréquemment utilisée pour déployer des applications grâce à la façon dont il simplifie l'exécution et le déploiement d'applications dans lescontainers éphémères. Lorsque vous utilisez une pile d'applications LEMP, par exemple, avecPHP,Nginx,MySQL et le frameworkLaravel, Docker peut considérablement rationaliser le processus de configuration.
Docker Compose a encore simplifié le processus de développement en permettant aux développeurs de définir leur infrastructure, y compris les services d'application, les réseaux et les volumes, dans un seul fichier. Docker Compose offre une alternative efficace à l'exécution de plusieurs commandesdocker container create
etdocker container run
.
Dans ce didacticiel, vous allez créer une application Web utilisant le framework Laravel, avec Nginx comme serveur Web et MySQL comme base de données, le tout dans des conteneurs Docker. Vous définirez toute la configuration de la pile dans un fichierdocker-compose
, ainsi que les fichiers de configuration pour PHP, MySQL et Nginx.
Conditions préalables
Avant de commencer, vous aurez besoin de:
-
Un serveur Ubuntu 18.04 et un utilisateur non root avec les privilèges
sudo
. Suivez le tutoriel deInitial Server Setup with Ubuntu 18.04 pour configurer cela. -
Docker installé, en suivant les étapes 1 et 2 deHow To Install and Use Docker on Ubuntu 18.04.
-
Docker Compose installé, après l'étape 1 deHow To Install Docker Compose on Ubuntu 18.04.
[[step-1 -—- download-laravel-and-install-dependencies]] == Étape 1 - Téléchargement de Laravel et installation des dépendances
Dans un premier temps, nous obtiendrons la dernière version de Laravel et installerons les dépendances du projet, y comprisComposer, le gestionnaire de paquets au niveau de l'application pour PHP. Nous allons installer ces dépendances avec Docker pour éviter de devoir installer Composer globalement.
Tout d'abord, vérifiez que vous êtes dans votre répertoire personnel et clonez la dernière version de Laravel dans un répertoire appelélaravel-app
:
cd ~
git clone https://github.com/laravel/laravel.git laravel-app
Accédez au répertoirelaravel-app
:
cd ~/laravel-app
Ensuite, utilisez lescomposer
image de Docker pour monter les répertoires dont vous aurez besoin pour votre projet Laravel et éviter la surcharge de l'installation de Composer globalement:
docker run --rm -v $(pwd):/app composer install
L'utilisation des indicateurs-v
et--rm
avecdocker run
crée un conteneur éphémère qui sera monté en liaison dans votre répertoire actuel avant d'être supprimé. Cela copiera le contenu de votre répertoire~/laravel-app
dans le conteneur et garantira également que le dossiervendor
créé par Composer à l'intérieur du conteneur est copié dans votre répertoire actuel.
Pour finir, définissez les autorisations sur le répertoire du projet afin qu'il appartienne à votre utilisateur non -root:
sudo chown -R $USER:$USER ~/laravel-app
Cela sera important lorsque vous écrivez le Dockerfile pour l'image de votre application à l'étape 4, car cela vous permettra de travailler avec le code de votre application et d'exécuter des processus dans votre conteneur en tant qu'utilisateur non -root.
Avec votre code d'application en place, vous pouvez définir vos services avec Docker Compose.
[[step-2 -—- creation-the-docker-compose-file]] == Étape 2 - Création du fichier Docker Compose
La construction de vos applications avec Docker Compose simplifie le processus de configuration et de version de votre infrastructure. Pour configurer notre application Laravel, nous allons écrire un fichierdocker-compose
qui définit notre serveur Web, notre base de données et nos services d'application.
Ouvrez le fichier:
nano ~/laravel-app/docker-compose.yml
Dans le fichierdocker-compose
, vous définirez trois services:app
,webserver
etdb
. Ajoutez le code suivant au fichier, en veillant à remplacer le mot de passeroot pourMYSQL_ROOT_PASSWORD
, défini comme unenvironment variable sous le servicedb
, par un mot de passe fort de votre choix :
~/laravel-app/docker-compose.yml
version: '3'
services:
#PHP Service
app:
build:
context: .
dockerfile: Dockerfile
image: digitalocean.com/php
container_name: app
restart: unless-stopped
tty: true
environment:
SERVICE_NAME: app
SERVICE_TAGS: dev
working_dir: /var/www
networks:
- app-network
#Nginx Service
webserver:
image: nginx:alpine
container_name: webserver
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
networks:
- app-network
#MySQL Service
db:
image: mysql:5.7.22
container_name: db
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: laravel
MYSQL_ROOT_PASSWORD: your_mysql_root_password
SERVICE_TAGS: dev
SERVICE_NAME: mysql
networks:
- app-network
#Docker Networks
networks:
app-network:
driver: bridge
Les services définis ici incluent:
-
app
: cette définition de service contient l'application Laravel et exécute une image Docker personnalisée,digitalocean.com/php
, que vous définirez à l'étape 4. Il définit également lesworking_dir
du conteneur sur/var/www
. -
webserver
: cette définition de service extrait lesnginx:alpine
image de Docker et expose les ports80
et443
. -
db
: cette définition de service extrait lesmysql:5.7.22
image de Docker et définit quelques variables d'environnement, y compris une base de données appeléelaravel
pour votre application et le mot de passeroot pour la base de données. Vous êtes libre de nommer la base de données comme vous le souhaitez et vous devez remplaceryour_mysql_root_password
par votre propre mot de passe fort. Cette définition de service mappe également le port3306
sur l'hôte au port3306
sur le conteneur.
Chaque propriétécontainer_name
définit un nom pour le conteneur, qui correspond au nom du service. Si vous ne définissez pas cette propriété, Docker attribue un nom à chaque conteneur en combinant le nom d’une personne historiquement célèbre et un mot aléatoire, séparés par un trait de soulignement.
Pour faciliter la communication entre les conteneurs, les services sont connectés à un réseau pont appeléapp-network
. Un réseau ponté utilise un pont logiciel permettant aux conteneurs connectés au même réseau pont de communiquer entre eux. Le pilote de pont installe automatiquement les règles sur la machine hôte afin que les conteneurs situés sur différents réseaux de pont ne puissent pas communiquer directement les uns avec les autres. Cela crée un niveau de sécurité plus élevé pour les applications, garantissant que seuls les services associés peuvent communiquer entre eux. Cela signifie également que vous pouvez définir plusieurs réseaux et services se connectant à des fonctions associées: les services d'application frontaux peuvent utiliser un réseaufrontend
, par exemple, et les services back-end peuvent utiliser un réseaubackend
.
Voyons comment ajouter des volumes et lier des montages à vos définitions de service pour conserver les données de votre application.
[[step-3 -—- persisting-data]] == Étape 3 - Données persistantes
Docker dispose de fonctionnalités puissantes et pratiques pour la persistance des données. Dans notre application, nous utiliseronsvolumes etbind mounts pour conserver la base de données et les fichiers d'application et de configuration. Les volumes offrent de la flexibilité pour les sauvegardes et la persistance au-delà du cycle de vie d’un conteneur, tandis que les montages de liaison facilitent les modifications de code pendant le développement, en rendant les modifications apportées à vos fichiers ou répertoires hôtes immédiatement disponibles dans vos conteneurs. Notre configuration utilisera les deux.
[.warning] #Warning: En utilisant des montages de liaison, vous permettez de changer le système de fichiers hôte via des processus s'exécutant dans un conteneur, y compris la création, la modification ou la suppression de fichiers ou répertoires système importants. Il s'agit d'une capacité puissante ayant des implications en matière de sécurité et pouvant avoir un impact sur les processus non Docker sur le système hôte. Utilisez les montures de liaison avec précaution.
#
Dans le fichierdocker-compose
, définissez un volume appelédbdata
sous la définition de servicedb
pour conserver la base de données MySQL:
~/laravel-app/docker-compose.yml
...
#MySQL Service
db:
...
volumes:
- dbdata:/var/lib/mysql
networks:
- app-network
...
Le volume nommédbdata
conserve le contenu du dossier/var/lib/mysql
présent à l'intérieur du conteneur. Cela vous permet d'arrêter et de redémarrer le servicedb
sans perdre de données.
Au bas du fichier, ajoutez la définition du volumedbdata
:
~/laravel-app/docker-compose.yml
...
#Volumes
volumes:
dbdata:
driver: local
Avec cette définition en place, vous pourrez utiliser ce volume sur plusieurs services.
Ensuite, ajoutez un montage de liaison au servicedb
pour les fichiers de configuration MySQL que vous allez créer à l'étape 7:
~/laravel-app/docker-compose.yml
...
#MySQL Service
db:
...
volumes:
- dbdata:/var/lib/mysql
- ./mysql/my.cnf:/etc/mysql/my.cnf
...
Ce montage de liaison lie~/laravel-app/mysql/my.cnf
à/etc/mysql/my.cnf
dans le conteneur.
Ensuite, ajoutez des montages de liaison au servicewebserver
. Il y en aura deux: un pour votre code d'application et un autre pour la définition de configuration Nginx que vous allez créer à l'étape 6:
~/laravel-app/docker-compose.yml
#Nginx Service
webserver:
...
volumes:
- ./:/var/www
- ./nginx/conf.d/:/etc/nginx/conf.d/
networks:
- app-network
Le premier montage de liaison lie le code de l'application dans le répertoire~/laravel-app
au répertoire/var/www
à l'intérieur du conteneur. Le fichier de configuration que vous ajouterez à~/laravel-app/nginx/conf.d/
sera également monté sur/etc/nginx/conf.d/
dans le conteneur, vous permettant d’ajouter ou de modifier le contenu du répertoire de configuration selon vos besoins.
Enfin, ajoutez les montages de liaison suivants au serviceapp
pour le code d'application et les fichiers de configuration:
~/laravel-app/docker-compose.yml
#PHP Service
app:
...
volumes:
- ./:/var/www
- ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
networks:
- app-network
Le serviceapp
est en train de monter en liaison le dossier~/laravel-app
, qui contient le code de l'application, dans le dossier/var/www
du conteneur. Cela accélérera le processus de développement, car toutes les modifications apportées à votre répertoire d'applications locales seront immédiatement répercutées dans le conteneur. Vous liez également votre fichier de configuration PHP,~/laravel-app/php/local.ini
, à/usr/local/etc/php/conf.d/local.ini
à l'intérieur du conteneur. Vous allez créer le fichier de configuration PHP local à l’étape 5.
Votre fichierdocker-compose
ressemblera maintenant à ceci:
~/laravel-app/docker-compose.yml
version: '3'
services:
#PHP Service
app:
build:
context: .
dockerfile: Dockerfile
image: digitalocean.com/php
container_name: app
restart: unless-stopped
tty: true
environment:
SERVICE_NAME: app
SERVICE_TAGS: dev
working_dir: /var/www
volumes:
- ./:/var/www
- ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
networks:
- app-network
#Nginx Service
webserver:
image: nginx:alpine
container_name: webserver
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./:/var/www
- ./nginx/conf.d/:/etc/nginx/conf.d/
networks:
- app-network
#MySQL Service
db:
image: mysql:5.7.22
container_name: db
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: laravel
MYSQL_ROOT_PASSWORD: your_mysql_root_password
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
- dbdata:/var/lib/mysql/
- ./mysql/my.cnf:/etc/mysql/my.cnf
networks:
- app-network
#Docker Networks
networks:
app-network:
driver: bridge
#Volumes
volumes:
dbdata:
driver: local
Enregistrez le fichier et quittez votre éditeur lorsque vous avez terminé les modifications.
Une fois votre fichierdocker-compose
écrit, vous pouvez désormais créer l'image personnalisée pour votre application.
[[step-4 -—- creation-the-dockerfile]] == Étape 4 - Création du Dockerfile
Docker vous permet de spécifier l'environnement à l'intérieur de conteneurs individuels avec unDockerfile. Un fichier Dockerfile vous permet de créer des images personnalisées que vous pouvez utiliser pour installer le logiciel requis par votre application et configurer les paramètres en fonction de vos besoins. Vous pouvez pousser les images personnalisées que vous créez versDocker Hub ou n'importe quel registre privé.
NosDockerfile
seront situés dans notre répertoire~/laravel-app
. Créez le fichier:
nano ~/laravel-app/Dockerfile
CeDockerfile
définira l'image de base et spécifiera les commandes et instructions nécessaires pour construire l'image de l'application Laravel. Ajoutez le code suivant au fichier:
~/laravel-app/php/Dockerfile
FROM php:7.2-fpm
# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/
# Set working directory
WORKDIR /var/www
# Install dependencies
RUN apt-get update && apt-get install -y \
build-essential \
mysql-client \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
locales \
zip \
jpegoptim optipng pngquant gifsicle \
vim \
unzip \
git \
curl
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install extensions
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
RUN docker-php-ext-install gd
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www
# Copy existing application directory contents
COPY . /var/www
# Copy existing application directory permissions
COPY --chown=www:www . /var/www
# Change current user to www
USER www
# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]
Tout d'abord, le Dockerfile crée une image au-dessus desphp:7.2-fpm
Docker image. Il s'agit d'une image basée sur Debian sur laquelle l'implémentation PHP FastCGIPHP-FPM est installée. Le fichier installe également les packages prérequis pour Laravel:mcrypt
,pdo_mysql
,mbstring
etimagick
aveccomposer
.
La directiveRUN
spécifie les commandes pour mettre à jour, installer et configurer les paramètres à l'intérieur du conteneur, y compris la création d'un utilisateur et d'un groupe dédiés appeléswww. L'instructionWORKDIR
spécifie le répertoire/var/www
comme répertoire de travail de l'application.
La création d'un utilisateur et d'un groupe dédiés avec des autorisations restreintes atténue la vulnérabilité inhérente à l'exécution de conteneurs Docker, qui s'exécutent par défaut en tant queroot. Au lieu d'exécuter ce conteneur en tant queroot, nous avons créé l'utilisateurwww, qui a un accès en lecture / écriture au dossier/var/www
grâce à l'instructionCOPY
que nous sommes à l'aide de l'indicateur--chown
pour copier les autorisations du dossier d'application.
Enfin, la commandeEXPOSE
expose un port dans le conteneur,9000
, pour le serveurphp-fpm
. CMD
spécifie la commande qui doit s'exécuter une fois le conteneur créé. Ici,CMD
spécifie"php-fpm"
, qui démarrera le serveur.
Enregistrez le fichier et quittez votre éditeur lorsque vous avez terminé les modifications.
Vous pouvez maintenant passer à la définition de votre configuration PHP.
[[step-5 -—- configuring-php]] == Étape 5 - Configuration de PHP
Maintenant que vous avez défini votre infrastructure dans le fichierdocker-compose
, vous pouvez configurer le service PHP pour qu'il agisse comme un processeur PHP pour les requêtes entrantes de Nginx.
Pour configurer PHP, vous allez créer le fichierlocal.ini
dans le dossierphp
. Il s'agit du fichier que vous avez monté en liaison avec/usr/local/etc/php/conf.d/local.ini
à l'intérieur du conteneur à l'étape 2. La création de ce fichier vous permettra de remplacer le fichierphp.ini
par défaut que PHP lit au démarrage.
Créez le répertoirephp
:
mkdir ~/laravel-app/php
Ensuite, ouvrez le fichierlocal.ini
:
nano ~/laravel-app/php/local.ini
Pour montrer comment configurer PHP, nous ajouterons le code suivant pour définir les limites de taille des fichiers téléchargés:
~/laravel-app/php/local.ini
upload_max_filesize=40M
post_max_size=40M
Les directivesupload_max_filesize
etpost_max_size
définissent la taille maximale autorisée pour les fichiers téléchargés et montrent comment vous pouvez définir les configurationsphp.ini
à partir de votre fichierlocal.ini
. Vous pouvez mettre toute configuration spécifique à PHP que vous souhaitez remplacer dans le fichierlocal.ini
.
Enregistrez le fichier et quittez votre éditeur.
Avec votre fichier PHPlocal.ini
en place, vous pouvez passer à la configuration de Nginx.
[[step-6 -—- configuring-nginx]] == Étape 6 - Configuration de Nginx
Avec le service PHP configuré, vous pouvez modifier le service Nginx pour utiliser PHP-FPM en tant que serveur FastCGI afin de servir du contenu dynamique. Le serveur FastCGI est basé sur un protocole binaire pour l’interfaçage de programmes interactifs avec un serveur Web. Pour plus d'informations, reportez-vous à cet article surUnderstanding and Implementing FastCGI Proxying in Nginx.
Pour configurer Nginx, vous allez créer un fichierapp.conf
avec la configuration du service dans le dossier~/laravel-app/nginx/conf.d/
.
Commencez par créer le répertoirenginx/conf.d/
:
mkdir -p ~/laravel-app/nginx/conf.d
Ensuite, créez le fichier de configuration deapp.conf
:
nano ~/laravel-app/nginx/conf.d/app.conf
Ajoutez le code suivant au fichier pour spécifier votre configuration Nginx:
~/laravel-app/nginx/conf.d/app.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;
}
}
Leserver block définit la configuration du serveur Web Nginx avec les directives suivantes:
-
listen
: cette directive définit le port sur lequel le serveur écoutera les requêtes entrantes. -
error_log
etaccess_log
: ces directives définissent les fichiers pour l'écriture des journaux. -
root
: cette directive définit le chemin du dossier racine, formant le chemin complet de tout fichier demandé sur le système de fichiers local.
Dans le bloc d'emplacementphp
, la directivefastcgi_pass
spécifie que le serviceapp
écoute sur un socket TCP sur le port9000
. Cela fait que le serveur PHP-FPM écoute sur le réseau plutôt que sur un socket Unix. Bien qu'un socket Unix ait un léger avantage en vitesse par rapport à un socket TCP, il n'a pas de protocole réseau et ignore donc la pile réseau. Dans les cas où les hôtes sont situés sur une seule machine, un socket Unix peut avoir un sens, mais dans les cas où des services s'exécutent sur des hôtes différents, un socket TCP offre l'avantage de vous permettre de vous connecter à des services distribués. Comme notre conteneurapp
s'exécute sur un hôte différent de celui de notre conteneurwebserver
, un socket TCP est le plus logique pour notre configuration.
Enregistrez le fichier et quittez votre éditeur lorsque vous avez terminé les modifications.
Grâce au montage de liaison que vous avez créé à l'étape 2, toutes les modifications que vous apportez dans le dossiernginx/conf.d/
seront directement reflétées dans le conteneurwebserver
.
Ensuite, regardons nos paramètres MySQL.
[[step-7 -—- configuring-mysql]] == Étape 7 - Configurer MySQL
Avec PHP et Nginx configurés, vous pouvez permettre à MySQL d’agir comme base de données pour votre application.
Pour configurer MySQL, vous allez créer le fichiermy.cnf
dans le dossiermysql
. Il s'agit du fichier que vous avez monté en liaison avec/etc/mysql/my.cnf
à l'intérieur du conteneur à l'étape 2. Ce montage de liaison vous permet de remplacer les paramètresmy.cnf
en cas de besoin.
Pour montrer comment cela fonctionne, nous allons ajouter des paramètres au fichiermy.cnf
qui activent le journal des requêtes générales et spécifient le fichier journal.
Commencez par créer le répertoiremysql
:
mkdir ~/laravel-app/mysql
Ensuite, créez le fichiermy.cnf
:
nano ~/laravel-app/mysql/my.cnf
Dans le fichier, ajoutez le code suivant pour activer le journal de requête et définir l'emplacement du fichier de journal:
~/laravel-app/mysql/my.cnf
[mysqld]
general_log = 1
general_log_file = /var/lib/mysql/general.log
Ce fichiermy.cnf
active les journaux, définissant le paramètregeneral_log
comme1
pour autoriser les journaux généraux. Le paramètregeneral_log_file
spécifie où les journaux seront stockés.
Enregistrez le fichier et quittez votre éditeur.
Notre prochaine étape sera de démarrer les conteneurs.
[[step-8 -—- running-the-containers-and-modifying-environment-settings]] == Étape 8 - Exécution des conteneurs et modification des paramètres d'environnement
Maintenant que vous avez défini tous vos services dans votre fichierdocker-compose
et créé les fichiers de configuration pour ces services, vous pouvez démarrer les conteneurs. Cependant, comme étape finale, nous allons faire une copie du fichier.env.example
que Laravel inclut par défaut et nommer la copie.env
, qui est le fichier que Laravel s'attend à définir son environnement:
cp .env.example .env
Nous allons configurer les détails spécifiques de notre configuration dans ce fichier une fois que nous aurons démarré les conteneurs.
Avec tous vos services définis dans votre fichierdocker-compose
, il vous suffit d'émettre une seule commande pour démarrer tous les conteneurs, créer les volumes, configurer et connecter les réseaux:
docker-compose up -d
Lorsque vous exécutezdocker-compose up
pour la première fois, il télécharge toutes les images Docker nécessaires, ce qui peut prendre un certain temps. Une fois les images téléchargées et stockées sur votre ordinateur local, Compose créera vos conteneurs. L'indicateur-d
démonise le processus, exécutant vos conteneurs en arrière-plan.
Une fois le processus terminé, utilisez la commande suivante pour répertorier tous les conteneurs en cours d'exécution:
docker ps
Vous verrez la sortie suivante avec des détails sur vos conteneursapp
,webserver
etdb
:
OutputCONTAINER ID NAMES IMAGE STATUS PORTS
c31b7b3251e0 db mysql:5.7.22 Up 2 seconds 0.0.0.0:3306->3306/tcp
ed5a69704580 app digitalocean.com/php Up 2 seconds 9000/tcp
5ce4ee31d7c0 webserver nginx:alpine Up 2 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp
LeCONTAINER ID
dans cette sortie est un identifiant unique pour chaque conteneur, tandis queNAMES
répertorie le nom de service associé à chacun. Vous pouvez utiliser ces deux identificateurs pour accéder aux conteneurs. IMAGE
définit le nom de l'image pour chaque conteneur, tandis queSTATUS
fournit des informations sur l'état du conteneur: s'il est en cours d'exécution, redémarré ou arrêté.
Vous pouvez maintenant modifier le fichier.env
sur le conteneurapp
pour inclure des détails spécifiques sur votre configuration.
Ouvrez le fichier à l'aide dedocker-compose exec
, qui vous permet d'exécuter des commandes spécifiques dans des conteneurs. Dans ce cas, vous ouvrez le fichier pour le modifier:
docker-compose exec app nano .env
Trouvez le bloc qui spécifieDB_CONNECTION
et mettez-le à jour pour refléter les spécificités de votre configuration. Vous allez modifier les champs suivants:
-
DB_HOST
sera votre conteneur de base de donnéesdb
. -
DB_DATABASE
sera la base de donnéeslaravel
. -
DB_USERNAME
sera le nom d'utilisateur que vous utiliserez pour votre base de données. Dans ce cas, nous utiliseronslaraveluser
. -
DB_PASSWORD
sera le mot de passe sécurisé que vous souhaitez utiliser pour ce compte utilisateur.
/var/www/.env
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=your_laravel_db_password
Enregistrez vos modifications et quittez votre éditeur.
Ensuite, définissez la clé d'application pour l'application Laravel avec la commandephp artisan key:generate
. Cette commande générera une clé et la copiera dans votre fichier.env
, garantissant que vos sessions utilisateur et vos données chiffrées restent sécurisées:
docker-compose exec app php artisan key:generate
Vous disposez maintenant des paramètres d’environnement requis pour exécuter votre application. Pour mettre en cache ces paramètres dans un fichier, ce qui augmentera la vitesse de chargement de votre application, exécutez:
docker-compose exec app php artisan config:cache
Vos paramètres de configuration seront chargés dans/var/www/bootstrap/cache/config.php
sur le conteneur.
Pour finir, visitezhttp://your_server_ip
dans le navigateur. Vous verrez la page d'accueil suivante pour votre application Laravel:
Avec vos conteneurs en cours d'exécution et vos informations de configuration en place, vous pouvez passer à la configuration de vos informations utilisateur pour la base de donnéeslaravel
sur le conteneurdb
.
[[step-9 -—- creation-a-user-for-mysql]] == Étape 9 - Création d'un utilisateur pour MySQL
L'installation MySQL par défaut crée uniquement le compte administratif deroot, qui dispose de privilèges illimités sur le serveur de base de données. En général, il vaut mieux éviter d’utiliser le compte administratif deroot lors de l’interaction avec la base de données. Créons plutôt un utilisateur de base de données dédié pour la base de données Laravel de notre application.
Pour créer un nouvel utilisateur, exécutez un shell bash interactif sur le conteneurdb
avecdocker-compose exec
:
docker-compose exec db bash
À l'intérieur du conteneur, connectez-vous au compte administratif de MySQLroot:
mysql -u root -p
Vous serez invité à entrer le mot de passe que vous avez défini pour le compte MySQLroot lors de l'installation dans votre fichierdocker-compose
.
Commencez par rechercher la base de données appeléelaravel
, que vous avez définie dans votre fichierdocker-compose
. Exécutez la commandeshow databases
pour rechercher les bases de données existantes:
show databases;
Vous verrez la base de donnéeslaravel
répertoriée dans la sortie:
Output+--------------------+
| Database |
+--------------------+
| information_schema |
| laravel |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
Ensuite, créez le compte utilisateur qui sera autorisé à accéder à cette base de données. Notre nom d'utilisateur seralaraveluser
, mais vous pouvez le remplacer par un autre nom si vous préférez. Assurez-vous simplement que votre nom d'utilisateur et votre mot de passe correspondent aux détails que vous avez définis dans votre fichier.env
à l'étape précédente:
GRANT ALL ON laravel.* TO 'laraveluser'@'%' IDENTIFIED BY 'your_laravel_db_password';
Videz les privilèges pour informer le serveur MySQL des modifications:
FLUSH PRIVILEGES;
Quittez MySQL:
EXIT;
Enfin, quittez le conteneur:
exit
Vous avez configuré le compte d'utilisateur pour votre base de données d'application Laravel et êtes prêt à migrer vos données et à utiliser la console Tinker.
[[step-10 -—- migrating-data-and-working-with-the-tinker-console]] == Étape 10 - Migration des données et utilisation de la Tinker Console
Avec votre application en cours d'exécution, vous pouvez migrer vos données et expérimenter la commandetinker
, qui lancera une consolePsySH avec Laravel préchargé. PsySH est une console de développement pour le développement et un débogueur interactif pour PHP, et Tinker est un REPL spécifiquement pour Laravel. L'utilisation de la commandetinker
vous permettra d'interagir avec votre application Laravel depuis la ligne de commande dans un shell interactif.
Tout d'abord, testez la connexion à MySQL en exécutant la commande Laravelartisan migrate
, qui crée une tablemigrations
dans la base de données depuis l'intérieur du conteneur:
docker-compose exec app php artisan migrate
Cette commande va migrer les tables Laravel par défaut. La sortie confirmant la migration ressemblera à ceci:
Output
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table
Une fois la migration terminée, vous pouvez exécuter une requête pour vérifier si vous êtes correctement connecté à la base de données à l'aide de la commandetinker
:
docker-compose exec app php artisan tinker
Testez la connexion MySQL en récupérant les données que vous venez de migrer:
\DB::table('migrations')->get();
Vous verrez une sortie qui ressemble à ceci:
Output=> Illuminate\Support\Collection {#2856
all: [
{#2862
+"id": 1,
+"migration": "2014_10_12_000000_create_users_table",
+"batch": 1,
},
{#2865
+"id": 2,
+"migration": "2014_10_12_100000_create_password_resets_table",
+"batch": 1,
},
],
}
Vous pouvez utilisertinker
pour interagir avec vos bases de données et expérimenter des services et des modèles.
Avec votre application Laravel en place, vous êtes prêt pour un développement et des expériences plus poussés.
Conclusion
Vous avez maintenant une application de pile LEMP s'exécutant sur votre serveur, que vous avez testée en accédant à la page d'accueil de Laravel et en créant des migrations de bases de données MySQL.
La simplicité de cette installation repose sur Docker Compose, qui vous permet de créer un groupe de conteneurs Docker, définis dans un fichier unique, à l’aide d’une seule commande. Si vous souhaitez en savoir plus sur la façon de faire de la CI avec Docker Compose, jetez un œil àHow To Configure a Continuous Integration Testing Environment with Docker and Docker Compose on Ubuntu 16.04. Si vous souhaitez rationaliser le processus de déploiement de votre application Laravel,How to Automatically Deploy Laravel Applications with Deployer on Ubuntu 16.04 sera une ressource pertinente.