docker compose...มันคืออะไร

#ติดเทรนด์ #Lemon8ฮาวทู #ป้ายยากับlemon8 #พื้นฐานการเขียนเว็ปไซต์

Docker Compose คือเครื่องมือที่ช่วยให้เราสามารถจัดการ Multi-container Application (โปรเจกต์ที่มีหลายคอนเทนเนอร์ทำงานร่วมกัน) ได้ด้วยการใช้ไฟล์ตั้งค่าเพียงไฟล์เดียวครับ

หากเปรียบเทียบให้เห็นภาพ:

Docker Engine คือ "คนขับรถเครน" ที่ยกตู้คอนเทนเนอร์ทีละตู้

Docker Compose คือ "หัวหน้าผู้ควบคุมงาน (Conductor)" ที่ถือแผนผังและสั่งให้ตู้ทุกลูก (Node.js, Nginx, Database) วางลงในตำแหน่งที่ถูกต้องและเชื่อมต่อกันโดยอัตโนมัติ

Docker Compose ทำหน้าที่อะไรบ้าง?

หน้าที่หลักของมันคือการเปลี่ยนขั้นตอนที่ยุ่งยากให้กลายเป็นเรื่องง่าย ผ่านกระบวนการดังนี้:

1. การกำหนดสเปก (Definition)

แทนที่คุณจะต้องพิมพ์คำสั่งรันยาวๆ ทีละคอนเทนเนอร์ คุณจะเขียนทุกอย่างลงในไฟล์ docker-compose.yml เพียงไฟล์เดียว เช่น:

จะใช้ Image อะไร?

ต้องเปิดพอร์ตไหน?

ต้องเชื่อมต่อกับ Database ตัวไหน?

2. การสั่งการด้วยคำสั่งเดียว (Single Command Orchestration)

เมื่อเตรียมไฟล์เสร็จ คุณใช้คำสั่งเดียวคือ docker compose up แล้ว Docker Compose จะทำหน้าที่:

Build: สร้าง Image ให้ทุก Service ตามที่ระบุ

Create: สร้าง Network จำลองเพื่อให้คอนเทนเนอร์คุยกันได้

Start: เริ่มการทำงานของทุกคอนเทนเนอร์พร้อมกันตามลำดับที่ถูกต้อง

3. การจัดการความสัมพันธ์ (Service Dependencies)

มันสามารถกำหนดได้ว่า "ต้องให้ Database รันให้เสร็จก่อนนะ แล้วค่อยรัน Node.js ตามมา" ผ่านคำสั่ง depends_on เพื่อป้องกันไม่ให้โปรเจกต์พังเพราะแอปฯ หาฐานข้อมูลไม่เจอ

ประโยชน์ที่คุณจะได้รับ (จากโปรเจกต์ mai-app)

ประหยัดเวลา: ไม่ต้องพิมพ์คำสั่ง docker build และ docker run แยกกันหลายๆ รอบ

Infrastructure as Code: ไฟล์ docker-compose.yml เปรียบเสมือนเอกสารประกอบโปรเจกต์ ใครที่ได้ไฟล์นี้ไปจะสามารถรันโปรเจกต์ได้เหมือนคุณเป๊ะๆ

สภาพแวดล้อมที่สะอาด: เมื่อเลิกใช้งาน แค่สั่ง docker compose down ระบบจะเก็บกวาดทังคอนเทนเนอร์และเน็ตเวิร์กที่สร้างขึ้นมาให้เกลี้ยงทันที

สรุป workflow

เขียน Dockerfile ของแต่ละ Service (เช่น Node.js)

เขียน docker-compose.yml เพื่อรวมทุกอย่างเข้าด้วยกัน

รัน docker compose up เพื่อเริ่มระบบทั้งหมด

2/17 แก้ไขแล้ว

... อ่านเพิ่มเติมจากประสบการณ์ส่วนตัวในการใช้ Docker Compose พบว่ามันช่วยลดความซับซ้อนในการจัดการแอปพลิเคชันที่มีหลายคอนเทนเนอร์อย่างมาก เนื่องจากเราสามารถกำหนดบริการต่างๆ ทั้ง Node.js, Nginx, และฐานข้อมูลไว้ในไฟล์ docker-compose.yml เดียว ไม่ต้องรันคำสั่งแยกกันหลายครั้ง ซึ่งสะดวกและรวดเร็วมาก สิ่งที่ประทับใจอย่างหนึ่งคือการใช้คำสั่งเดียว "docker compose up" เพื่อจัดการตั้งแต่การ Build Image สร้างเครือข่ายจำลองให้คอนเทนเนอร์สื่อสารกัน และเริ่มทำงานพร้อมกันอย่างมีลำดับขั้นตอนโดยอัตโนมัติ ทำให้ไม่ต้องมาคอยเริ่มหรือหยุดแต่ละส่วนเอง นอกจากนี้ ความสามารถในการจัดการความสัมพันธ์ระหว่างเซอร์วิส เช่น การใช้ depends_on ทำให้มั่นใจได้ว่าแอปฯ จะไม่พังเพราะหาฐานข้อมูลไม่เจอ ซึ่งเคยเจอปัญหานี้มาก่อนเมื่อต้องรันหลายคอนเทนเนอร์ด้วยคำสั่งปกติ อีกอย่างที่ผมชอบคือแนวคิด Infrastructure as Code ที่ไฟล์ docker-compose.yml ทำหน้าที่เหมือนเอกสารประกอบโปรเจกต์คนอื่นๆ ก็สามารถนำไปรันซ้ำได้เลยโดยไม่ต้องตั้งค่าใหม่ ช่วยเพิ่มความโปร่งใสและลดข้อผิดพลาดในการตั้งค่าสภาพแวดล้อม พอเลิกใช้งานก็ทำความสะอาดได้ง่ายด้วยคำสั่ง docker compose down สำหรับผู้ที่สนใจ เริ่มต้นง่ายๆ ด้วยการเขียน Dockerfile ของแต่ละเซอร์วิส แล้วรวมไฟล์ทุกอย่างไว้ใน docker-compose.yml จากนั้นรันด้วย docker compose up เพียงเท่านี้ก็จัดการระบบ Multi-container ได้อย่างมืออาชีพแล้ว