เริ่มต้นใช้งาน Laravel กับ Docker: ติดตั้งง่าย ใช้งานได้ทันที

เริ่มต้นใช้งาน 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

Table of Contents