🐳 Entorn Laravel amb Docker (Pas a Pas)
Aquest document descriu detalladament com construir un entorn Laravel completament funcional amb Docker i imatges Alpine des de zero. No es fa servir cap imatge preconfigurada per tal d’aprendre el procés manualment.
📁 Estructura del Projecte
├── docker-compose.yml
├── Dockerfile-laravel
└── docs/
├── mysql.md
├── laravel-php-fpm.md
└── nginx.md
🚧 Pas 1: Crear els Contenidors amb Docker Compose
🧱 Fitxer docker-compose.yml
Defineix 3 serveis:
mysql
: amb MariaDBlaravel
: amb PHP-FPMnginx
: servidor web
També es defineix un volum compartit anomenat laravel-app
.
📄 Exemple de fitxer docker-compose.yml
services:
mysql:
image: alpine:latest
container_name: mysql
command: tail -f /dev/null
networks:
- net-m8
laravel:
build:
context: .
dockerfile: Dockerfile-laravel
container_name: laravel
volumes:
- laravel-app:/laravel
networks:
- net-m8
nginx:
image: alpine:latest
container_name: nginx
ports:
- "80:80"
command: tail -f /dev/null
volumes:
- laravel-app:/var/www/html
networks:
- net-m8
volumes:
laravel-app:
networks:
net-m8:
▶️ Executar:
docker-compose up -d
📦 Pas 2: Configurar el Contenidor MariaDB
docker exec -it mysql sh
-
Actualitza els paquets:
sh apk update
-
Instal·la MariaDB:
sh apk add mariadb mariadb-client
-
Inicialitza i arrenca el servidor:
sh mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql mysqld --user=mysql &
-
Permet connexions remotes:
- Edita
/etc/my.cnf.d/mariadb-server.cnf
- Comenta
skip-networking
i estableixbind-address=0.0.0.0
- Edita
-
Reinicia MariaDB:
sh mysqladmin -u root shutdown mysqld --user=mysql &
-
Crea la base de dades per Laravel:
sh mysql -u root > CREATE DATABASE laravel;
🛠️ Pas 3: Configurar Laravel i PHP-FPM
docker exec -it laravel bash
-
Instal·la dependències:
sh apk add php84 php84-fpm php84-mysqli php84-pdo php84-pdo_mysql php84-openssl php84-tokenizer curl composer nodejs npm bash
-
Configura l’usuari:
sh addgroup -S www-data adduser -S www-data -G www-data
-
Accedeix al volum compartit i crea el projecte:
sh cd /var/www laravel new nom-projecte cd nom-projecte
-
Modifica
.env
per connectar amb MariaDB:DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=
-
Assigna permisos:
sh chown -R www-data:www-data storage bootstrap/cache chmod -R 775 storage bootstrap/cache
-
Aplica les migracions:
sh php artisan migrate
-
Instal·la Laravel Breeze:
sh composer require laravel/breeze --dev php artisan breeze:install npm install && npm run dev
-
Inicia PHP-FPM:
sh php-fpm84
🌐 Pas 4: Configurar NGINX
docker exec -it nginx sh
-
Instal·la NGINX:
sh apk update apk add nginx nano
-
Crea estructura:
sh mkdir -p /etc/nginx/sites-available /etc/nginx/sites-enabled
-
Crea fitxer de configuració Laravel: ```nginx server { listen 80; server_name localhost; root /var/www/nom-projecte/public;
index index.php index.html; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include fastcgi_params; fastcgi_pass laravel:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_index index.php; }
} ```
-
Enllaç simbòlic:
sh ln -s /etc/nginx/sites-available/laravel.conf /etc/nginx/sites-enabled/
-
Edita
/etc/nginx/nginx.conf
per inclouresites-enabled
:nginx include /etc/nginx/sites-enabled/*.conf;
-
Reinicia NGINX:
sh nginx nginx -s reload
🧪 Verificació
- Laravel hauria de respondre correctament en accedir a
http://localhost
- Revisa els logs:
sh cat /var/log/nginx/error.log
🧼 Comandes útils
# Entrar als contenidors
docker exec -it laravel bash
docker exec -it nginx sh
docker exec -it mysql sh
# Aturar contenidors
docker-compose down