DevOps
น้องๆ เคยเจอไหม? สมัยผมทำร้านเน็ต SiamCafe.net เนี่ย (ตั้งแต่ปี 97 นะ!) ปัญหาโลกแตกคือโปรแกรมที่ร้านมันลงได้ ทำไมเอาไปลงเครื่องลูกค้าแล้ว error เฉยเลย! บางทีก็เรื่องเวอร์ชั่น library ไม่ตรงกัน, dependency ตีกันมั่วไปหมด ปวดหัวสุดๆ Docker เนี่ยแหละคือพระเอกที่เข้ามาช่วยแก้ปัญหานี้
Docker มันคือเทคโนโลยี Containerization ที่ทำให้เราแพ็คโปรแกรมของเราพร้อมทั้ง environment ที่มันต้องการ (พวก libraries, dependencies) ไปอยู่ใน "ตู้คอนเทนเนอร์" แล้วเอาไปรันที่ไหนก็ได้! ไม่ว่าจะเครื่องเรา, เครื่องเพื่อน, หรือบน Cloud มันก็จะทำงานเหมือนกันเป๊ะๆ เพราะทุกอย่างมันถูกห่อไว้หมดแล้ว
สมัยก่อนตอนยังไม่มี Docker เวลาจะ deploy อะไรทีนึงนี่คือต้องมานั่ง configure server กันใหม่หมด ลง packages นู่นนี่นั่น กว่าจะรันได้แต่ละทีเสียเวลาเป็นวันๆ แถมมีโอกาสพลาดสูงมาก แต่ Docker ทำให้ชีวิตง่ายขึ้นเยอะ แค่ build image จาก Dockerfile แล้ว run container จบเลย!
ไม่ต้องกลัวว่ามันจะยากนะน้องๆ Docker ไม่ได้ยากอย่างที่คิด มาลองทำตาม step เหล่านี้กันเลย:
อย่างแรกเลย ไปโหลด Docker Desktop มาติดตั้งก่อนเลย Docker Desktop มีให้ใช้ทั้ง Windows และ macOS (Linux ก็มี Docker Engine ให้ลงนะ)
Dockerfile คือไฟล์ที่เราเขียน instruction ว่าเราต้องการให้ Docker build image ของเรายังไง ตัวอย่างง่ายๆ เช่น:
# ใช้ base image เป็น Ubuntu เวอร์ชั่นล่าสุด
FROM ubuntu:latest
# ติดตั้ง package ที่จำเป็น
RUN apt-get update && apt-get install -y \
python3 \
python3-pip
# Copy ไฟล์โปรแกรมของเราเข้าไปใน container
COPY . /app
# เปลี่ยน working directory ไปที่ /app
WORKDIR /app
# ติดตั้ง dependencies จาก requirements.txt (ถ้ามี)
RUN pip3 install -r requirements.txt
# สั่งให้รันโปรแกรมเมื่อ container เริ่มทำงาน
CMD ["python3", "your_program.py"]
อธิบาย code ข้างบน:
FROM ubuntu:latest: บอกว่าเราจะใช้ Ubuntu เวอร์ชั่นล่าสุดเป็น base imageRUN apt-get update && apt-get install -y ...: สั่งให้รันคำสั่ง apt-get เพื่อติดตั้ง package ที่จำเป็นCOPY . /app: Copy ไฟล์ทั้งหมดใน directory ปัจจุบัน ไปไว้ที่ /app ใน containerWORKDIR /app: เปลี่ยน working directory ไปที่ /appRUN pip3 install -r requirements.txt: ติดตั้ง dependencies ที่อยู่ในไฟล์ requirements.txt (ถ้ามี)CMD ["python3", "your_program.py"]: สั่งให้รันโปรแกรม your_program.py เมื่อ container เริ่มทำงานหลังจากที่เรามี Dockerfile แล้ว เราก็สามารถ build image ได้โดยใช้คำสั่งนี้:
docker build -t your_image_name .
your_image_name คือชื่อที่เราต้องการตั้งให้กับ image ของเรา (ตั้งให้มันสื่อความหมายหน่อยนะ จะได้จำง่ายๆ) ส่วน . หมายถึง Dockerfile อยู่ใน directory ปัจจุบัน
พอเรา build image เสร็จแล้ว เราก็สามารถ run container ได้โดยใช้คำสั่งนี้:
docker run -d -p 8000:8000 your_image_name
อธิบาย code:
-d: Run container แบบ detached mode (background)-p 8000:8000: Map port 8000 บน host machine ไปยัง port 8000 ใน container (อันนี้สำคัญ ถ้าโปรแกรมเรา listen อยู่บน port ไหน ก็ต้อง map port ให้ถูกต้อง)your_image_name: ชื่อ image ที่เราสร้างไว้แค่นี้เอง! โปรแกรมของเราก็จะรันอยู่ใน Docker container แล้ว ลองเข้าไปดูที่ SiamCafe Blog อาจจะมีบทความที่เกี่ยวข้องเพิ่มเติมนะ
หลายคนอาจจะสงสัยว่า Docker มันต่างจาก Virtual Machine (VM) ยังไง? มาดูตารางเปรียบเทียบกัน:
| คุณสมบัติ | Docker | Virtual Machine (VM) |
|---|---|---|
| ขนาด | เล็กกว่า (MB) | ใหญ่กว่า (GB) |
| Resource Utilization | น้อยกว่า | มากกว่า |
| Boot Time | เร็วกว่า (วินาที) | ช้ากว่า (นาที) |
| Isolation | ระดับ Process | ระดับ OS |
| Overhead | ต่ำ | สูง |
สรุปง่ายๆ คือ Docker มัน lightweight กว่า VM เยอะ ใช้ resource น้อยกว่า และ boot เร็วกว่า เหมาะกับการทำ Microservices และ Continuous Integration/Continuous Deployment (CI/CD)
ดูวิดีโอเพิ่มเติมเกี่ยวกับDocker สำหรับมือใหม่ เข้าใจง่า:
Docker image คือ blueprint หรือ template ส่วน container คือ instance ที่กำลัง run อยู่ของ image นั้น คิดง่ายๆ เหมือนพิมพ์เขียวบ้าน (image) กับบ้านที่สร้างเสร็จแล้ว (container)
วิธีที่ง่ายที่สุดคือ push image ของเราขึ้นไปบน Docker Hub (เหมือน GitHub สำหรับ Docker image) แล้วคนอื่นก็สามารถ pull image ของเรามาใช้ได้
Docker Compose เป็นเครื่องมือที่ช่วยให้เรา define และ manage multi-container applications ได้ง่ายขึ้น โดยเราจะเขียนไฟล์ docker-compose.yml เพื่อ define services ต่างๆ ที่อยู่ใน application ของเรา แล้ว Docker Compose จะจัดการ build และ run containers ให้เรา
หวังว่าบทความนี้จะช่วยให้น้องๆ เข้าใจ Docker มากขึ้นนะ ลองเอาไปประยุกต์ใช้กับงานของตัวเองดู รับรองชีวิตดีขึ้นเยอะ! อย่าลืมแวะไปอ่านบทความอื่นๆ ใน SiamCafe Blog ด้วยนะ
สมัยผมทำร้านเน็ตฯ สมัยก่อน bandwidth มันจำกัด Image ยิ่งเล็กยิ่งดี โหลดเร็ว deploy เร็ว ประหยัดเนื้อที่ด้วย
วิธีง่ายๆ คือใช้ base image ที่จำเป็นจริงๆ อย่าง Alpine Linux หรือ Distroless Image แล้วก็ Multi-stage build ช่วยลดขนาด Image ได้เยอะเลย
FROM node:16-alpine 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
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
พวก API keys, passwords, database credentials อย่าใส่ไว้ใน Dockerfile เด็ดขาด! ใครได้ Image เราไปก็จบเห่
ใช้ Docker Secrets หรือ Environment Variables แทนดีกว่า ปลอดภัยกว่าเยอะ
ถ้าโปรเจคเรามีหลาย Container เช่น web app, database, cache อย่ารัน Container แยกกันเลย มันวุ่นวาย
Docker Compose ช่วยจัดการให้ทุกอย่างง่ายขึ้น กำหนด dependencies, network, volume ในไฟล์เดียว จบ!
version: "3.9"
services:
web:
image: my-web-app
ports:
- "80:80"
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
เหมือน Windows Update นั่นแหละ Docker Image ก็ต้องอัพเดทเหมือนกัน Security patch, bug fixes มาเรื่อยๆ
ใช้ Dependabot หรือ Snyk ช่วย scan vulnerabilities ใน Image เราได้ จะได้รู้ว่าต้องอัพเดทอะไรบ้าง
VM จำลองทั้ง OS หนักมาก Docker แชร์ Kernel กับ Host OS เบากว่าเยอะ เร็วกว่าด้วย สมัยผมทำร้านเน็ตฯ ถ้าใช้ VM คงเจ๊งไปแล้ว
Web application, microservices, CI/CD pipeline คือ use cases หลักๆ เลย Docker ช่วยให้ environment ทุกคนเหมือนกันหมด หมดปัญหา "ทำไมมันรันบนเครื่องผมได้" ซักที
Docker Compose เหมาะกับ development environment หรือ production ที่ scale ไม่ใหญ่มาก Kubernetes เหมาะกับ production scale ใหญ่ๆ ที่ต้องการ orchestration แบบ advanced พวก auto-scaling, rolling updates อะไรพวกนี้
ถ้าเป็นเมื่อก่อน สมัยผมทำร้านเกมส์ คงไม่ต้องใช้ Kubernetes หรอก Docker Compose ก็เหลือๆ
ใช่ Docker Desktop เปลี่ยน Licensing policy ไปแล้ว ถ้าใช้ในองค์กรใหญ่ๆ ต้องจ่ายเงิน แต่ถ้าใช้ส่วนตัว เรียนรู้ หรือธุรกิจขนาดเล็ก ยังใช้ฟรีได้อยู่
แต่ถ้าไม่อยากจ่ายเงิน ก็มีทางเลือกอื่น เช่น Rancher Desktop หรือ Podman
Docker documentation, SiamCafe Blog, Udemy, Coursera มีคอร์สดีๆ เยอะแยะเลย ลองหาดู
หรือถ้าอยากลงทุน forex ลองดู iCafeForex ก็ได้นะ :)
Docker ไม่ได้ยากอย่างที่คิด ลองเล่นดูแล้วจะติดใจ มันช่วยให้ชีวิตเราง่ายขึ้นเยอะ
หวังว่าบทความนี้จะเป็นประโยชน์กับทุกคนนะครับ ถ้ามีคำถามอะไรเพิ่มเติม ถามมาได้เลย
SiamCafe.net — แหล่งความรู้ด้าน IT, Network, Security, Programming อันดับ 1 ของไทย ก่อตั้งตั้งแต่ปี 1997 โดย อ.บอม ผู้เชี่ยวชาญด้าน IT Infrastructure และ Forex Trading มากกว่า 25 ปี บทความทุกชิ้นเขียนจากประสบการณ์จริงในวงการ IT ประเทศไทย