Ce guide vous explique comment déployer une application Laravel avec MySQL en utilisant Docker, avec un Dockerfile personnalisé et un script d'entrée.
1. Structure du projet
Votre projet doit contenir les fichiers suivants :
Dockerfile
- Configuration de l'image Dockerentrypoint.sh
- Script d'initialisation du conteneurid_rsa
- Clé SSH privée pour accéder aux dépôts privés
2. Dockerfile
# Utiliser l'image officielle PHP 8.2 avec Apache
FROM php:8.2-apache
# Installer les extensions et outils nécessaires
RUN apt-get update && apt-get install -y \
git \
unzip \
libpng-dev \
libjpeg-dev \
libfreetype6-dev \
libzip-dev \
libicu-dev \
libonig-dev \
openssh-client \
default-mysql-client \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install gd zip intl pdo pdo_mysql mbstring
# Installer Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Configurer les certificats SSH
RUN mkdir -p /root/.ssh
COPY id_rsa /root/.ssh/id_rsa
RUN chmod 600 /root/.ssh/id_rsa && ssh-keyscan github.com >> /root/.ssh/known_hosts
# Définir le répertoire de travail
WORKDIR /var/www/html
# Copier le script d'entrée
COPY entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/entrypoint.sh
# Configurer Apache pour pointer vers le dossier public
RUN sed -i 's|DocumentRoot /var/www/html|DocumentRoot /var/www/html/public|g' /etc/apache2/sites-available/000-default.conf
RUN echo "<Directory /var/www/html/public>\n\tOptions Indexes FollowSymLinks\n\tAllowOverride All\n\tRequire all granted\n</Directory>" >> /etc/apache2/apache2.conf
# Activer le module rewrite d'Apache
RUN a2enmod rewrite
# Exposer le port 80
EXPOSE 80
# Commande par défaut
CMD ["entrypoint.sh"]
3. Script d'entrée (entrypoint.sh)
#!/bin/sh
# Cloner le dépôt privé
git clone git@github.com:Nouvy/mpi-laravel.git .
# Ajuster les permissions du dossier public
chown -R www-data:www-data /var/www/html
chmod -R 755 /var/www/html
# Installer les dépendances Composer
composer install
# Définir les droits du dossier
chown -R www-data:www-data /var/www/html
find /var/www/html/storage -type d -exec chmod 755 {} \;
# Définir les droits des fichiers
find /var/www/html/storage -type f -exec chmod 644 {} \;
touch /var/www/html/storage/logs/laravel.log
chown www-data:www-data /var/www/html/storage/logs/laravel.log
chmod 755 /var/www/html/storage/logs/laravel.log
# Remplir le fichier .env
cat <<EOF > .env
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=secret
BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
MEMCACHED_HOST=127.0.0.1
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
EOF
# Générer la clé d'application Laravel
php artisan key:generate
# Création des tables
php artisan migrate
# Ajout des datas de test
php artisan db:seed
# Démarrer Apache
apache2-foreground
4. Déploiement de la base de données MySQL
Avant de déployer l'application Laravel, vous devez d'abord lancer le conteneur MySQL :
docker run -d \
--name db \
-e MYSQL_ROOT_PASSWORD=secret \
-p 3306:3306 \
mysql
Cette commande :
- Lance MySQL en arrière-plan (
-d
) - Nomme le conteneur
db
- Définit le mot de passe root à
secret
- Expose le port 3306
5. Commandes de déploiement
Construire l'image Docker
docker build -t laravel-app .
Lancer le conteneur Laravel (lié à MySQL)
docker run -d \
-p 80:80 \
--name laravel-container \
--link db:mysql \
laravel-app
Cette commande :
- Lance Laravel en arrière-plan (
-d
) - Expose le port 80
- Nomme le conteneur
laravel-container
- Lie le conteneur
db
avec l'aliasmysql
(accessible depuis Laravel viamysql
)
Vérifier les logs
docker logs laravel-container
6. Points importants
Permissions SSH
- Assurez-vous que votre clé SSH (
id_rsa
) est présente dans le répertoire - La clé doit avoir les bonnes permissions (600)
- Le dépôt GitHub doit être accessible avec cette clé
Configuration de la base de données
- Le conteneur MySQL est accessible depuis Laravel via le nom d'hôte
mysql
- Les paramètres de connexion dans le script
entrypoint.sh
sont déjà configurés pourmysql
- Assurez-vous que le conteneur MySQL est démarré avant Laravel
Variables d'environnement
- Ajustez les variables dans le fichier
.env
généré selon votre environnement - Pour la production, désactivez
APP_DEBUG
et configurezAPP_ENV=production
7. Dépannage
Problèmes de permissions
docker exec -it laravel-container chown -R www-data:www-data /var/www/html
Vérifier les logs Laravel
docker exec -it laravel-container tail -f /var/www/html/storage/logs/laravel.log
Accéder au conteneur
docker exec -it laravel-container bash
Vérifier la connexion MySQL
docker exec -it laravel-container mysql -h mysql -u root -p