เริ่มต้นใช้งาน Laravel กับ Docker: ติดตั้งง่าย ใช้งานได้ทันที
หากพูดถึง Laravel จะเป็น Framework ของ php ที่ผมชอบใช้งานมากตัวหนึ่ง เนื่องจากมันค่อนข้างครบ และเริ่มงานได้ไวมาก
ยิ่งหากเรามี Base Project ที่สามารถเอาไปขึ้น project อื่นได้เลย ยิ่งไวกว่านั้นอีก
วันนี้เลยมาลองทำ Docker ไว้สำหรับใช้งาน Laravel กันดูครับ
base Docker for Laravel ควรมี service อะไรบ้าง
PHP-FPM
service ตัวนี้จะทำหน้าที่ในการรันโค้ด php โดยจะใช้ Dockerfile เพื่อติดตั้ง extension ที่จำเป็นสำหรับ laravel เช่น pdo, gd, mbstring, pdo_mysql แต่ของเราจะต้องติดตั้ง composer ไว้ด้วยเพราะว่าเป็นเครื่องมือสำคัญในการจัดการ Dependency ของ laravel เพื่อให้สามารถติดตั้งและอัปเดตแพ็กเกจได้อย่างสะดวก
Nginx
ทำหน้าที่เป็น Reverse Proxy เพื่อส่งคำขอ PHP ไปยัง service PHP-FPM
MariaDB
ใช้ Database ของ mariaDB โดยปกติจะใช้งาน mySQL
Redis
จะเอาไว้ใช้งานสำหรับงาน cache queue และอื่นๆ queue หากใช้งาน database จะเจอปัญหา database lock ค่อนข้างบ่อย
Mailhog
เอาไว้สำหรับ funtion การทดสอบส่ง email ระหว่างที่เรากำลังพัฒนา laravel ของเรา ก่อนที่จะเปลี่ยนเป็น service mail ของจริงใน production อีกที
โครงสร้างโปรเจกต์
/docker
/php
Dockerfile
/nginx
default.conf
/app
/public
index.php
.env
Makefile
docker-compose.yml
ระบุ env
สำหรับเราที่ต้องการ config port ของ service ต่างๆ ต้องระบุข้อมูลที่ env ก่อนครับ
APP_NAME="Laravel Base"
APP_SLUG_NAME="laravel_base"
NGINX_HTTP_PORT=8046
NGINX_HTTPS_PORT=8045
MYSQL_PORT=3346
MYSQL_TEST_PORT=3345
REDIS_PORT=6380
MAILHOG_PORT=8027
MAILHOG_SMTP_PORT=1027
หากแก้ค่า APP_SLUG_NAME ต้องทำการแก้ไขไฟล์ docker/nginx/default.conf เพราะว่าตอนนี้ตั้งไว้เป็น laravel_base
fastcgi_pass {APP_SLUG_NAME }_php-fpm-app:9000;
Docker Compose
สร้างไฟล์ docker-compose.yml ขึ้นมาที่ root project แล้วระบุ services ที่เรา list ไว้ด้านบน
services:
# PHP-FPM
app:
build: ./docker/php
container_name: ${APP_SLUG_NAME}_php-fpm-app
restart: unless-stopped
volumes:
- ./app:/app
networks:
- app-network
depends_on:
- mariadb
- redis
# Nginx
nginx:
image: nginx:latest
container_name: ${APP_SLUG_NAME}_nginx
restart: unless-stopped
volumes:
- ./app:/app
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
networks:
- app-network
ports:
- ${NGINX_HTTP_PORT}:80
- ${NGINX_HTTPS_PORT}:443
depends_on:
- app
# MariaDB
mariadb:
image: mariadb:latest
container_name: ${APP_SLUG_NAME}_mariadb
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: ${APP_SLUG_NAME}_local
MYSQL_USER: ${APP_SLUG_NAME}_local
MYSQL_PASSWORD: secret
SERVICE_TAGS: dev
volumes:
- mariadb-data:/var/lib/mysql
networks:
- app-network
ports:
- ${MYSQL_PORT}:3306
# Redis
redis:
image: redis:alpine
container_name: ${APP_SLUG_NAME}_redis
restart: unless-stopped
networks:
- app-network
ports:
- ${REDIS_PORT}:6379
mailhog:
platform: linux/x86_64
image: mailhog/mailhog
restart: unless-stopped
networks:
- app-network
ports:
- ${MAILHOG_PORT}:8025
- ${MAILHOG_SMTP_PORT}:1025
# Volumes
volumes:
mariadb-data:
networks:
app-network:
driver: bridge
Run Docker กันเลย
รัน docker เพื่อสร้าง project กันเลยครับ แต่ว่าใครยังไม่มี docker ช่วยลงก่อนนะครับ
docker-compose up -d
แต่ว่า หากเราสร้าง Makefile แล้ว สามารถ รันคำสั่ง init-project เพื่อให้มันทำงานให้เราเลยครับ
make init-project
หากใครไปใช้งานจริง ต้องลบ app/public/index.php ก่อนนะครับ อันนี้ ผมสร้างไว้ เพื่อให้เข้าให้ดูได้เท่านั้นครับ
Update ใหม่
- [2025-03-20] Commit 5966c4a เพิ่ม supervisord, cron, คำสั่งใน Makefile