Docker Part 3 - Use Docker

ใช้งาน Docker กับการพัฒนา Application

จากตอนที่แล้วได้ทดลองใช้ Docker เบื้องต้นไม่ว่าจะเป็นการสร้าง การเปิด Bind port ตอนนี้เราจะมาใช้ Docker กับการพัฒนา Application ให้มากขึ้นเพื่อให้เห็นภาพว่า Docker มีประโยชน์อะไรในการพัฒนา ซึ่งหลายๆคนตอนแรกที่อ่านเรื่อง Docker แล้วมีการบรรยายสรรพคุณต่างๆนาๆก็จะไม่ค่อยเห็นภาพ ตอนนี้เราจะค่อยๆเห็นภาพนั้นกันครับ

ใช้ Docker สร้าง Database กัน

1
2
3
docker run --name my_db -e MYSQL_ROOT_PASSWORD=root -d -p 3306:3306  mysql:5.7

# -e คือการตั้งค่า ENVIRONMENT ให้กับ Docker ตัวนั้น โดยในตัวอย่างเป็นการตั้งค่า ENVIRONMENT ชื่อ MYSQL_ROOT_PASSWORD ให้มีค่าเท่ากับ root ในส่วนนี้จะอธิบายต่อในภายหลัง

เมื่อ Run คำสั่งลองใช้ Tools ที่ใช้ในการเข้าใช้งาน Database เข้าไปใช้งานตัว Database กัน โดยของผมจะใช้เป็นตัว mysql query browser โดย user pass ของ docker ตัวนี้คือ

1
2
username : root
password : root

ส่วน Host ก็ตามเครื่องที่ท่านลง Docker ไว้เลยครับ โดยของผมจะเป็น 192.168.56.101 หลัง Login เข้าไปใช้งานแล้วจะได้ดังภาพ

จะเห็นว่าเราสามารถสร้าง Database server มาใช้งานง่ายเพียงแค่ 1 คำสั่งของ Docker ซึ่งง่ายกว่าที่เราต้อง Download ตัว Database server มาลงที่เครื่องเอง ซึ่งบางทีเราพัฒนาหลาย Application แต่ละตัวใช้ database version ไม่เหมือนกันเช่น บาง App ใช้ Database : MYSQL5.7 บางตัวใช้ version 8 ซึ่งเป็นการยากมากที่เราจะลง Database server หลายๆ version ในเครื่องเดียว

Environment

ในส่วนตอนสร้าง container mysql นั้นจะมีการใส่ Parameter -e ที่ผมบอกว่าคือ Environment ไอตัว Environment มันคือค่าที่ถูก Set ให้กับตัว OS ครับ ซึ่งพอเรา Set แล้วตัว Environment ไปแล้ว ตัว Application สามารถดึงค่า Environment มาใช้งานได้ครับ

เราพักเรื่อง Environment แล้วมาดูที่ Image กัน จะเห็นว่าตัวเราสามารถเอาตัว Image mysql มาสร้างเป็น Container ใช่ไหมครับ ตอนแรกมันก็ไม่ค่อยมีอะไร ต่อมาก็เริ่มมีคำถามขึ้นมาว่า อยากได้ password ของ mysql ที่ไม่ใช่ default อะ อยากตั้งเป็น password อื่น จะทำยังไง

ถ้าเรามองว่า Image คือ Function ที่เอาไว้สร้างเครื่องตามที่เรากำหนดไว้ ถ้าเราอยากให้สร้างเครื่องที่ลง Mysql ที่มี password ไม่เหมือนกัน เราก็แค่สร้าง function parameter ขึ้นมาเพื่อส่ง password ทีแตกต่างเข้าไป ดังนั้น function parameter ที่เราจะ set ให้เครื่องก็คือ Environment นั่นเอง ตัวอย่าง mysql มี Environment ชื่อ MYSQL_ROOT_PASSWORD เพื่อกำหนด password ให้ user root ดังนั้นถ้าอยาก Customize อะไรบางอย่างของ Image ลองดูที่ Page ของคนที่ทำ Image นะครับว่าเขามี ENVIRONMENT อะไรให้เรา Customize ได้บ้าง อย่างเช่น Mysql และเช่นกัน เมื่อคุณทำการสร้าง Image ก็ควรทำให้มันสามารถ Customize ได้ เช่น Endpoint ของ service ที่จะติดต่อ Endpoint ของ Database เป็นต้น

Dev บน Docker กัน

