DevOps
น้องๆ หลายคนอาจจะเคยได้ยินคำว่า "Docker" แต่ยังไม่รู้ว่ามันคืออะไร ทำงานยังไง แล้วทำไมถึงสำคัญในโลกของการพัฒนาซอฟต์แวร์ยุคปัจจุบัน สมัยผมทำร้านเน็ตฯ เนี่ย ถ้ามี Docker นะ ชีวิตจะง่ายขึ้นเยอะเลย!
Docker เปรียบเสมือนกล่องคอนเทนเนอร์ (Container) ที่บรรจุทุกอย่างที่โปรแกรมเราต้องการไว้ข้างใน ไม่ว่าจะเป็นโค้ด, ไลบรารี, หรือ Dependencies ต่างๆ ทำให้เรามั่นใจได้ว่าโปรแกรมเราจะทำงานได้เหมือนกันทุกที่ ไม่ว่าจะบนเครื่องเรา, บนเซิร์ฟเวอร์, หรือบน Cloud
ทำไมถึงสำคัญน่ะเหรอ? เพราะมันแก้ปัญหา "ทำงานบนเครื่องฉันได้ แต่บนเครื่องเธอไม่ได้" ได้อย่างหมดจด! แถมยังช่วยให้การ Deploy โปรแกรมง่ายและรวดเร็วขึ้นเยอะมากๆ
ก่อนจะไปลุย Docker กันจริงๆ เรามาปูพื้นฐานกันก่อนนิดหน่อยนะ จะได้ไม่งง
Image คือ Template หรือพิมพ์เขียวของ Container ของเรา เหมือนกับที่เรามีไฟล์ .iso สำหรับลง Windows นั่นแหละ Docker Image จะเก็บทุกอย่างที่จำเป็นสำหรับการรันโปรแกรมของเรา
Container คือ Instance ที่รันอยู่ของ Image เปรียบเหมือนการที่เราลง Windows จากไฟล์ .iso Container แต่ละอันจะเป็นอิสระต่อกัน ไม่ก้าวก่ายกัน
Dockerfile คือ Script ที่ใช้ในการสร้าง Image มันจะบอก Docker ว่าเราต้องการอะไรบ้างใน Image ของเรา เช่น OS, Library, หรือไฟล์ต่างๆ ที่เราต้องการ
เอาล่ะ! มาถึงขั้นตอนการใช้งาน Docker กันบ้าง บอกเลยว่าง่ายกว่าที่คิดเยอะ!
ขั้นตอนแรกก็คือการติดตั้ง Docker Desktop บนเครื่องของเรา สามารถดาวน์โหลดได้จากเว็บไซต์ทางการของ Docker เลย ติดตั้งเสร็จแล้วก็เปิดโปรแกรมขึ้นมา
สร้างไฟล์ชื่อ `Dockerfile` ใน Directory โปรเจกต์ของเรา แล้วใส่คำสั่งต่างๆ ลงไป ตัวอย่าง Dockerfile สำหรับโปรแกรม Node.js:
# Use an official Node.js runtime as a parent image
FROM node:16
# Set the working directory in the container
WORKDIR /app
# Copy the package.json and package-lock.json files to the working directory
COPY package*.json ./
# Install dependencies
RUN npm install
# Copy the rest of the application code to the working directory
COPY . .
# Expose port 3000 to the outside world
EXPOSE 3000
# Define the command to run the application
CMD ["npm", "start"]
เปิด Terminal หรือ Command Prompt แล้ว cd เข้าไปใน Directory ที่มี Dockerfile จากนั้นรันคำสั่ง:
docker build -t my-node-app .
คำสั่งนี้จะสร้าง Image ชื่อ `my-node-app` จาก Dockerfile ใน Directory ปัจจุบัน
เมื่อ Image ถูกสร้างเสร็จแล้ว เราก็สามารถรัน Container จาก Image นั้นได้โดยใช้คำสั่ง:
docker run -p 3000:3000 my-node-app
คำสั่งนี้จะรัน Container จาก Image `my-node-app` และ Map Port 3000 บนเครื่องเราไปยัง Port 3000 ใน Container
เท่านี้โปรแกรม Node.js ของเราก็จะรันอยู่ใน Container แล้ว! ลองเข้า Browser แล้วพิมพ์ `localhost:3000` ดูได้เลย
Docker ไม่ใช่ทางเลือกเดียวในการทำ Containerization นะ ยังมีทางเลือกอื่นๆ อีกมากมาย เช่น Virtual Machines (VMs) แต่ละทางเลือกก็มีข้อดีข้อเสียแตกต่างกัน
สมัยก่อนตอนผมทำร้านเน็ตฯ เนี่ย ใช้ VMs เป็นหลักเลย แต่พอมี Docker แล้ว ชีวิตง่ายขึ้นเยอะมากๆ VMs มันหนัก กิน Resource เยอะ Docker มันเบากว่าเยอะ
| Feature | Docker | Virtual Machines (VMs) |
|---|---|---|
| Resource Usage | Lightweight | Heavyweight |
| Startup Time | Fast | Slow |
| Isolation | Process-level | Full OS |
| Portability | Excellent | Good |
| Overhead | Low | High |
จากตารางจะเห็นได้ว่า Docker มีข้อดีหลายอย่างเหนือ VMs โดยเฉพาะเรื่อง Resource Usage และ Startup Time ทำให้ Docker เป็นทางเลือกที่น่าสนใจสำหรับ Modern Application Development
ถ้าอยากอ่านบทความเกี่ยวกับ IT ดีๆ เพิ่มเติม ลองแวะไปดูที่ SiamCafe Blog ได้เลยนะ
หวังว่าบทความนี้จะเป็นประโยชน์สำหรับน้องๆ ที่เริ่มต้นเรียนรู้ Docker นะครับ ถ้ามีคำถามอะไรเพิ่มเติม ถามมาได้เลย!
อย่าลืมแวะมาอ่านบทความอื่นๆ ที่ SiamCafe Blog นะครับ มีเนื้อหา IT ที่น่าสนใจอีกเยอะเลย!
เอาล่ะน้องๆ มาถึงส่วนสำคัญแล้ว นี่คือสิ่งที่พี่บอมอยากจะแชร์จากประสบการณ์จริง สมัยผมทำร้านเน็ต SiamCafe เนี่ย เจอปัญหาจุกจิกเยอะมาก การใช้ Docker ให้ดี มันไม่ใช่แค่รัน container ได้นะ มันต้องทำให้มัน "อยู่รอด" ในระยะยาวด้วย
หลักๆ เลยคือเรื่อง Image Management, Resource Management, และ Security พี่จะลงรายละเอียดในหัวข้อถัดไปนะ
น้องๆ รู้ไหมว่าทุกครั้งที่เรา build Docker image ไฟล์ทั้งหมดใน directory จะถูกส่งเข้าไปใน Docker daemon ก่อน แล้วค่อยเริ่ม build image ถ้าเรามีไฟล์ที่ไม่จำเป็นเยอะๆ เช่น log file, node_modules (ถ้าเราไม่ได้ build frontend ใน Docker), หรือพวกไฟล์ .git มันจะทำให้ build ช้ามาก
วิธีแก้ก็ง่ายๆ สร้างไฟล์ .dockerignore ขึ้นมา แล้วใส่พวกไฟล์หรือ directory ที่เราไม่ต้องการลงไป
node_modules
.git
*.log
เหมือนตอนเรา push code ขึ้น git เลยใช่ไหมล่ะ
สมัยก่อนตอนผมทำเว็บด้วย PHP นะ เวลา deploy ทีไฟล์เยอะแยะเต็มไปหมด แถมต้องมีพวก dependency ต่างๆ บน server เยอะแยะ Docker ช่วยลดปัญหาตรงนี้ได้เยอะ แต่ก็ต้องทำให้ถูกวิธี
Multi-Stage Builds คือการที่เราใช้หลาย FROM ใน Dockerfile เดียว แต่ละ FROM ก็คือ stage แต่ละ stage สามารถมี dependencies ที่ต่างกันได้ สุดท้ายเราก็ copy เฉพาะสิ่งที่จำเป็นจาก stage สุดท้ายไปยัง image ที่เราจะ deploy
FROM node:16 as builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
ในตัวอย่างนี้ เราใช้ node image เพื่อ build frontend แล้ว copy เฉพาะไฟล์ build ไปใส่ใน nginx image ทำให้ image สุดท้ายมีขนาดเล็ก
เคยไหมรัน container แล้วมันกิน resource จนเครื่องแฮงค์? ผมเคย! สมัยก่อนร้านเน็ตเครื่องลูกข่ายชอบค้างเพราะ process นึงกิน CPU เต็ม 100% Docker ช่วยเราจำกัด resource ที่แต่ละ container ใช้ได้
เราสามารถจำกัด CPU, Memory, และ IO ได้ตอนรัน container ด้วย flag ต่างๆ เช่น --cpus, --memory, --memory-swap
docker run --cpus="0.5" --memory="512m" my-image
แบบนี้ container จะใช้ CPU ไม่เกิน 50% และ memory ไม่เกิน 512MB ลองปรับใช้ดูนะ
เรื่องความปลอดภัยสำคัญมาก! ยิ่งถ้าเราเอา Docker image จาก public registry มาใช้ เราต้องเช็คให้ดีว่ามันมีช่องโหว่หรือเปล่า
มี tools หลายตัวที่ช่วย scan Docker image ได้ เช่น Trivy, Clair พวกนี้จะช่วย detect vulnerability ใน image ของเรา
ลองใช้ tools เหล่านี้เป็นประจำเพื่อความปลอดภัยของระบบ
Docker Compose คือ tool ที่ช่วยให้เรา define และ run multi-container application ได้ง่ายขึ้น แทนที่เราจะต้องรัน docker run หลายๆ command เราสามารถ define ทุกอย่างในไฟล์ docker-compose.yml แล้วรัน docker-compose up ครั้งเดียว
มันเหมือนเป็น script ที่ช่วยจัดการ container หลายๆ ตัวพร้อมๆ กัน
Docker Hub คือ public registry ที่เก็บ Docker image เหมือนเป็น App Store ของ Docker เลย เราสามารถ push image ของเราขึ้นไป หรือ pull image ของคนอื่นมาใช้ได้
แต่ต้องระวังเรื่อง security ด้วยนะ! เช็ค image ให้ดีก่อนเอามาใช้
Virtual Machine (VM) คือการจำลอง hardware ทั้งเครื่องขึ้นมา ทำให้ VM มีขนาดใหญ่ กิน resource เยอะ แต่ Docker จะ share kernel ของ host OS ทำให้ Docker มีขนาดเล็กกว่า และ start เร็วกว่า
เปรียบเทียบง่ายๆ VM เหมือนเรามีคอมพิวเตอร์ทั้งเครื่อง แต่ Docker เหมือนเรามีแค่โปรแกรมที่รันบนคอมพิวเตอร์
Docker ช่วยให้เรา package application พร้อมกับ dependencies ทั้งหมด ทำให้การ deploy ง่ายขึ้น และ consistent ไม่ว่าจะ deploy ที่ไหน Docker ก็จะ run เหมือนกัน
มันช่วยลดปัญหา "It works on my machine" ได้อย่างมาก
Docker เป็นเครื่องมือที่ทรงพลังมากสำหรับ DevOps แต่การใช้งานให้ได้ผลดีต้องอาศัยความเข้าใจและประสบการณ์ หวังว่าบทความนี้จะเป็นประโยชน์กับน้องๆ นะครับ ถ้ามีคำถามอะไรเพิ่มเติม ถามมาได้เลย!
อย่าลืมไปอ่าน SiamCafe Blog นะ มีบทความดีๆ อีกเยอะเลย
สำหรับใครที่สนใจเรื่องการเทรด iCafeForex ก็มีคอร์สสอนนะครับ