Environment สำหรับพัฒนา PHP (Laravel) โดย Docker
php + nginx + mysql + phpmyadmin + composer
บทความนี้จัดทำขึ้นเพื่อเป็นบันทึกความรู้ของตัวผู้เขียนเอง เนื่องด้วยผมเป็นผู้พัฒนาเว็บไซต์ที่ใช้ 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 ได้แก่
- app — ใช้ php 7.3 พร้อมกับตั้ง Composer เพื่อรันไฟล์ .php
- web — ใช้ Nginx 1.10 เป็นตัว web server
- database — ใช้ MySQL 5.6 เก็บข้อมูลภายในโปรเจค
- admin — ใช้ phpMyAdmin เพื่อจัดการกับ database
เมื่อเตรียมไฟล์เรียบร้อยก็เปิด command line ไปที่ folder ของ project สั่งรัน service ทั้งหมดที่อยู่ใน docker-compose.yml ที่เราได้เตรียมไว้ด้วยคำสั่ง $ docker-compose up
(การใช้คำสั่งนี้จะต้องติดตั้ง Docker, Docker Compose ไว้ในเครื่องก่อน)
เปิด command line หน้าต่างใหม่แล้วพิมพ์คำสั่ง $ docker ps
จะปรากฎ service ต่างๆที่กำลังรันอยู่
เราสามารถเข้าไปรันคำสั่งต่างๆใน 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 ดังภาพ
ทดสอบการเชื่อมต่อ Database
ก่อนอื่นให้เราเปิด phpMyAdmin โดยเข้าไปที่ localhost:8888
ทำการเข้าสู่ระบบด้วย root user (password ตามที่ config ไว้ใน docker-compose.yml หากไม่ได้แก้ไข password คือ “root”)
สร้าง 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 เล็กน้อย
วิธีการแก้ให้เปิดไฟล์ /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 ที่ได้ให้ไว้ ณ ตอนต้น หากไม่พอใจสามารถแก้ไขได้ตามใจชอบ