ปัญหาที่เรามักเจอกันบ่อยๆเวลา Dev คือ เราไม่ได้ Dev บนเครื่องจริงครับ ตัวอย่างเช่น เรา Dev บน PHP Version 5.3 แต่ PROD เป็น Version 5.7 หรือ Enable module ต่างๆไม่เท่ากันก็มักจะเกิดเหตุการณ์เช่น Run บน Dev ได้ แต่ Run บน PROD ไม่ได้ เนื่องจากปัญหาเหล่านี้เลยมีคนคิดวิธีแก้ปัญหามาหลายอย่าง Docker ก็เป็นหนึ่งในนั้นคือ ทำการสร้าง Image แล้วก็ นำ Image นั้นไป Deploy เป็น Container แล้ว Run ที่ไหนก็ได้ที่ลง Docker ดังนั้นมันก็เป็นการการันตีว่า Application ของเรา Run ได้แน่นอน เพราะเรา Dev ด้วยเครื่องจำลองที่เรากำหนด ดังนั้น Dev กับ Prod ย่อมเหมือนกัน

สร้าง Directory ขึ้นมาสักที่นึงในเครื่องที่ลง Docker ของคุณครับ ของผมสร้างที่ /root/share_docker/dev_docker

1
2
3
4
5
6
7
8
9
docker run --name dev_docker -d -p 80:80  -v /path/to/directory:/var/www/html/ php:5.6-apache

# ของผมจะเป็น

docker run --name dev_docker -d -p 80:80 -v /root/share_docker/dev_docker:/var/www/html/ php:5.6-apache

# -v คือการ Mount volume ของเครื่องที่ลง docker ให้ไปโผล่บนเครื่องจำลองที่เราสร้างขึ้นมา คล้ายๆทำ share drive กันครับ โดย
# หน้า : คือ Path ในเครื่องที่ลง Docker ที่เราอยากจะให้ไปโผล่ใน Container ของผมคือ /root/share_docker/dev_docker
# หลัง : คือ Path ของเครื่องจำลอง ( container ) ที่เราจะ map เข้ากับ path ที่อยู่หน้า :

จากนั้นลองสร้างไฟล์ index.php ใน directory ที่เรา map เข้ากับ container ครับ จากนั้นในไฟล์เขียน code ประมาณนี้ลงไป

1
2
3
<?php 
echo "HELLO WORLD NICO";
?>

จากนั้นเข้า Browser ใส่ IP เครื่องที่ลง Docker ครับ (ของผมคือ 192.168.56.101) จะได้ดังภาพครับ

จากนั้นลองแก้ไขไฟล์ตัว Index.php เป็นอย่างอื่นตามใจครับ โดยของผมจะแก้เป็น

1
2
3
<?php 
echo "HELLO WORLD Kawjao MeltMallow";
?>

เมื่อเปิดบน Browser ใหม่ก็จะเห็นว่าข้อความเปลี่ยนไปดังภาพ

ด้วยวิธีการนี้เราสามารถพัฒนา Application ด้วยภาษา PHP โดยไม่ต้องลง PHP ที่เครื่องเลย อยากเขียน code อะไรก็แก้ใน Directory ที่เรา Mount volume เข้าไปใน Container

สรุป

ในตอนนี้เราได้เห็นวิธีการเอา Docker มาทำเป็น Database server เอา Docker มาใช้ในการพัฒนา PHP โดยที่เราไม่ต้องลง PHP ที่เครื่องเลย ซึ่งน่าจะเห็นภาพการเอา Docker มาใช้งานกับการ Develop Appllication และในตอนนี้ได้สอนการใช้งาน Environment และการ Mount volume ซึ่งต่อจากนี้เราจะเริ่มใช้ทั้งสองอย่างนี้บ่อยขึ้น ดังนั้นไปลองใช้งานให้คล่องนะครับ เช่น environment ของ mysql ก็ลองเปลี่ยน MYSQL_ROOT_PASSWORD เป็นค่าอื่นดู แล้วลอง Login เข้า mysql ดูว่ามันใช้ password ตามที่เราตั้งไหม หรือ Mount volume ก็ลองเปลียนตำแหน่ง Mount ดูว่าถ้าเปลี่ยนแล้วมันไปโผล่ใน Docker ไหม

โปรโมท Page

ผมทำ Page บน Facebook แล้วนะครับ ใครสนใจรับการแจ้งเตือนเวลาผมอัพเดท Blog ก็ไปกดติดตามกันได้ครับ กดตามลิ้งไปได้เลย Facebook page

ไม่เกี่ยวกับ Docker แต่เกี่ยวกับไอดอล

สำหรับใครที่สงสัยว่า Nico กับ Kawjao MeltMallow คือใคร กดตามลิ้งรูปด้านล่างได้เลย

Nico

Nico

Kawjao

Kawjao