Environment สำหรับพัฒนา PHP (Laravel) โดย Docker

php + nginx + mysql + phpmyadmin + composer

Teeraphat Boonthamtanarung
Grean Developers Family
3 min readJan 20, 2019

--

บทความนี้จัดทำขึ้นเพื่อเป็นบันทึกความรู้ของตัวผู้เขียนเอง เนื่องด้วยผมเป็นผู้พัฒนาเว็บไซต์ที่ใช้ Laravel PHP เป็นหลัก ได้เล็งเห็นว่าการลงโปรแกรมเพื่อใช้พัฒนาในแต่ละเครื่องมีความยุ่งยาก ประกอบกับอยากศึกษา Docker ผมจึงมีความคิดว่าจะลองทำ Docker เพื่อรัน Laravel โดยไม่ต้องติดตั้งโปรแกรมแบบเก่า

หมายเหตุ : การศึกษา Docker ครั้งนี้ผมไม่ได้ใช้ Laradock เพราะอยากเรียนรู้พื้นฐานเพื่อความเข้าใจ จุดมุ่งหมายคือสร้าง environment สำหรับพัฒนา Laravel โดยไม่ต้องลง PHP, web server, database server, composer บนคอมพิวเตอร์ของเรา

เตรียม Dockerfile

สร้าง folder ใหม่ขึ้นมาซึ่งจะเป็นที่อยู่ของโปรเจค Laravel ของเรา ข้างใน folder นี้ เราจะใส่ไฟล์ Docker ลงไปตามลิ้งค์นี้ครับ https://github.com/Grean-Developers-Family/laravel-docker

laravel_project
|__docker
| |__app
| | |__Dockerfile
| |__web
| |__Dockerfile
| |__vhost.conf
|__docker-compose.yml

ในไฟล์ docker-compose.yml นี้จะประกอบไปด้วย 4 services ได้แก่

  1. app — ใช้ php 7.3 พร้อมกับตั้ง Composer เพื่อรันไฟล์ .php
  2. web — ใช้ Nginx 1.10 เป็นตัว web server
  3. database — ใช้ MySQL 5.6 เก็บข้อมูลภายในโปรเจค
  4. admin — ใช้ phpMyAdmin เพื่อจัดการกับ database

เมื่อเตรียมไฟล์เรียบร้อยก็เปิด command line ไปที่ folder ของ project สั่งรัน service ทั้งหมดที่อยู่ใน docker-compose.yml ที่เราได้เตรียมไว้ด้วยคำสั่ง $ docker-compose up (การใช้คำสั่งนี้จะต้องติดตั้ง Docker, Docker Compose ไว้ในเครื่องก่อน)

เปิด command line หน้าต่างใหม่แล้วพิมพ์คำสั่ง $ docker ps จะปรากฎ service ต่างๆที่กำลังรันอยู่

รายการ services ต่างๆพร้อมรายละเอียด

เราสามารถเข้าไปรันคำสั่งต่างๆใน Service ได้ โดยใช้คำสั่ง

$ docker exec -i -t [CONTAINER_ID, NAME] /bin/bash

หมายเหตุ : หากต้องการออกให้กด Ctrl+d

สร้างโปรเจค Laravel

เข้าไปใน service app ของเราโดยใช้คำสั่ง $ docker exec -i -t laravel-project_app_1 /bin/bash

ทำการสร้างโปรเจค Laravel ขึ้นมาที่ folder ชื่อว่า tempโดยใช้ Composer

$ composer create-project laravel/laravel temp

หลังจากที่ Composer สร้างโปรเจคเสร็จเรียบร้อย ให้เราย้ายไฟล์โปรเจคทั้งหมดที่อยู่ใน temp ออกมาข้างนอก (root folder) โดยใช้คำสั่ง copy ไฟล์

$ cp -r temp/* temp/.* .

ลบ folder temp ทิ้งไป

$ rm -r temp

มาถึงขั้นตอนนี้เราก็ได้สร้าง enviroment พร้อมสำหรับการ develope กันแล้ว

ทดสอบการใช้งาน Laravel

ก่อนอื่นเราต้องสร้างไฟล์ .env ของ Laravel ขึ้นมา โดยคัดลอกมาจากไฟล์ .env.example

$ cp .env.example .env

ทำการ generate key ของ application

$ php artisan key:generate

ลองเปิด browser แล้วเข้าไปที่ localhost:8080 เราจะพบกับหน้า home ของ Laravel ดังภาพ

Default homepage ของ Laravel

ทดสอบการเชื่อมต่อ Database

ก่อนอื่นให้เราเปิด phpMyAdmin โดยเข้าไปที่ localhost:8888

หน้าเข้าสู้ระบบ phpMyAdmin

ทำการเข้าสู่ระบบด้วย root user (password ตามที่ config ไว้ใน docker-compose.yml หากไม่ได้แก้ไข password คือ “root”)

ขั้นตอนการสร้าง database ใหม่

สร้าง database ขึ้นมาหนึ่งอัน เพื่อใช้กับโปรเจคของเรา แล้วทำการกำหนดค่าในไฟล์ .env เพื่อให้ Laravel เชื่อมต่อ database ได้อย่างถูกต้อง

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_project
DB_USERNAME=homestead
DB_PASSWORD=secret

เมื่อแน่ใจว่าการตั้งค่าทุกอย่างเรียบร้อย ให้ทำการ migrate database เพื่อทดสอบว่าสามารถเชื่อมต่อกับ Database ได้จริงๆ โดยใช้คำสั่ง

$ php artisan migrate:fresh

หากรันแล้วได้ error ออกมาแบบด้านล่างไม่ต้องแปลกใจ เพราะการเชื่อมต่อ database ถูกต้องแล้ว เพียงแต่เราต้องแก้ code เล็กน้อย

ข้อความ error หลังจากทำการ migrate

วิธีการแก้ให้เปิดไฟล์ /app/Providers/AppServiceProvider.php แล้วแก้ตามนี้

<?phpnamespace App\Providers;use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider; // เพิ่มบรรทัดนี้
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191); // เพิ่มบรรทัดนี้
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}

รันคำสั่ง $ php artisan migrate:fresh อีกครั้งจะขึ้นผลลัพท์ตามด้านล่าง แสดงว่า migrate สำเร็จ

Dropped all tables successfully.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table

ลองกลับมาดูที่ phpMyAdmin จะพบว่ามี table เพิ่มขึ้นมา 3 tables จากการ migrate ครั้งนี้ เป็นอันเสร็จพิธี dev ต่อตามอัธยาศัย

ปล. ไฟล์ Docker ทั้งหมดจาก github ที่ได้ให้ไว้ ณ ตอนต้น หากไม่พอใจสามารถแก้ไขได้ตามใจชอบ

--

--