Skip to content

Docker Setup

LaraCommerce ships with a fully configured Docker Compose environment with Nginx + SSL. One command starts the entire stack — no manual PHP, MySQL, or Redis installation needed.

Stack

ServiceImageDescription
laravel.testsail-8.5/appPHP 8.5 application
nginxnginx:alpineHTTPS reverse proxy with SSL termination
ssl-setupalpineAuto-generates self-signed SSL certificates
horizonsail-8.5/appQueue worker — php artisan horizon
mysqlmysql:8.4Primary database
redisredis:7-alpineCache, sessions, queues (password protected)
miniominio/minio:latestS3-compatible file storage
minio-setupminio/mc:latestAutomatically creates buckets on first start
meilisearchgetmeili/meilisearch:latestFull-text search engine
mailpitaxllent/mailpit:latestLocal email capture (catches all outgoing mail)
admineradminer:latestDatabase admin UI
redis-commanderrediscommander/redis-commanderRedis admin UI

Requirements

  • Docker Desktop installed and running
  • No PHP, MySQL, or Redis needed locally

Start the Stack

bash
# First time — install PHP dependencies via Docker (no local PHP needed)
docker run --rm \
    -u "$(id -u):$(id -g)" \
    -v "$(pwd):/var/www/html" \
    -w /var/www/html \
    laravelsail/php85-composer:latest \
    composer install --ignore-platform-reqs

# Copy environment file
cp .env.example .env

# Start all containers
docker compose up -d

# Generate app key
docker compose exec laravel.test php artisan key:generate

# Run migrations + seeders
docker compose exec laravel.test php artisan migrate --seed

# Create storage link
docker compose exec laravel.test php artisan storage:link

# Index products in Meilisearch
docker compose exec laravel.test php artisan scout:import "App\Models\Product"
docker compose exec laravel.test php artisan scout:import "App\Models\Category"

Alias

Add this to your shell config (~/.zshrc or ~/.bashrc) to shorten commands:

bash
alias dcex='docker compose exec laravel.test'
# Then: dcex php artisan migrate

Service URLs

ServiceURLCredentials
APIhttps://localhost/api/v1
Admin Panelhttps://localhost/adminadmin@ecommerce.local / Admin123456!
Horizonhttps://localhost/horizonAdmin only
MinIO Consolehttp://localhost:8900minioadmin / minioadmin
Mailpit (email capture)http://localhost:8025
Adminer (DB UI)http://localhost:8080Server: mysql
Redis Commanderhttp://localhost:8081admin / secret
Meilisearchhttp://localhost:7700

HTTPS with self-signed certificate

The Nginx container uses a self-signed SSL certificate generated automatically by the ssl-setup service. Your browser will show a security warning — this is normal in development. Accept the certificate to proceed.

Mailpit

All emails sent by the application (verification, password reset, notifications) are captured by Mailpit in development. Nothing is sent to real inboxes. Check http://localhost:8025 to see them.


Default Credentials

RoleEmailPassword
Adminadmin@ecommerce.localAdmin123456!
Managermanager@ecommerce.localManager123!
Customercustomer@ecommerce.localCustomer123!

MinIO Buckets

Buckets are created automatically at startup by the minio-setup service:

BucketAccessUsed for
${AWS_BUCKET} (e.g. ecommerce)PrivateProduct images, uploads
${AWS_BUCKET}-publicPublicPublicly served images

No manual setup needed.


.env for Docker

The .env.example is pre-configured for Docker. Key values:

ini
APP_PORT=80
APP_SSL_PORT=443
APP_URL=http://localhost

DB_HOST=mysql
DB_DATABASE=ecommerce_db
DB_USERNAME=sail
DB_PASSWORD=password

REDIS_HOST=redis
REDIS_PASSWORD=secret

AWS_ENDPOINT=http://minio:9000
AWS_ACCESS_KEY_ID=minioadmin
AWS_SECRET_ACCESS_KEY=minioadmin
AWS_BUCKET=ecommerce
AWS_USE_PATH_STYLE_ENDPOINT=true

MEILISEARCH_HOST=http://meilisearch:7700
MEILISEARCH_KEY=masterKey

MAIL_HOST=mailpit
MAIL_PORT=1025

TRUSTED_PROXIES=*

FORWARD_MINIO_CONSOLE_PORT=8900

Common Commands

bash
# Start containers
docker compose up -d

# Stop containers
docker compose down

# Run Artisan commands
docker compose exec laravel.test php artisan migrate
docker compose exec laravel.test php artisan tinker
docker compose exec laravel.test php artisan queue:work

# Run tests
docker compose exec laravel.test php artisan test

# Open MySQL shell
docker compose exec mysql mysql -u sail -ppassword ecommerce_db

# Open Redis CLI
docker compose exec redis redis-cli -a secret

# View application logs
docker compose logs -f laravel.test

# View Horizon logs
docker compose logs -f horizon

# Rebuild containers (after Dockerfile changes)
docker compose build --no-cache
docker compose up -d

Stopping & Resetting

bash
# Stop all containers (data preserved)
docker compose down

# Stop and remove all volumes (full reset — deletes all data)
docker compose down -v

Licensed for single or extended use.