# Docker Deployment
Estimated time: 12 minutes
Difficulty: Intermediate
LaraCoreKit supports containerized deployment with Docker, both for local development (via Laravel Sail) and production.
Option 1: Laravel Sail (Development)
Laravel Sail is pre-configured for development containers.
# Install Sail
php artisan sail:install
# Start all services (MySQL, Redis, etc.)
./vendor/bin/sail up -d
# Run artisan commands inside container
./vendor/bin/sail artisan migrate
./vendor/bin/sail artisan queue:work
# Run composer inside container
./vendor/bin/sail composer require some/package
# Run npm inside container
./vendor/bin/sail npm run dev
Option 2: Custom Docker Setup (Production)
Dockerfile
FROM php:8.3-fpm-alpine
# Install system dependencies
RUN apk add --no-cache \
git curl zip unzip \
libpng-dev libjpeg-dev libwebp-dev \
icu-dev libzip-dev \
&& docker-php-ext-install \
pdo_mysql mbstring zip bcmath \
gd intl exif opcache
# Install Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
# Set working directory
WORKDIR /var/www/html
# Copy application
COPY . .
# Install PHP dependencies
RUN composer install --no-dev --optimize-autoloader --no-interaction
# Build frontend assets
COPY --from=node:20-alpine /usr/local/bin/node /usr/local/bin/node
COPY --from=node:20-alpine /usr/local/lib/node_modules /usr/local/lib/node_modules
COPY --from=node:20-alpine /usr/local/bin/npm /usr/local/bin/npm
RUN npm ci && npm run build && rm -rf node_modules
# Optimize Laravel
RUN php artisan optimize
# Set permissions
RUN chown -R www-data:www-data /var/www/html/storage \
&& chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache
EXPOSE 9000
CMD ["php-fpm"]
docker-compose.yml
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
restart: unless-stopped
working_dir: /var/www/html
volumes:
- ./storage:/var/www/html/storage
- ./.env:/var/www/html/.env
depends_on:
- db
- redis
networks:
- laracorekit
nginx:
image: nginx:alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./public:/var/www/html/public
- ./docker/nginx.conf:/etc/nginx/conf.d/default.conf
- /etc/letsencrypt:/etc/letsencrypt:ro
depends_on:
- app
networks:
- laracorekit
db:
image: mysql:8.0
restart: unless-stopped
environment:
MYSQL_DATABASE: laracorekit
MYSQL_USER: laracorekit
MYSQL_PASSWORD: secret
MYSQL_ROOT_PASSWORD: root_secret
volumes:
- db_data:/var/lib/mysql
networks:
- laracorekit
redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
- redis_data:/data
networks:
- laracorekit
queue:
build:
context: .
dockerfile: Dockerfile
restart: unless-stopped
command: php artisan queue:work redis --sleep=3 --tries=3
environment:
QUEUE_CONNECTION: redis
depends_on:
- db
- redis
networks:
- laracorekit
volumes:
db_data:
redis_data:
networks:
laracorekit:
driver: bridge
Nginx Config for Docker
# docker/nginx.conf
server {
listen 80;
server_name _;
root /var/www/html/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
}
Deploy Commands
# Build and start all containers
docker compose up -d --build
# Run migrations
docker compose exec app php artisan migrate --force
# Optimize
docker compose exec app php artisan optimize
# View logs
docker compose logs -f app
# Restart app container
docker compose restart app