Docker & Containerization
Docker & Containerization
Docker คือเครื่องมือที่ช่วยให้เราสร้างและรันโปรแกรมได้เหมือนกันทุกที่ — ไม่ว่าจะอยู่บนเครื่องนักพัฒนา เครื่องทดสอบ หรือบนเซิร์ฟเวอร์จริง โดยการ "บรรจุ" โปรแกรมและสิ่งที่ต้องใช้ทั้งหมด (เช่น library, dependency, OS บางส่วน) ลงในสิ่งที่เรียกว่า container
Docker คืออะไร?
Docker เป็น platform สำหรับพัฒนา ship และรันแอปพลิเคชันใน containers ช่วยให้:
- แอปพลิเคชันทำงานได้เหมือนกันบนทุกเครื่อง
- ติดตั้งและลบแอปได้ง่าย ไม่ทิ้งขยะในระบบ
- จัดการ dependencies แยกจากกัน ไม่ชนกัน
- Deploy ง่ายและรวดเร็ว
แนวคิดหลักของ Docker
Container คืออะไร?
Container คือ "กล่อง" ที่บรรจุแอปพลิเคชันพร้อมทุกอย่างที่มันต้องใช้:
- เหมือนกับ "กล่องพร้อมรัน" - เปิดขึ้นมาโปรแกรมก็ทำงานได้ทันที
- แยกจากกัน - ไม่ชนกับ container อื่น
- เบากว่า Virtual Machine - แชร์ระบบปฏิบัติการหลักร่วมกัน
🧠 ตัวอย่าง:
สมมติคุณมีเว็บ Node.js — ปกติคุณต้องลง Node, npm, และ dependency เอง
แต่ถ้าคุณใช้ Docker คุณแค่รัน container ที่มี Node อยู่แล้ว โปรแกรมก็ทำงานได้เลย
Image คืออะไร?
Image คือ "แม่พิมพ์" หรือ "พิมพ์เขียว" สำหรับสร้าง container:
- เราสร้าง image หนึ่งชุด แล้ว Docker จะใช้มันสร้าง container ออกมา
- Image เป็นแบบ read-only (อ่านอย่างเดียว)
- เวลารันจริง Docker จะเอา image นี้มาสร้างเป็น container ที่แก้ไขได้
🧩 ตัวอย่าง:
คุณอาจมี image ชื่อว่า myapp:v1
เวลาคุณรัน docker run myapp:v1 → จะได้ container ที่รันโปรแกรม myapp ตาม image นั้น
Volume คืออะไร?
Volume คือ "พื้นที่เก็บข้อมูลถาวร" สำหรับ container:
- โดยปกติข้อมูลใน container จะหายไปถ้าปิดหรือลบมัน
- Volume ทำให้ข้อมูลคงอยู่แม้ container หาย
- เหมาะสำหรับเก็บฐานข้อมูล, ไฟล์ log, หรือข้อมูลผู้ใช้
การติดตั้ง Docker
Windows
ดาวน์โหลด Docker Desktop จาก:
https://docs.docker.com/desktop/setup/install/windows-install/
macOS
ดาวน์โหลด Docker Desktop จาก:
https://docs.docker.com/desktop/setup/install/mac-install/
Linux
ตรวจสอบการติดตั้ง
Docker Hub
Docker Hub (https://hub.docker.com/) เป็น registry สำหรับเก็บและแชร์ Docker images:
- หา official images สำหรับ PostgreSQL, Node.js, Python ฯลฯ
- Pull images มาใช้ในเครื่องของเรา
- Push images ของเราไปแชร์
คำสั่ง Docker พื้นฐาน
จัดการ Images
รัน Container แบบง่าย
อธิบาย:
--name some-postgres= ตั้งชื่อ container-e POSTGRES_PASSWORD=...= ตั้งค่า environment variable-d= รันใน background (detached mode)postgres:15.14-alpine3.22= image ที่จะใช้
รัน Container พร้อม Port Mapping
อธิบาย:
-p 5432:5432= map port- Port แรก (5432) = port บนเครื่องเรา
- Port สอง (5432) = port ภายใน container
ถ้าต้องการใช้ port อื่น:
จัดการ Container
ดู Logs
เข้าไปใน Container
Docker Compose
Docker Compose เป็นเครื่องมือสำหรับกำหนดและรันหลาย containers พร้อมกัน ใช้ไฟล์ docker-compose.yml ในการตั้งค่า
ตัวอย่าง docker-compose.yml
คำสั่ง Docker Compose
Environment Variables
วิธีที่ 1: ใส่ใน docker-compose.yml
วิธีที่ 2: ใช้ไฟล์ .env
สร้างไฟล์ .env:
แก้ไข docker-compose.yml:
⚠️ สำคัญ: เพิ่ม .env เข้าใน .gitignore เพื่อไม่ให้ commit ข้อมูลลับ!
Docker Volumes
Volumes ใช้เก็บข้อมูลถาวรที่ไม่ต้องการให้หายเมื่อลบ container
Named Volumes
Bind Mounts (ชี้ไปที่โฟลเดอร์จริง)
ใน .env:
สร้างโฟลเดอร์ Volume
ทำไมต้องใช้ Volumes?
- ✅ ข้อมูลไม่หาย เมื่อลบหรือ recreate container
- ✅ Backup ง่าย แค่ copy โฟลเดอร์
- ✅ แชร์ข้อมูล ระหว่าง containers ได้
ตัวอย่างโปรเจกต์เต็มรูปแบบ
โครงสร้างไฟล์
docker-compose.yml
.env
.gitignore
เริ่มใช้งาน
เชื่อมต่อฐานข้อมูลจากแอปพลิเคชัน
Connection String
ใน .env (สำหรับ Drizzle/Node.js)
ทดสอบการเชื่อมต่อด้วย DBeaver
- ดาวน์โหลด DBeaver
- สร้าง New Database Connection
- เลือก PostgreSQL
- กรอกข้อมูล:
- Host: localhost
- Port: 5432 (หรือตามที่ตั้งไว้)
- Database: mydb
- Username: myuser
- Password: mysecretpassword
- กด Test Connection
- กด Finish
Docker Networking
Containers ใน Docker Compose สามารถสื่อสารกันได้ผ่าน service name:
ใน container api สามารถเข้าถึง postgres ที่ postgres:5432 (ใช้ชื่อ service)
Multi-Stage Builds (ขั้นสูง)
สร้าง Dockerfile แบบ multi-stage เพื่อลดขนาด image:
Best Practices
1. ใช้ Official Images
2. ระบุ Version
3. ใช้ Alpine Images
Alpine Linux มีขนาดเล็กกว่า:
postgres:15-alpine= ~200 MBpostgres:15= ~350 MB
4. ตั้งค่า Restart Policy
5. ใช้ Health Checks
6. ไม่ Commit Secrets
7. Clean Up เป็นประจำ
สรุป
Docker ช่วยให้การพัฒนาและ deploy แอปพลิเคชันง่ายขึ้น:
- ✅ Environment เหมือนกันทุกที่ - dev, test, production
- ✅ ติดตั้งง่าย - แค่รัน
docker compose up - ✅ แยก dependencies - ไม่ต้องกลัวชนกัน
- ✅ Portable - ทำงานบนทุก OS ที่มี Docker
เริ่มต้นด้วย Docker Compose สำหรับโปรเจกต์ของคุณวันนี้!
แหล่งข้อมูลเพิ่มเติม
เอกสารอย่างเป็นทางการ
- Docker Documentation - คู่มือและข้อมูลอ้างอิงครบถ้วน
- Docker Hub - คลัง image อย่างเป็นทางการ
- Docker Compose Documentation - คู่มือ Compose
- Docker GitHub Repository - ซอร์สโค้ด
แนะนำสำหรับการเรียนรู้เพิ่มเติม
- Docker Getting Started - บทเรียนอย่างเป็นทางการ
- Play with Docker - สนามเด็กเล่นแบบโต้ตอบ
- Docker Best Practices - คู่มือแนวทางปฏิบัติที่ดี
- Awesome Docker - รวบรวมแหล่งข้อมูล