Documentation
กลับไปหมวดหมู่

Docker & Containerization

เวลาอ่านโดยประมาณ: ~15 นาที

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

  1. ดาวน์โหลด DBeaver
  2. สร้าง New Database Connection
  3. เลือก PostgreSQL
  4. กรอกข้อมูล:
    • Host: localhost
    • Port: 5432 (หรือตามที่ตั้งไว้)
    • Database: mydb
    • Username: myuser
    • Password: mysecretpassword
  5. กด Test Connection
  6. กด 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 MB
  • postgres: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 สำหรับโปรเจกต์ของคุณวันนี้!

แหล่งข้อมูลเพิ่มเติม

เอกสารอย่างเป็นทางการ

แนะนำสำหรับการเรียนรู้เพิ่มเติม