ถึงแม้ว่าเทคโนโลยีอย่าง Docker จะถือกำเนิดขึ้นมาและถูกใช้งานกันได้อย่างแพร่หลายแล้ว ส่วนตัวผมเองก็พึ่งจะได้ลองหัดใช้ได้เมื่อไม่กี่วันเอง ต้นเหตุก็มาจากจำเป็นที่จะต้องใช้ PHP 😏 แต่ผมไม่อยากที่จะใช้เครื่องมือช่วยจำลอง Server อย่างเช่นพวก AppServ, Xampp, WampServer, MAMP หรืออะไรก็แล้วแต่ เพราะผมรู้สึกว่าอยากจะใช้เครื่องมือสักอย่าง ที่ไม่ต้องยึดติดกับ OS มากเกินไป ถึงแม้ว่าเครื่องมือเหล่านี้จะทำงานได้ Cross Platform ได้ก็เถอะ แต่การตั้งค่าบางอย่างของแต่ละ OS แทบจะไม่เหมือนกันเลย มันจะมีเครื่องมือไหนไหมนะที่ศึกษาครั้งเดียวแล้วใช้ได้ทุก Platform และนั่นก็ทำให้ผมได้รู้จัก Docker (แบบจริงๆ จังๆ เสียที)
และในบทความนี้ผมจะพาทุกท่านมาลองติดตั้งและใช้งาน PHP Apache และ MySQL บน Docker กัน โดยจะใช้สิ่งที่เรียกว่า Docker Compose มาช่วยในการจัดการ Container อีกที
รู้จัก Docker กันก่อน
เผื่อใครยังไม่รู้จัก Docker ขอแนะนำให้ศึกษาก่อนสักนิด สามารถหาอ่านเพิ่มเติมได้จาก
หรือถ้าใครอยากอ่านฉบับภาษาไทย 🇹🇭 ก็มีมาแนะนำเหมือนกัน
Docker Compose คืออะไร
Docker Compose คือเครื่องมือที่ช่วยในการจัดการ Container โดยจะใช้ไฟล์ YAML
ในการตั้งค่าและจัดการทุกอย่างใน Container ซึ่งในส่วนนี้ผมอาจจะไม่ลงรายละเอียดมาก เข้าใจง่ายๆ แค่ว่าเป็นไฟล์ที่ไว้ช่วยเราติดตั้งและตั้งค่าต่างๆ ใน Container แทนการพิมพ์คำสั่งยาวๆ เมื่อพอจะเข้าใจบ้างแล้ว ก็ไปเริ่มติดตั้งกันเลย
ติดตั้ง Docker
โดย Docker จะรองรับทั้ง macOS, Windows และ Linux
หลังจากติดตั้งเสร็จ เปิด Terminal แล้วพิมพ์คำสั่งดังนี้
จะได้ผลลัพธ์ดังนี้ ถือว่าเราได้ติดตั้ง Docker แล้ว
สร้าง folder สำหรับ project
เมื่อติดตั้ง Docker แล้ว ก็สร้าง folder สำหรับ project ขึ้นมา โดยในที่นี้ผมจะสร้าง folder และตั้งชื่อว่า docker-apache-php-mysql และเข้าไปใน folder นั้น
สร้าง Docker Compose
เมื่อได้ folder สำหรับเก็บ project แล้ว ก็จะมาสร้างไฟล์ docker compose กัน โดยเจ้า docker-compose เนี่ยจะเป็นไฟล์ที่เราจะใช้ในการตั้งค่า Container ที่เราต้องการใช้งาน โดยไฟล์ docker-compose จะสร้างได้แบบนี้ docker-compose.yml
โดยนามสกุลจะเป็น .yml หรือ .yaml ก็ได้
รายละเอียดเพิ่มเติมเติมเกี่ยวกับ Docker Compose
ในการตั้งค่า docker-compose นั้น คุณจะต้องเลือก Docker version ที่คุณต้องการใช้ และ services และ containers ที่คุณต้องการใช้งาน
ติตตั้ง PHP และ Apache
ในการติดตั้ง PHP Apache ใน container นั้น คุณจะต้องระบุ environments ดังนี้
- Container Name : คือชื่อของ Container นั้นจะเป็นชื่อที่คุณต้องการให้ตั้งชื่อให้กับ Container นั้น อย่างเช่น
container_name: php-apache
- Container Image : คือ image ที่คุณต้องการใช้งาน ในที่นี้เราจะใช้ image ที่ชื่อว่า
php:8.2-apache
ซึ่งเป็น image ที่เป็น official image ของ PHP และเป็น image ที่มี Apache อยู่ในตัวเลย - Volume : คือ สิ่งที่จะตั้งค่าให้กับ directory ของ source code ของเรา ซึ่งถ้าเรามีไฟล์
.php
ไฟล์นั้นก็จะต้องอยู่ใน directory นี้ด้วย เช่น แบบนี้
- หมายเลข Port : คือ port ที่เราต้องการจะ map กับ port ของ container นั้น โดยในที่นี้เราจะ map port ที่ 8080 ของเครื่องเรา (local) กับ port ที่ 80 ของ container นั้น ซึ่งเป็น port ที่ Apache ใช้งาน ดังนั้นเราจะตั้งค่าให้เป็นแบบนี้
ซึ่งหมายความว่าเรากำลังตั้งค่า Apache server ให้ทำงานที่ port 80 และ map มาที่ port 8080 บนเครื่องเรา พอเวลาเรียกใช้งาน เราก็จะเข้าผ่าน port 8080
เราก็จะได้ docker-compose.yml หน้าตาแบบนี้
กลับมาที่ Terminal
ทดลองรัน Container ด้วยคำสั่ง docker-compose up
เปิด Browser แล้วเข้าไปที่ http://localhost:8000
แล้วเราก็จะเห็นว่า ขึ้น 403 Forbidden แล้ว ซึ่งเป็นปกติ เพราะเรายังไม่ได้ทำการเขียนไฟล์ index.php
ใน directory ของเรา
ทดลองเขียนอะไรลงไปในไฟล์ index.php
สักหน่อย
แล้วลองเข้าไปดูที่ http://localhost:8000
อีกครั้ง
ติดตั้ง MySQL ใน Container
เมื่อมี PHP แล้วจะขาด MySQL ไปได้อย่างไรกัน ดังนั้นเราจะมาสร้าง Container เพื่อใช้งาน MySQL กัน มาที่ไฟล์ docker-compose.yml
โดยเราจะสร้าง Service ขึ้นมาอีก 1 ตัว ให้ชื่อว่า db และกำหนดค่าต่างๆ จะมีรายละเอียดดังนี้
- Container Name : ชื่อของ Container ผมจะตั้งชื่อว่า db
- Image : ชื่อของ Image ที่เราต้องการใช้งาน โดยจะใช้ mysql
- restart : ผมตั้งเป็น always เพื่อกำหนดให้ Service นี้มีการ restart ใหม่อัตโนมัติเมื่อเกิดการเปลี่ยนแปลงใดๆ บน Container นี้
- Environment : กำหนดค่าต่างๆ ของ MySQL ที่เราต้องการใช้งาน โดยจะมีรายละเอียดดังนี้
- MYSQL_ROOT_PASSWORD : กำหนดรหัสผ่านของ root user ของ MySQL
- MYSQL_DATABASE : กำหนดชื่อของ Database ที่เราต้องการใช้งาน
- MYSQL_USER : กำหนดชื่อของ User ที่เราต้องการใช้งาน
- MYSQL_PASSWORD : กำหนดรหัสผ่านของ User ที่เราต้องการใช้งาน
- Ports : ก็เหมือนตอนที่เราตั้งค่า Port ของ PHP แต่เราจะใช้ Port 3306 แทน ซึ่งเป็น Port ที่ MySQL ใช้งาน
เราต้องการเพิ่มเครื่องมือสำหรับ MySQL ภายใน Container ของ PHP เพื่อให้สามารถทำงานร่วมกันได้ ซึ่งเครื่องมือที่เราต้องการนั้นคือ mysqli ซึ่งเป็น PHP extension ที่ใช้ในการเชื่อมต่อกับ MySQL
กลับไปที่โฟลเดอร์ /php
ของโปรเจคของเรา และสร้างไฟล์ Dockerfile ขึ้นมา และเพิ่มค่าต่างๆ ดังนี้
ที่นี่ เราจะได้สร้าง Image ของ PHP Apache และ Environment ที่จะติดตั้ง mysqli ซึ่งเป็น PHP extension ที่จะเชื่อมต่อ PHP Apache กับ MySQL server
ต่อมาเราต้องสร้างอิมเมจที่กำหนดเองนี้ภายใน Service php-apache-environment ในไฟล์ docker-compose.yml
PHP Apache ยังขึ้นอยู่กับบริการ db เพื่อเชื่อมต่อกับ MySQL เราจำเป็นต้องกำหนดค่าโดยระบุการพึ่งพาอาศัย: สภาพแวดล้อม
เสร็จแล้วรันคำสั่ง docker-compose up
แล้วรอสักครู่ จะเห็นว่าเราได้สร้าง Container ขึ้นมา 2 ตัว คือ db และ php-apache-environment
หรือจะดูที่ Docker Desktop ก็ได้
จากเปิดไฟล์ index.php
แล้วทดสอบเขียนคำสั่ง PHP ที่ใช้ mysqli เพื่อเชื่อมต่อกับ MySQL server ที่เราสร้างไว้
เมื่อเราเปิดเว็บไซต์ที่ http://localhost:8000 จะเห็นว่าเราได้เชื่อมต่อกับ MySQL server ได้เรียบร้อยแล้ว
ติดตั้ง PHPMyAdmin
PHPMyAdmin ก็เป็นเครื่องมือที่เป็น GUI สำหรับการจัดการฐานข้อมูล MySQL ซึ่งก็เป็น Service อีกตัวที่เราจะเพิ่มเข้าไปใน docker-compose.yml
โดยจะมีรายละเอียดการตั้งค่าดังนี้
- image : เราจะใช้ image ของ phpmyadmin/phpmyadmin
- ports : จะใช้ port 8080 ของเครื่องเรา
- restart : ตั้งค่าให้ restart ทุกครั้งเมื่อมีการเปลี่ยนแปลง
- environment
- PMA_HOST: ตั้งค่าให้เชื่อมต่อกับ Service ชื่อ db
- depends_on : ตั้งค่าให้รอการสร้าง Service ชื่อ db ก่อน
จากนั้นก็รันคำสั่ง docker-compose up
แล้วเปิดเว็บไซต์ที่ http://localhost:8080 จะเห็นว่าเราได้เข้าสู่หน้า Login ของ PHPMyAdmin แล้ว
โดย default ของ PHPMyAdmin จะใช้ username และ password ของ MySQL ซึ่งในที่นี้คือ root
และ MYSQL_ROOT_PASSWORD
ที่เราตั้งไว้
ลองนำข้อมูลเข้า MySQL
สร้าง database และ table และเพิ่มข้อมูลลงไปใน table นั้น ๆ จากนั้นเลือก database ที่เราสร้างไว้ แล้วให้เราเขียนคำสั่ง SQL ดังนี้
โดยเข้าไปที่ PHPMyAdmin แล้วเลือก database ที่เราสร้างไว้ แล้วกดปุ่ม SQL ที่ด้านบนขวา จากนั้นก็ใส่คำสั่ง SQL ที่เราเขียนไว้ลงไป แล้วกดปุ่ม Go
กด OK เพื่อยืนยันการนำข้อมูลเข้า
จะเห็นว่าข้อมูลถูกนำเข้าเรียบร้อยแล้ว
ทีนี้เราเอาข้อมูลมาแสดงที่หน้าเว็บกันหน่อย กลับมาที่ไฟล์ index.php
โดยจะเพิ่มโค้ดดังนี้
Refresh หน้า http://localhost:8000/ เพื่อดูผลลัพธ์
ตอนนี้เราได้ทำการเชื่อมต่อ MySQL กับ PHP แล้ว และเราสามารถเอาข้อมูลจาก MySQL มาแสดงผลบนเว็บไซต์ได้แล้ว
Conclusion
เป็นยังไงบ้างครับ สำหรับการใช้ Docker Compose เพื่อสร้าง Container สำหรับ PHP และ MySQL คงไม่ถอดใจไปก่อนนะครับ 🤭 ซึ่งแน่นอนว่าในบทความนี้ จะมาแนะนำขั้นตอนการสร้าง Container เพื่อใช้งาน PHP กับ MySQL เท่านั้น อาจจะไม่ได้ลงในรายเอียดเกี่ยวกับ PHP หรือ MySQL มากนัก หรือแม้แต่รายละเอียดของ Docker เอง ก็อาจจะข้ามๆ หรือไม่ได้อธิบายบางจุดไปบ้าง ก็หวังว่าบทความนี้จะเป็นประโยชน์ให้กับคนที่อยากเริ่มต้นใช้ Docker และ PHP กับ MySQL นะครับ สำหรับบทความนี้ขอจบไว้เพียงเท่านี้ สวัสดีครับ.