Docker Compose คืออะไร? ทำไมโปรแกรมเมอร์มือใหม่ต้องใช้ให้เป็น

9 นาที 21 views บันทึกเป็น PDF
Docker Compose คืออะไร? ทำไมโปรแกรมเมอร์มือใหม่ต้องใช้ให้เป็น

เลิกพิมพ์คำสั่งรันคอนเทนเนอร์ทีละตัว! เรียนรู้วิธีใช้ Docker Compose จัดการโปรเจกต์ซอฟต์แวร์ที่มีหลายส่วนประกอบให้เป็นเรื่องง่ายในไฟล์เดียว

Docker Compose คืออะไร และทำไมคุณถึงต้องรู้จักมัน

หากคุณเพิ่งเริ่มหัดใช้ Docker คุณอาจจะคุ้นเคยกับการสั่ง docker run เพื่อรันคอนเทนเนอร์ทีละตัว ซึ่งก็ดูเหมือนจะดีในตอนแรก แต่เมื่อโปรเจกต์ของคุณเริ่มซับซ้อนขึ้น คุณต้องเริ่มจัดการทั้ง Frontend, Backend, ฐานข้อมูล และเครื่องมือเสริมอย่าง Redis (ระบบเก็บข้อมูลชั่วคราวเพื่อเพิ่มความเร็ว) การพิมพ์คำสั่งยาวๆ ซ้ำไปซ้ำมาทุกครั้งที่เปิดเครื่องคอมพิวเตอร์กลายเป็นฝันร้ายของโปรแกรมเมอร์มือใหม่

ลองนึกภาพว่าคุณกำลังเปิดร้านอาหาร ถ้าคุณต้องเดินไปเปิดเตาแก๊สเอง เปิดตู้เย็นเอง และเตรียมวัตถุดิบแยกกันทีละอย่างในทุกเช้า คุณคงเสียเวลาเป็นชั่วโมง แต่ถ้าคุณมี "สูตรอาหาร" ที่ระบุขั้นตอนทั้งหมดไว้ และเพียงแค่กดปุ่มเดียว ทุกอย่างก็พร้อมทำงานทันที นั่นคือหน้าที่ของ Docker Compose มันคือเครื่องมือที่ช่วยให้คุณนิยามโครงสร้างของแอปพลิเคชันทั้งหมดไว้ในไฟล์เดียว

หลายคนเข้าใจผิดว่ามันคือระบบจัดการขนาดใหญ่ แต่จริงๆ แล้วมันเป็นเพียงตัวช่วยที่จะแปลงไฟล์ตั้งค่าของคุณให้กลายเป็นคำสั่ง Docker ที่ถูกต้องและรวดเร็ว มันเปลี่ยนความวุ่นวายจากการจำคำสั่งจำนวนมาก ให้กลายเป็นความเรียบง่ายด้วยไฟล์ docker-compose.yml ซึ่งช่วยให้ชีวิตของโปรแกรมเมอร์อย่างคุณง่ายขึ้นอย่างมหาศาลในการทำโปรเจกต์จริง

โครงสร้างของไฟล์ docker-compose.yml

หัวใจสำคัญของ Docker Compose คือไฟล์ที่ชื่อว่า docker-compose.yml ซึ่งเป็นไฟล์ประเภท YAML (รูปแบบไฟล์ที่ใช้สำหรับจัดเก็บข้อมูลแบบอ่านง่าย) โดยในไฟล์นี้คุณจะระบุว่าแอปพลิเคชันของคุณประกอบด้วยบริการอะไรบ้าง จะใช้ Image (แม่แบบสำหรับสร้างคอนเทนเนอร์) ตัวไหน และต้องเชื่อมต่อกันอย่างไร

ในการเขียนไฟล์นี้ คุณจะแบ่งส่วนประกอบต่างๆ ออกเป็น services ซึ่งเปรียบเสมือนส่วนประกอบของซอฟต์แวร์ เช่น เว็บไซต์ หรือฐานข้อมูล คุณสามารถกำหนดพอร์ต (จุดเชื่อมต่อสื่อสาร) เพื่อให้เข้าใช้งานผ่านเบราว์เซอร์ได้ รวมถึงกำหนดตัวแปรสภาพแวดล้อม (Environment Variables) เพื่อเก็บค่าสำคัญอย่างรหัสผ่านฐานข้อมูลโดยไม่ต้องเขียนฝังไว้ในโค้ด

