ทำไมต้อง Deploy Laravel ด้วย Docker?
การ Deploy Laravel ผ่าน Docker ช่วยให้ทีมทุกคนใช้ Environment เดียวกัน ย้าย Server ได้ง่าย และไม่มีปัญหา “works on my machine” อีกต่อไป
โครงสร้าง Project
laravel-docker/
├── app/ # Laravel source code
├── docker/
│ ├── nginx/
│ │ └── default.conf
│ └── php/
│ └── Dockerfile
├── .env.docker
└── docker-compose.yml
Dockerfile สำหรับ Laravel (PHP 8.2)
FROM php:8.2-fpm-alpine
# ติดตั้ง Dependencies
RUN apk add --no-cache \
libpng-dev \
libjpeg-turbo-dev \
libwebp-dev \
zip \
libzip-dev \
unzip \
nodejs \
npm
# ติดตั้ง PHP Extensions
RUN docker-php-ext-install \
pdo \
pdo_mysql \
zip \
gd \
bcmath \
opcache
# ติดตั้ง Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
# คัดลอก Composer dependencies
COPY composer.json composer.lock ./
RUN composer install --no-dev --no-scripts --no-autoloader
# Copy source code
COPY . .
RUN composer dump-autoload --optimize
# Permissions
RUN chown -R www-data:www-data storage bootstrap/cache
EXPOSE 9000
CMD ["php-fpm"]
Nginx config (docker/nginx/default.conf)
server {
listen 80;
root /var/www/html/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
docker-compose.yml
version: '3.8'
services:
app:
build:
context: .
dockerfile: docker/php/Dockerfile
container_name: laravel_app
restart: unless-stopped
volumes:
- .:/var/www/html
- /var/www/html/vendor
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
environment:
APP_ENV: production
APP_KEY: ${APP_KEY}
DB_HOST: mysql
DB_DATABASE: ${DB_DATABASE}
DB_USERNAME: ${DB_USERNAME}
DB_PASSWORD: ${DB_PASSWORD}
REDIS_HOST: redis
CACHE_DRIVER: redis
SESSION_DRIVER: redis
nginx:
image: nginx:1.25-alpine
container_name: laravel_nginx
restart: unless-stopped
ports:
- "80:80"
volumes:
- .:/var/www/html
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- app
mysql:
image: mysql:8.0
container_name: laravel_mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_USER: ${DB_USERNAME}
MYSQL_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
redis:
image: redis:7-alpine
container_name: laravel_redis
restart: unless-stopped
volumes:
- redis_data:/data
command: redis-server --appendonly yes
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 3
volumes:
mysql_data:
redis_data:
ไฟล์ .env.docker
APP_NAME=MyLaravel
APP_ENV=production
APP_KEY=base64:your-app-key-here
APP_DEBUG=false
APP_URL=https://yourdomain.com
DB_ROOT_PASSWORD=rootpassword
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=securepassword
Deploy ครั้งแรก
# Copy .env
cp .env.docker .env
# Build และ Start
docker compose up -d --build
# Generate App Key
docker exec laravel_app php artisan key:generate
# Run Migrations
docker exec laravel_app php artisan migrate --force
# Clear Cache
docker exec laravel_app php artisan config:cache
docker exec laravel_app php artisan route:cache
docker exec laravel_app php artisan view:cache
Queue Worker
queue:
build:
context: .
dockerfile: docker/php/Dockerfile
command: php artisan queue:work --sleep=3 --tries=3 --max-time=3600
restart: unless-stopped
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
สรุป
การ Deploy Laravel ด้วย Docker ให้ความยืดหยุ่นและเสถียรภาพสูง สามารถ Scale เพิ่ม Worker ได้ง่ายโดยไม่ต้องแก้ไข Server เลย

