Docker Compose overview
ด็อกเกอร์คอมโพส (Docker Compose) คือเครื่องมือที่ช่วยให้เราประกาศและจัดการระบบหลายคอนเทนเนอร์ (Container) ผ่านไฟล์เดียว ทำให้การเริ่มระบบ หยุดระบบ และทดสอบซ้ำเป็นชุดเดียวกันได้ง่ายขึ้น โดยเฉพาะงานพัฒนาแบบโลคัล (Local development)
ภาพเปรียบเทียบ: ซ้ายคือสั่ง docker run หลายคำสั่งทีละคอนเทนเนอร์ ส่วนขวาคือประกาศทั้งหมดในคอมโพสไฟล์ (Compose file) แล้วสั่ง docker compose up ครั้งเดียว
ภาพความสัมพันธ์เซอร์วิส: ฟรอนต์เอนด์ (Frontend) ส่งคำขอไปแบ็กเอนด์ (Backend) และแบ็กเอนด์เชื่อมฐานข้อมูล (Database) ภายใต้เน็ตเวิร์กร่วมกัน
ภาพจำสำคัญบทนี้
Docker Compose = ประกาศหลายเซอร์วิสไว้ในไฟล์เดียว แล้วใช้ up/down/ps จัดการทั้งระบบอย่างเป็นชุด
ส่วนที่ 1
1) Docker Compose คืออะไร
ด็อกเกอร์คอมโพส (Docker Compose) คือเครื่องมือของด็อกเกอร์ (Docker) ที่ใช้กำหนดระบบหลายเซอร์วิส (Service) ไว้ในไฟล์ `compose.yml` หรือ `docker-compose.yml` ไฟล์เดียว จากนั้นใช้คำสั่งเดียวเพื่อสั่งให้ทั้งระบบทำงานพร้อมกัน ถ้ามองแบบง่ายที่สุด: Docker CLI ปกติใช้สั่งคอนเทนเนอร์ทีละตัว แต่ Compose ใช้สำหรับอธิบายทั้งระบบ เช่น มีฟรอนต์เอนด์ (Frontend), แบ็กเอนด์ (Backend), และฐานข้อมูล (Database) แล้วให้มันเริ่มทำงานร่วมกันอย่างเป็นระบบ
ประเด็นที่ 1
ไฟล์เดียวกำหนดได้หลายเซอร์วิส (Service) พร้อมกัน
ประเด็นที่ 2
สั่งเริ่ม/หยุดทั้งชุดด้วยคำสั่งสั้น ๆ
ประเด็นที่ 3
เหมาะกับงานพัฒนาและทดสอบระบบหลายส่วนบนเครื่องเรา
ส่วนที่ 2
2) ปัญหาที่เกิดเมื่อจัดการหลายคอนเทนเนอร์ด้วย docker run ทีละคำสั่ง
สมมติระบบหนึ่งมี 3 ส่วน: ฟรอนต์เอนด์ (Frontend), แบ็กเอนด์ (Backend), ฐานข้อมูลโพสต์เกรส (PostgreSQL) ถ้าใช้ `docker run` ทีละตัว เราต้องจำรายละเอียดเยอะมาก เช่น ชื่อคอนเทนเนอร์ พอร์ต ตัวแปรแวดล้อม (Environment variables) วอลุ่ม (Volume) และเน็ตเวิร์ก (Network) ของแต่ละตัว ถ้าพิมพ์ผิดเพียงจุดเดียว ระบบอาจสื่อสารกันไม่ได้ทันที
ตัวอย่างนี้ทำงานได้ แต่ดูแลยากเมื่อระบบโตขึ้นหรือมีทีมหลายคน
- ต้องพิมพ์และจำหลายคำสั่ง หลายพารามิเตอร์
- ต้องจัดลำดับการรันเอง เช่น ฐานข้อมูลควรมาก่อนแบ็กเอนด์
- แชร์ให้เพื่อนร่วมทีมยาก เพราะถ้าตกหล่น 1 option ระบบอาจพัง
- ล้างระบบให้สะอาดยาก ต้องหยุดและลบทีละคอนเทนเนอร์
ส่วนที่ 3
3) Docker Compose ช่วยแก้ปัญหาอย่างไร
Compose แก้ปัญหาหลักด้วยแนวคิดประกาศระบบ (Declarative) คือเราเขียนสิ่งที่ระบบควรเป็นไว้ในไฟล์ แล้วให้เครื่องมือจัดการการรันให้ แทนการพิมพ์คำสั่งยาว ๆ ซ้ำทุกครั้ง ผลคือโปรเจกต์เดียวกันสามารถเปิดระบบเดิมซ้ำได้ง่าย ทั้งบนเครื่องตัวเองและเครื่องเพื่อนร่วมทีม
ประเด็นที่ 1
จากหลายคำสั่ง เปลี่ยนเป็นไฟล์เดียว
ประเด็นที่ 2
เริ่ม/หยุดทั้งระบบได้ด้วยคำสั่งเดียว
ประเด็นที่ 3
ลดข้อผิดพลาดจากการพิมพ์คำสั่งซ้ำ
ส่วนที่ 4
4) แนวคิดหลักของ Compose: คอมโพสไฟล์, เซอร์วิส, เน็ตเวิร์ก, วอลุ่ม
4.1 คอมโพสไฟล์ (Compose file): ไฟล์ศูนย์กลางของระบบ 4.2 เซอร์วิส (Services): หน่วยการทำงานแต่ละส่วน เช่น frontend, backend, db 4.3 เน็ตเวิร์ก (Networks): ช่องทางสื่อสารระหว่างเซอร์วิส 4.4 วอลุ่ม (Volumes): ที่เก็บข้อมูลถาวรที่ไม่หายเมื่อคอนเทนเนอร์หยุด ความสัมพันธ์สำคัญ: เซอร์วิสถูกประกาศในคอมโพสไฟล์ (Compose file), เซอร์วิสเชื่อมกันผ่านเน็ตเวิร์ก (Networks), และใช้วอลุ่ม (Volumes) เพื่อเก็บข้อมูลที่ต้องคงอยู่
| องค์ประกอบ | ทำหน้าที่อะไร | ตัวอย่าง |
|---|---|---|
| คอมโพสไฟล์ (Compose file) | ไฟล์ประกาศสเปกระบบหลายคอนเทนเนอร์ | services, ports, env, volumes |
| เซอร์วิส (Services) | ระบุคอนเทนเนอร์แต่ละบทบาทของระบบ | frontend, backend, db |
| เน็ตเวิร์ก (Networks) | ทำให้บริการคุยกันได้ด้วยชื่อเซอร์วิส | backend เรียก db:5432 |
| วอลุ่ม (Volumes) | เก็บข้อมูลถาวรข้ามการสร้างคอนเทนเนอร์ใหม่ | postgres_data |
ส่วนที่ 5
5) ตัวอย่างระบบที่มี frontend + backend + database
ตัวอย่างนี้เป็นโครงสร้างมาตรฐานที่เจอบ่อยมากในงานจริง: ฟรอนต์เอนด์ (Frontend) เรียกแบ็กเอนด์ (Backend) และแบ็กเอนด์เชื่อมฐานข้อมูล (Database) โดยทั้งหมดอยู่ในไฟล์คอมโพสเดียว
ตัวอย่างสำหรับการเรียนรู้ภาพรวม: มี 3 services, network เดียว และ volume สำหรับข้อมูลฐานข้อมูล
- frontend คุยกับ backend ผ่านชื่อเซอร์วิส `backend`
- backend คุยกับ db ผ่านชื่อเซอร์วิส `db`
- ข้อมูล db เก็บใน volume ชื่อ `postgres_data` ไม่หายเมื่อ down แล้ว up ใหม่
ส่วนที่ 6
6) ทำไม Compose เหมาะกับ local development และการทดลองระบบหลายส่วน
สำหรับการพัฒนาแบบโลคัล (Local development) เราต้องเปิดระบบบ่อย ปิดบ่อย แก้โค้ดบ่อย Compose ช่วยให้กระบวนการเหล่านี้สม่ำเสมอ และทำซ้ำได้ง่าย นอกจากนี้ยังเหมาะกับการทดลองสถาปัตยกรรมหลายส่วน เพราะเราเปลี่ยนไฟล์คอมโพสเพียงจุดเดียวแล้วสั่งระบบใหม่ได้ทันที
ประเด็นที่ 1
Onboarding ทีมง่ายขึ้น: เพื่อนร่วมทีมใช้ไฟล์เดียวกัน
ประเด็นที่ 2
ลองสลับบริการหรือเวอร์ชันได้เร็ว เช่น เปลี่ยน image ของ db
ประเด็นที่ 3
รีเซ็ตสภาพแวดล้อมได้ง่ายด้วย down/up
ส่วนที่ 7
7) คำสั่งพื้นฐานที่ควรเกริ่น: up, down, ps
สามคำสั่งนี้คือแกนเริ่มต้นของ Docker Compose สำหรับผู้เริ่มต้น
เริ่มจาก up เพื่อเปิดระบบ, ใช้ ps เพื่อตรวจสถานะ, และ down เพื่อปิดระบบ
- `docker compose up -d` ใช้ตอนเริ่มทำงาน
- `docker compose ps` ใช้เช็กว่าเซอร์วิส (Service) ไหนขึ้นแล้วหรือยัง
- `docker compose down` ใช้ตอนปิดงานหรือรีเซ็ตสภาพแวดล้อม
ส่วนที่ 8
8) ข้อดีของ Docker Compose
Compose ไม่ได้แค่สั่งให้หลายคอนเทนเนอร์ขึ้นพร้อมกัน แต่ช่วยยกระดับคุณภาพการทำงานของทีมในระยะยาว
- ประกาศระบบชัดเจนในไฟล์เดียว อ่านและรีวิวง่าย
- ลดคำสั่งยาว ๆ ที่ผิดพลาดง่าย
- ทำซ้ำได้เหมือนเดิมทุกครั้ง (Reproducible)
- เหมาะกับระบบหลายบริการในงานพัฒนา
- แชร์สภาพแวดล้อมเดียวกันระหว่างทีมได้ดี
ส่วนที่ 9
9) ข้อจำกัดหรือสิ่งที่ควรรู้
Compose เหมาะมากสำหรับ development และการทดลอง แต่ยังมีขอบเขตการใช้งานที่ควรรู้ตั้งแต่ต้น
- ไม่ใช่เครื่องมือจัดการคลัสเตอร์ขนาดใหญ่โดยตรงเหมือนคิวเบอร์เนทีส (Kubernetes)
- `depends_on` ช่วยเรื่องลำดับการเริ่ม แต่ไม่ได้การันตีว่า service ปลายทางพร้อมใช้งานจริงทันที
- ถ้าระบบ production ซับซ้อนมาก อาจต้องมี orchestration เพิ่ม
- ยังต้องเข้าใจพื้นฐาน Docker เช่น image, network, volume เพื่อแก้ปัญหาได้ดี
ส่วนที่ 10
10) ข้อผิดพลาดที่พบบ่อยสำหรับผู้เริ่มต้น
ข้อผิดพลาดต่อไปนี้เกิดบ่อยมากในช่วงเริ่มต้น และแก้ได้ถ้ารู้หลัก
- ลืม map ports ทำให้เปิด localhost แล้วเข้าไม่ได้
- ใช้ชื่อ host ผิด เช่น backend ชี้ฐานข้อมูลไป `localhost` แทน `db`
- พอร์ตชนกันบนเครื่อง เช่น 3000 ถูกใช้งานอยู่แล้ว
- ลืมใช้ volume กับฐานข้อมูล ทำให้ข้อมูลหายเมื่อสร้างคอนเทนเนอร์ใหม่
- แก้ compose file แล้วไม่ restart stack ทำให้คิดว่าไฟล์ไม่ทำงาน
- พิมพ์ YAML ผิด indentation ทำให้ compose parse ไม่ผ่าน
ส่วนที่ 11
11) สรุปท้ายบทแบบจำง่าย
ถ้าจำได้ 4 บรรทัดนี้ คุณจะเริ่มใช้ Compose ได้อย่างมั่นใจ
ประเด็นที่ 1
ปัญหาเดิม: `docker run` หลายคำสั่ง จัดการยาก
ประเด็นที่ 2
ทางแก้: ใช้คอมโพสไฟล์ (Compose file) ประกาศทั้งระบบในไฟล์เดียว
ประเด็นที่ 3
แกนหลัก: services + networks + volumes ทำงานร่วมกัน
ประเด็นที่ 4
คำสั่งเริ่มต้น: `up`, `ps`, `down`
ส่วนที่ 12
12) แบบฝึกหัด 3 ข้อ พร้อมแนวเฉลย (กดแล้วค่อยแสดง)
ลองตอบด้วยตัวเองก่อน แล้วค่อยกดดูแนวเฉลยเพื่อเช็กความเข้าใจ