เมื่อคุณรันคำสั่ง docker compose up โปรแกรมจะอ่านไฟล์นี้แล้วจัดการสร้างเครือข่าย (Network) ให้คอนเทนเนอร์คุยกันเองได้อัตโนมัติ รวมถึงสร้างพื้นที่เก็บข้อมูลแบบถาวร (Volumes) เพื่อไม่ให้ข้อมูลหายเมื่อคอนเทนเนอร์ถูกปิดลง นี่คือขั้นตอนที่คุณต้องทำความเข้าใจเพื่อเปลี่ยนจากมือใหม่มาเป็นคนที่จัดการโปรเจกต์ระดับมืออาชีพได้

services:
  web:
    build: .             # สั่งให้สร้าง Image จากไฟล์ Dockerfile ในโฟลเดอร์นี้
    ports:
      - "8080:80"        # เชื่อมพอร์ต 8080 ของเครื่องเรา เข้ากับพอร์ต 80 ของคอนเทนเนอร์
    environment:
      - DB_HOST=db       # กำหนดชื่อโฮสต์ของฐานข้อมูลให้แอปฯ รู้จัก
  db:
    image: postgres:15   # ดึง Image ฐานข้อมูล PostgreSQL เวอร์ชัน 15 มาใช้
    volumes:
      - postgres_data:/var/lib/postgresql/data # บันทึกข้อมูลฐานข้อมูลไว้ที่เครื่องเรา
volumes:
  postgres_data:         # ประกาศพื้นที่เก็บข้อมูล

ความเข้าใจผิดที่ใหญ่ที่สุด: depends_on ไม่ใช่ยาวิเศษ

มือใหม่หลายคนมักจะเข้าใจผิดว่าคำสั่ง depends_on ใน Docker Compose คือการสั่งให้ฐานข้อมูล "พร้อมใช้งาน" ก่อนแล้วแอปฯ ถึงจะเริ่มทำงาน แต่ในความเป็นจริงมันหมายถึงแค่ว่า "คอนเทนเนอร์ฐานข้อมูลถูกสั่งให้เริ่มทำงานแล้ว" เท่านั้น ซึ่งไม่ได้การันตีว่าฐานข้อมูลข้างในจะเปิดตัวเสร็จสมบูรณ์

ลองนึกภาพว่าคุณสั่งให้ลูกน้องไปเตรียมครัว (ฐานข้อมูล) และทำอาหาร (แอปพลิเคชัน) พร้อมกัน depends_on คือการสั่งให้ลูกน้องเริ่มเดินเข้าครัว แต่ไม่ได้แปลว่าเขาหั่นผักเสร็จแล้ว ถ้าคุณสั่งให้เขาทำอาหารทันทีที่เดินเข้าครัว แอปพลิเคชันของคุณก็จะพังเพราะฐานข้อมูลยังตั้งค่าไม่เสร็จ นี่คือจุดที่ทำให้โปรแกรมเมอร์หลายคนงงว่าทำไมโค้ดถึงแจ้งเตือนว่า "เชื่อมต่อฐานข้อมูลไม่ได้" ทั้งที่รัน Docker ขึ้นมาแล้ว

วิธีแก้ปัญหาที่ดีที่สุดคือการเขียนโค้ดในแอปพลิเคชันของคุณให้มีระบบ Retry (การพยายามเชื่อมต่อใหม่ซ้ำๆ) หรือใช้การตรวจสอบสถานะที่เรียกว่า Health Check เพื่อเช็คว่าฐานข้อมูลพร้อมรับคำสั่งจริงๆ หรือยัง อย่าพึ่งพาแค่โครงสร้างของ Compose เพียงอย่างเดียวในการจัดการเรื่องความพร้อมของระบบ เพราะความผิดพลาดในการเชื่อมต่อเป็นเรื่องปกติที่โปรแกรมเมอร์ต้องรับมือ

ฟีเจอร์สมัยใหม่ที่โปรแกรมเมอร์ยุคใหม่ต้องใช้

