มาเล่าเรื่องราว Dockerfile ผ่าน Nodejs กัน
Dockerfile คืออะไรก่อนจะรู้จักว่าคืออะไร ต้องทำการรู้จัก Docker ก่อน คลิกเลย หรือใครรู้แล้วก็มาต่อกันเลยครับ Dockerfile เปรียบเสมือน Note ว่าการที่ Run Program ซักอย่างหนึ่ง ต้องมีอะไรบ้าง จริงๆมันก็คือ Configs เพื่อสร้าง Docker Image แหละส่วนประกอบหลักๆประกอบไปด้วยอะไรบ้าง
จากตอนเดิมคราวที่แล้ว คลิกเลย เราจะรู้แค่ว่า Container สร้างมาจาก Image แต่ไม่ได้รู้เลยว่าก่อนจะมาเป็น Image ต้องทำยังไงบ้าง ซึ่ง Image จะถูกสร้างมาจาก Dockerfile อีกทีโดยการที่จะยัดอะไรใส่ใน Image เราต้อง Configs ทุกอย่างไว้ใน Dockerfile แล้วทำการ Build Dockerfile สร้างเป็น Docker Image อีกทีซึ่งผมจะอธิบายขั้นตอนต่างๆผ่าน Code โดยใช้ Nodejs เป็นการเล่าเรื่อง
ก่อนอื่นเลยผมก็สร้างโปรเจคที่เป็น Nodejs ขึ้นมา โดยจะเป็นลำดับขั้นตามนี้
mkdir exampledockercd exampledocker
ผมทำการสร้าง Folder ปกติ และเข้าไปใน Folder
npm init
หลังจากนั้นผมก็ติดตั้ง Nodejs ลงใน Folder ผม Enter ไปรัวๆ เพราะใช้ค่า Default
สุดท้ายจะได้หน้าตาออกมาประมาณนี้ จะสังเกตุถ้าเราใช้ค่า Default main จะชี้ไปที่ index.js ซึ่งเรายังไม่มี File นี้ก็ทำการสร้างขึ้นมาครับ
npm install express
express คืออะไรผมจะอธิบายมันสั้นๆ มันคือ Framework ที่เอาไว้ทำ Router บน nodejs ที่ส่วนใหญ่นำมาทำ API หรือ Web แต่สมัยนี้คงไม่ค่อยมีใครใช้ Node ทำ Web แล้ว ส่วนใหญ่คงไปใช้ Vue React Next Nuxt เป็นต้น
หลังจากนั้น Coppy ไปไว้ในหน้า index.js ที่สร้างขึ้นมาใหม่เอง
node index.js
หลังจากนั้นลอง run โปรแกรมเราดู
จะได้ออกมาประมาณนี้
หลังจากนั้นไป Run บน Browser หรือใครจะยิง ผ่าน Postman ก็ได้ ได้ Result ประมาณนี้ถือว่าเรา Run Node ได้แล้วต่อมามาดูเรื่อง ของ Dockerfile กันบ้าง
หลังจากสร้าง Dockerfile เสร็จก็ coppy คำสั่ง นี้ไปใส่ ซึ่งจะอธิบายแต่ละส่วนได้ดังนี้
อย่าง FROM node: alpine ก็คือ Nodejs เนี่ยมันต้องใช้ OS หรือ เรียกว่า Base Image อะไรในการ Run ซึ่งผมก็เข้า WEB https://hub.docker.com/search เพื่อดูว่า Base ของ Node ต้องใช้อะไร ซึ่งถ้าเราใช้อะไร ก็ทำการ Search หาดู Base Image ได้
ซึ่ง Base Image มันใช้ node:alpine ซึ่งจริงๆเราควรจะระบุ version ด้วยนะครับ ต่อมา WORKDIR คือเราจะให้มันทำงานใน Path ไหนถ้าไม่ใส่ก็ได้ครับจะเป็น Default ของมันอีกที ซึ่งตรงคำสั่ง Copy ./ แรกคือเราจะ Coppy อะไรใน Folder เรา ./ สองก็คือ Coppy ไปไว้ใน WORKDIR ที่เรากำหนด ต่อมาก็ทำการ INSTALL ซึ่ง Nodejs มันจะทำการ RUN ตาม Package.json หลังจากนั้นก็ COPPY ของเราทั้งหมดใน Folder ไปไว้ใน WORKDIR
**(อ่านไม่อ่านก็ได้แต่อ่านก็ได้ความรู้เพิ่มเติมครับ) ตอนเรา Build Docker ครั้งแรกมันจะนานครับ แต่ครั้งต่อๆไปถ้าเราไม่มีการเปลี่ยนแปลงอะไรเลยมันจะใช้ Cache ที่เราเคยทำมันจะ Build เร็วมาก ซึ่งถ้ามีการเปลี่ยนนิดๆหน่อยๆมันก็จะ Run Step ที่มีการเปลี่ยนแปลงโดยไม่ใช้ Cache ลองนึกภาพตามนะครับ ถ้าผมลบบรรทัดที่ 7 ใน File Docker แล้วเอาไปแทน บรรทัดที่ 5 มันก็ Build Docker Work เหมือนเดิมนะครับ เพียงแต่ถ้าเรามีการแก้อะไรนิดหน่อยมันจะทำ STEP ต่อจาก Clone ใหม่ทั้งหมดและ Install ใหม่ทั้งหมด ซึ่งตัว Install ใหม่ทั้งหมดมันนานครับซึ่งถ้าเราไม่ได้ เพิ่ม Dependency เราไม่ควรให้มัน Run STEP INSTALL ใหม่
แบบตามภาพนี้นะครับมันทำได้แต่มันไม่ควรทำครับมันจะทำให้เรา Build ช้าขึ้นในครั้งต่อๆไปถ้าเราแค่เปลี่ยนแปลงนิดๆหน่อยๆแบบไม่มี Dependency ใหม่
แบบในรูปจึงดู Optimization กว่าเยอะเลยครับถ้าเกิดมีการเปลี่ยนแปลงนิดๆหน่อยๆ แบบ Dependency ไม่เปลี่ยนแปลง
ส่วนคำสั่ง CMD สุดท้ายนั้นก็ตามชื่อเลยครับ Command Prompt ที่เอาไว้ Run App
docker build -t dodohandsome/exdocker .
หลังจากนั้นผมก็มา Build Dockerfile to Docker Image ครับ
จะเห็นจากภาพว่าเราจะได้ docker image มา เป็น sha256
docker images
จากนั้นก็ใช้คำสั่งนี้เพื่อดู ID ของ Image ที่เราเคยสร้างเราลองมา Run กันครับ
docker run dodohandsome/exdocker
จากนั้นลอง Run ดูครับโอเคร Run ได้แล้ว
เอ้เกิดอะไรขึ้นไหนไปดูดิว่ามี Container ทำงานไหม
ก็มีครับแต่เราลืม Mapping Port ให้ Container
docker run -p 2000:3000 dodohandsome/exdocker
ตอนนี้ผมให้ port ของ Container คือ 2000
จากนั้นก็ Run App เราได้ปกติแล้วครับ
docker ps
หน้าตาก็จะออกมาประมาณนี้นะครับ
docker exec -it contaner_id sh
หลังจากนั้นเราสามารถเข้าไปดู Container ของเราได้ปกติเลยครับจะเข้าไปแก้หรืออะไรก็ได้แต่ส่วนใหญ่จะไม่ทำกันนะครับ 5555
เป็นยังไงกันบ้างครับสำหรับการเล่าเรื่องราว Docker ผ่าน Nodejs โดยทำ Dockerfile แล้ว Build เป็น Docker Image มาอันนึง อันนี้เป็นแค่พื้นฐานมากๆสำหรับการทำ Docker นะครับครั้งหน้าเรามาทำกันแบบ Advance กันนะครับ เคลียสมองให้โล่งๆละมาลุยกันต่อนะครับ เพราะมันเอาไปต่อยอดถึงทำ CI/CD ไว้ผมจะมาทำต่อเรื่อยๆนะครับ
( CR. ธำรงค์ ไชยวงค์ )