A complete Docker setup for running a Laravel application with PHP, MySQL, and Nginx. This project is based on the "Docker & Kubernetes: The Practical Guide" Udemy course.
laravel-docker-stack/
├── dockerfiles/
│ ├── php.dockerfile # PHP-FPM container for Laravel
│ ├── composer.dockerfile # Composer container for dependency management
│ └── nginx.dockerfile # Nginx web server container
├── nginx/
│ ├── nginx.conf # Nginx configuration
│ └── nginx.config
├── env/
│ └── mysql.env # MySQL environment variables
├── src/ # Laravel application (generated)
├── docker-compose.yml # Docker Compose configuration
└── .gitignore # Git ignore rules
- Docker Desktop (or Docker Engine + Docker Compose)
- Git
- Basic knowledge of Docker and Laravel
git clone https://github.com/AhmedShab/laravel-docker-stack.git
cd laravel-docker-stack
Create the env/mysql.env
file with your MySQL credentials:
mkdir -p env
cat > env/mysql.env << EOF
MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=laravel
MYSQL_USER=laravel
MYSQL_PASSWORD=laravel
EOF
docker-compose build
Generate a new Laravel project in the src/
directory:
docker-compose run --rm composer create-project --prefer-dist laravel/laravel .
docker-compose up -d server --build
docker-compose run --rm artisan migrate
docker-compose run --rm artisan key:generate
- Laravel App: http://localhost:8000
- PHP FPM: http://localhost:3000
- Image:
nginx:stable-alpine
- Port: 8000 (mapped to 80 inside container)
- Purpose: Web server that routes requests to PHP-FPM
- Config:
./nginx/nginx.conf
mounted to/etc/nginx/conf.d/default.conf
- Dockerfile:
dockerfiles/php.dockerfile
- Port: 3000
- Purpose: Runs PHP application code
- User:
laravel
(non-root user for security) - Extensions: PDO, PDO MySQL
- Image:
mysql:5.7
- Purpose: Database server
- Credentials: Loaded from
env/mysql.env
- Note: Not exposed to host (internal communication only)
- Dockerfile:
dockerfiles/composer.dockerfile
- Purpose: Manages PHP dependencies
- Usage:
docker-compose run --rm composer <command>
- Dockerfile:
dockerfiles/php.dockerfile
- Purpose: Run Laravel Artisan commands
- Usage:
docker-compose run --rm artisan <command>
- Image:
node:14
- Purpose: Manage JavaScript dependencies and build assets
- Usage:
docker-compose run --rm npm <command>
# Install dependencies
docker-compose run --rm composer install
# Update dependencies
docker-compose run --rm composer update
# Require a new package
docker-compose run --rm composer require vendor/package
# Run migrations
docker-compose run --rm artisan migrate
# Create a new model
docker-compose run --rm artisan make:model ModelName
# Run tinker (interactive shell)
docker-compose run --rm artisan tinker
# Clear cache
docker-compose run --rm artisan cache:clear
# Install dependencies
docker-compose run --rm npm install
# Build assets
docker-compose run --rm npm run build
# Watch for changes
docker-compose run --rm npm run dev
# Start all services
docker-compose up -d
# Stop all services
docker-compose down
# View logs
docker-compose logs -f
# View logs for specific service
docker-compose logs -f php
# Execute command in running container
docker-compose exec php bash
./src:/var/www/html
- Application code./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro
- Read-only Nginx config:delegated
flag - Performance optimization for Docker Desktop
- Services depend on each other (e.g.,
artisan
depends onmysql
) - Ensures proper startup order
- MySQL credentials stored in
env/mysql.env
# Check logs
docker-compose logs <service-name>
# Rebuild images
docker-compose build --no-cache
If ports 8000 or 3000 are already in use, edit docker-compose.yml
:
ports:
- "8001:80" # Change 8000 to 8001
Ensure env/mysql.env
exists and has correct credentials. The MySQL service name is mysql
(not localhost).
- Installs PHP 8.2 with FPM
- Installs PDO and MySQL extensions
- Creates non-root
laravel
user - Sets working directory to
/var/www/html
- Uses official Composer image
- Creates non-root
laravel
user - Ignores platform requirements for compatibility
- Configures Nginx web server
- Routes requests to PHP-FPM
- Defines all services and their configurations
- Sets up volumes for code and configuration
- Manages environment variables and dependencies
This project is open source and available under the MIT License.