ในเวอร์ชันปัจจุบัน Docker Compose V2 ได้เพิ่มฟีเจอร์ที่ช่วยให้การพัฒนาซอฟต์แวร์รวดเร็วขึ้นมาก โดยเฉพาะฟีเจอร์ profiles ที่ช่วยให้คุณเลือกเปิดใช้งานบริการบางอย่างเฉพาะตอนที่ต้องการ เช่น คุณอาจมีฐานข้อมูล Redis ที่ใช้เฉพาะตอนทำ Testing แต่ไม่อยากให้มันรันตลอดเวลาตอนเขียนโค้ดปกติ

นอกจากนี้ยังมีฟีเจอร์ที่ชื่อว่า watch ซึ่งเป็นสิ่งที่ยอดเยี่ยมมากสำหรับนักพัฒนา แทนที่คุณจะต้องมานั่งสั่ง build ใหม่ทุกครั้งที่แก้โค้ดเพียงบรรทัดเดียว Docker Compose จะคอยเฝ้าดูไฟล์ในเครื่องคุณ และทำการอัปเดตไฟล์ในคอนเทนเนอร์ให้โดยอัตโนมัติ ทำให้คุณเห็นผลลัพธ์การเปลี่ยนแปลงได้ทันทีโดยไม่ต้องเสียเวลารอ

การใช้ฟีเจอร์เหล่านี้จะช่วยให้คุณทำงานได้เหมือนมือโปรมากขึ้น คุณไม่จำเป็นต้องเปิดคอนเทนเนอร์ทุกตัวพร้อมกันจนเครื่องค้าง แต่สามารถเลือกเปิดเฉพาะส่วนที่จำเป็นและใช้เครื่องมือช่วยซิงค์ไฟล์เพื่อประหยัดเวลา สิ่งเหล่านี้คือทักษะที่แยกความแตกต่างระหว่าง "คนที่รันเป็น" กับ "คนที่ใช้งานเครื่องมืออย่างมีประสิทธิภาพ"

# ตัวอย่างการใช้ฟีเจอร์ Watch เพื่ออัปเดตโค้ดอัตโนมัติ
develop:
  watch:
    - action: sync
      path: ./src
      target: /app/src
# สั่งรันด้วยคำสั่ง: docker compose watch

ข้อควรระวังสำหรับผู้เริ่มต้น

สิ่งสำคัญที่ต้องจำไว้เสมอคือ Docker Compose ไม่ใช่เครื่องมือสำหรับทำ Orchestration (การจัดการระบบขนาดใหญ่) มันไม่ได้ออกแบบมาเพื่อดูแลคอนเทนเนอร์หลายร้อยตัวบนเซิร์ฟเวอร์หลายเครื่องพร้อมกัน หากคุณพยายามนำมันไปใช้ในระดับ Production ที่มีความซับซ้อนสูง คุณอาจพบปัญหาเรื่องการขยายระบบหรือการกู้คืนตัวเองเมื่อระบบล่ม

อีกจุดที่มือใหม่มักพลาดคือการลืมจัดการกับ Volumes ข้อมูลในคอนเทนเนอร์จะหายไปเสมอเมื่อคุณลบมันทิ้ง ถ้าคุณไม่ระบุ Volume ไว้ ข้อมูลสำคัญในฐานข้อมูลของคุณจะหายไปทั้งหมดทันทีที่ปิดคอนเทนเนอร์ จงสร้างนิสัยในการสำรองข้อมูลหรือระบุที่เก็บข้อมูลแบบถาวรเสมอในไฟล์ docker-compose.yml ของคุณ

สุดท้าย อย่าพยายามใส่ทุกอย่างลงในคอนเทนเนอร์เดียว Docker ถูกออกแบบมาให้เน้นเรื่องความแยกส่วน คุณควรแยก Frontend, Backend และ Database ออกจากกันอย่างชัดเจน เพื่อให้ง่ายต่อการดูแลรักษาและการขยายผลในอนาคต การทำตามแนวทางนี้จะช่วยให้คุณกลายเป็นโปรแกรมเมอร์ที่มีวินัยและเขียนโค้ดที่ดูแลรักษาง่าย

สรุป: เปลี่ยนจากความวุ่นวายสู่การทำงานแบบมืออาชีพ

