ลง Laravel version เก่าๆ ด้วย Docker

สำหรับทดลองใช้งาน Application version เก่าๆบ้าง

การจะใช้ version เก่าๆก็ต้องติด php รุ่นเก่าๆด้วย – ในทางกลับกันถ้าจะต้องลง laravel ใหม่ๆ ก็ต้องปรับเป็น php version ใหม่ๆ ด้วย

ใช้ Docker ในการติดตั้ง จะได้ไม่กวนตัว system หลัก

docker-compose.yml

services:
  # PHP + Apache Service
  php-apache:
    build: ./apache_php
    ports:
      - "8080:80"
    volumes:
      - ./www:/var/www/html
    networks:
      - lamp-network
    depends_on:
      - mysql

  # MySQL Service
  mysql:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: my_database
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    ports:
      - "3306:3306"
    volumes:
      - ./mysql_data:/var/lib/mysql
    networks:
      - lamp-network

networks:
  lamp-network:
    driver: bridge

Dockerfile

Build php 7.4
+ ติดตั้ง composer
+ ติดตั้ง node / npm
+ ติดตั้ง php-mysql extension สำหรับ mysql interface

FROM php:7.4-apache

# ติดตั้ง System Dependencies
RUN apt-get update && apt-get install -y \
    zip unzip git curl gnupg

# ติดตั้ง Node.js (ตัวอย่างนี้คือเวอร์ชัน 16 ซึ่งเสถียรสำหรับโปรเจกต์ยุค PHP 7.4)
RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - \
    && apt-get install -y nodejs

# ติดตั้ง PHP Extensions
RUN docker-php-ext-install mysqli pdo pdo_mysql

# ติดตั้ง Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

RUN a2enmod rewrite

index.php

<?php
phpinfo();
?>

สั่ง Rebuild: docker-compose up -d --build

docker-compose exec php-apache bash

ก่อนติดตั้ง laravel จะต้องลบไฟล์ index.php ให้เป็นห้องว่างเปล่าก่อน

composer create-project –prefer-dist laravel/laravel:^8.0 .

docker-compose exec php-apache npm install
docker-compose exec php-apache npm run dev

กรณีที่ติดตั้งเสร็จ ต้อง set permission ด้วย ไม่งั้นมันจะ error ว่าเขียน logs ในห้อง storage ไม่ได้

chown -R www-data:www-data storage bootstrap/cache

ถ้าทำครบแล้ว เปิดไปที่ http://localhost:8080/public/index.php ก็น่าจะเจอหน้าแรกของ laravel เลย

ถ้าไม่ต้องการใส่ /public/ เหมือนว่าจะต้องไปเซ็ต DocumentRoot ไปที่ public เลย – แต่ ณ ตอนนี้ยังไม่ได้ทำ