การเข้าใจ Docker Compose จะเปลี่ยนชีวิตการเขียนโปรแกรมของคุณไปอย่างสิ้นเชิง จากเดิมที่ต้องจำคำสั่ง docker run ยาวๆ หรือเปิดคอนเทนเนอร์ทีละตัวจนสับสน คุณจะสามารถรันทั้งระบบได้ด้วยคำสั่งเดียวคือ docker compose up ซึ่งจะสร้างสภาพแวดล้อมที่เหมือนกันทุกครั้ง ไม่ว่าจะเป็นในเครื่องของคุณเองหรือในเครื่องของเพื่อนร่วมทีม

ลองนำไปใช้จริงในโปรเจกต์ถัดไปของคุณดูครับ ไม่ว่าจะเป็นโปรเจกต์เว็บแอปพลิเคชันง่ายๆ ที่มีแค่หน้าเว็บกับฐานข้อมูล ให้ลองเขียนไฟล์ docker-compose.yml ขึ้นมาสักไฟล์ กำหนด Service ให้ครบ แล้วลองรันดู ผลลัพธ์ที่คุณจะได้รับคือความภูมิใจที่เห็นระบบทั้งหมดทำงานประสานกันได้โดยไม่ต้องคอยแก้ปัญหาจุกจิกเรื่องการเชื่อมต่อ

การเป็นโปรแกรมเมอร์ที่เก่งไม่ได้วัดกันที่จำนวนโค้ดที่เขียน แต่คือการใช้เครื่องมือที่มีอยู่ให้เกิดประโยชน์สูงสุด Docker Compose เป็นเพียงหนึ่งในเครื่องมือที่คุณต้องมีติดตัวไว้ หากคุณเริ่มจากพื้นฐานที่ถูกต้องและเข้าใจกลไกการทำงานของมัน คุณจะสามารถก้าวข้ามผ่านความยากลำบากในช่วงเริ่มต้นไปสู่การเป็นนักพัฒนาที่พร้อมรับมือกับงานจริงได้อย่างแน่นอน


ที่มา: Docker Compose Isn't What I Thought It Was — DEV Community

แชร์บทความ

Facebook X LINE

บทความที่เกี่ยวข้อง

จัดการเซิร์ฟเวอร์ผ่าน VS Code ให้ง่ายขึ้นด้วย Easy SSH พร้อมฟีเจอร์โหลดไฟล์ผ่านคลิกเดียว

จัดการเซิร์ฟเวอร์ผ่าน VS Code ให้ง่ายขึ้นด้วย Easy SSH พร้อมฟีเจอร์โหลดไฟล์ผ่านคลิกเดียว

เบื่อไหมที่ต้องสลับหน้าจอไปมาเพื่อจัดการเซิร์ฟเวอร์? มาลองใช้ Easy SSH ปลั๊กอิน VS Code ที่ช่วยให้คุณรีโมทผ่าน Terminal ได้สะดวก แถมโหลดไฟล์ได้ง่ายแค่กด Ctrl+click

ที่มา: DEV Community

1 hour ago 11 นาที
2 views
วิธีดึงข้อมูลราคาจาก Google Hotels ด้วย API สำหรับนักพัฒนา

วิธีดึงข้อมูลราคาจาก Google Hotels ด้วย API สำหรับนักพัฒนา

อยากทำแอปท่องเที่ยวแต่ดึงข้อมูลราคาจาก Google Hotels ไม่ได้? มาดูวิธีใช้ Apify Actor ช่วยดึงข้อมูลแบบอัตโนมัติด้วย Python ง่ายๆ ไม่ต้องกลัวเว็บพัง

ที่มา: DEV Community

5 hours ago 8 นาที
3 views
วิธีเช็กความพร้อมโปรเจกต์ก่อนปล่อยงานจริงด้วย ReleaseReady

วิธีเช็กความพร้อมโปรเจกต์ก่อนปล่อยงานจริงด้วย ReleaseReady

เคยไหม? โค้ดรันได้ในเครื่องแต่พอปล่อยจริงกลับพัง! มาดูวิธีตรวจสอบความพร้อมของโปรเจกต์ก่อนอัปขึ้น GitHub ด้วยเครื่องมือ ReleaseReady กัน

ที่มา: DEV Community

9 hours ago 9 นาที
4 views