跳到主要内容

เนื้อหาภาษาไทย / 泰语内容

系统指南 内容已审核

Volumes: จัดการข้อมูลแบบ Persistent ใน Docker

บทความนี้กล่าวถึง Volumes ซึ่งเป็นกลไกสำคัญในการจัดการข้อมูลแบบ Persistent ใน Docker เพื่อให้ข้อมูลคงอยู่แม้ Container จะถูกลบไปแล้ว โดย Volumes มี 3 ประเภทหลัก...

Volumes: จัดการข้อมูลแบบ Persistent ใน Docker

ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับ Docker Compose ซึ่งช่วยให้เราจัดการ Multi-Container Application ได้อย่างง่ายดาย แต่สิ่งที่สำคัญไม่แพ้กันในการใช้งาน Docker คือการจัดการข้อมูลแบบ Persistent หรือข้อมูลที่ต้องคงอยู่แม้ Container จะถูกลบไปแล้ว ซึ่ง Volumes คือคำตอบสำหรับเรื่องนี้

เมื่อ Container ถูกสร้างขึ้น ข้อมูลทั้งหมดที่อยู่ใน Container จะหายไปเมื่อ Container ถูกลบ นั่นหมายความว่าถ้าเราเก็บข้อมูลสำคัญ เช่น ฐานข้อมูล, ไฟล์อัพโหลดของผู้ใช้ หรือไฟล์ Log ไว้ใน Container โดยตรง ข้อมูลเหล่านั้นก็จะหายไปด้วย

Volumes ช่วยแก้ปัญหานี้ โดยการสร้างพื้นที่เก็บข้อมูลที่แยกออกมาจาก Container เมื่อ Container ถูกลบ ข้อมูลใน Volumes จะยังคงอยู่ และสามารถนำไปใช้กับ Container ตัวใหม่ได้

ทำไมต้องใช้ Volumes?

การใช้ Volumes มีข้อดีหลายอย่าง:

  • Data Persistence: ข้อมูลจะยังคงอยู่แม้ Container จะถูกลบ
  • Data Sharing: สามารถแชร์ข้อมูลระหว่าง Container หลายๆ Container ได้
  • Data Backup and Restore: สามารถสำรองข้อมูลใน Volumes และกู้คืนได้ง่าย
  • Improved Performance: Volumes มักจะเร็วกว่าการเขียนข้อมูลลงใน Container Layer โดยตรง

มี Volumes อยู่ 3 ประเภทหลักๆ ที่เราจะมาเรียนรู้กัน:

  • Bind Mounts
  • Named Volumes
  • Anonymous Volumes

Bind Mounts

Bind Mounts คือการเชื่อมต่อไฟล์หรือไดเรกทอรีบน Host Machine (เครื่องที่เราติดตั้ง Docker) เข้ากับไดเรกทอรีใน Container โดยตรง พูดง่ายๆ คือเป็นการ "ผูก" ไดเรกทอรีบนเครื่องเราเข้ากับไดเรกทอรีใน Container

ข้อดี:

  • ใช้งานง่าย
  • เหมาะสำหรับการพัฒนา เพราะสามารถแก้ไขไฟล์บน Host Machine แล้วการเปลี่ยนแปลงจะสะท้อนไปยัง Container ทันที

ข้อเสีย:

  • ขึ้นอยู่กับโครงสร้างไฟล์บน Host Machine ถ้าโครงสร้างไฟล์บน Host Machine เปลี่ยนแปลง อาจทำให้ Container ทำงานผิดพลาด
  • ไม่ Portable เพราะต้องกำหนด Path บน Host Machine ที่เจาะจง

ตัวอย่างการใช้งาน Bind Mounts ใน Docker Compose:

version: "3.9"
services:
  web:
    image: php:8.1-apache
    ports:
      - "80:80"
    volumes:
      - ./src:/var/www/html

ในตัวอย่างนี้ เรา Bind Mount ไดเรกทอรี ./src บน Host Machine เข้ากับไดเรกทอรี /var/www/html ใน Container นั่นหมายความว่าไฟล์ทั้งหมดใน ./src จะถูกมองเห็นใน /var/www/html ใน Container และถ้าเราแก้ไขไฟล์ใน ./src การเปลี่ยนแปลงจะเกิดขึ้นใน Container ทันที

ข้อควรระวัง: Bind Mounts มีความเสี่ยงด้านความปลอดภัย ถ้า Container สามารถเข้าถึงไดเรกทอรีสำคัญบน Host Machine ได้ อาจทำให้ Container สามารถแก้ไขหรือลบไฟล์สำคัญได้ ดังนั้นควรระมัดระวังในการเลือกไดเรกทอรีที่จะ Bind Mount

Named Volumes

Named Volumes คือ Volumes ที่ Docker สร้างและจัดการให้เรา โดย Docker จะเก็บข้อมูลของ Volumes ไว้ในไดเรกทอรีที่ Docker กำหนด (ส่วนใหญ่จะเป็น /var/lib/docker/volumes/)

ข้อดี:

  • Docker จัดการให้ทั้งหมด ทำให้ง่ายต่อการใช้งาน
  • Portable เพราะไม่ขึ้นอยู่กับโครงสร้างไฟล์บน Host Machine
  • ปลอดภัยกว่า Bind Mounts เพราะ Docker ควบคุมการเข้าถึง Volumes

ข้อเสีย:

  • อาจจะยากกว่าในการเข้าถึงไฟล์ใน Volumes โดยตรง (ต้องใช้คำสั่ง docker inspect เพื่อหา Path)

ตัวอย่างการใช้งาน Named Volumes ใน Docker Compose:

version: "3.9"
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

ในตัวอย่างนี้ เราสร้าง Named Volume ชื่อ db_data และ Mount เข้ากับไดเรกทอรี /var/lib/mysql ใน Container ของ MySQL นั่นหมายความว่าข้อมูลทั้งหมดที่ MySQL เขียนลงใน /var/lib/mysql จะถูกเก็บไว้ใน db_data Volume และจะยังคงอยู่แม้ Container จะถูกลบ

เราสามารถใช้ Named Volumes กับ Container อื่นๆ ได้ด้วย เช่น ถ้าเรามี Container สำหรับ Adminer เราสามารถ Mount db_data Volume เข้าไปใน Container นั้นได้ เพื่อให้ Adminer สามารถเข้าถึงข้อมูลในฐานข้อมูลได้

Anonymous Volumes

Anonymous Volumes คือ Volumes ที่คล้ายกับ Named Volumes แต่ไม่มีชื่อ Docker จะสร้างชื่อให้แบบสุ่ม (Random) และเมื่อ Container ที่ใช้ Anonymous Volume ถูกลบ Volume นั้นก็จะถูกลบไปด้วย (ถ้าไม่มี Container อื่นใช้งานอยู่)

ข้อดี:

  • Docker จัดการให้ทั้งหมด
  • เหมาะสำหรับข้อมูลที่ไม่สำคัญมากนัก และไม่จำเป็นต้องเก็บไว้นาน

ข้อเสีย:

  • ยากต่อการจัดการ เพราะไม่มีชื่อที่ชัดเจน
  • ข้อมูลอาจสูญหายได้ง่าย ถ้า Container ที่ใช้ Volume นั้นถูกลบ

ตัวอย่างการใช้งาน Anonymous Volumes ใน Docker Compose:

version: "3.9"
services:
  web:
    image: php:8.1-apache
    ports:
      - "80:80"
    volumes:
      - /var/log/apache2

ในตัวอย่างนี้ เรา Mount Anonymous Volume เข้ากับไดเรกทอรี /var/log/apache2 ใน Container ของ Apache นั่นหมายความว่า Log ของ Apache จะถูกเก็บไว้ใน Anonymous Volume และจะยังคงอยู่ตราบเท่าที่ Container ยังทำงานอยู่ หรือมี Container อื่นใช้งาน Volume นี้อยู่

Trade-offs และแนวปฏิบัติที่ดี

  • เลือกใช้ Named Volumes เป็นหลัก: Named Volumes เป็นตัวเลือกที่ดีที่สุดสำหรับการจัดการข้อมูลแบบ Persistent เพราะ Docker จัดการให้ทั้งหมด และมีความปลอดภัยมากกว่า Bind Mounts
  • ใช้ Bind Mounts เฉพาะตอนพัฒนา: Bind Mounts เหมาะสำหรับการพัฒนา เพราะสามารถแก้ไขไฟล์บน Host Machine แล้วการเปลี่ยนแปลงจะสะท้อนไปยัง Container ทันที แต่ควรระมัดระวังเรื่องความปลอดภัย
  • หลีกเลี่ยงการใช้ Anonymous Volumes: Anonymous Volumes ยากต่อการจัดการ และข้อมูลอาจสูญหายได้ง่าย ควรใช้ Named Volumes แทน
  • สำรองข้อมูลใน Volumes: ข้อมูลใน Volumes ก็เหมือนข้อมูลอื่นๆ ที่ต้องมีการสำรองข้อมูล ควรมีกระบวนการสำรองข้อมูลใน Volumes เป็นประจำ เพื่อป้องกันข้อมูลสูญหาย

Volumes เป็นเครื่องมือที่สำคัญในการจัดการข้อมูลแบบ Persistent ใน Docker การเข้าใจวิธีการใช้งาน Volumes จะช่วยให้เราสร้างแอปพลิเคชันที่ Robust และ Reliable มากยิ่งขึ้น ในบทต่อไป เราจะมาเรียนรู้เกี่ยวกับ Networks ซึ่งจะช่วยให้เราเชื่อมต่อ Container ต่างๆ ใน Docker เข้าด้วยกัน

Office.in.th Custom Service

想基于此结构开发或定制系统?

Office.in.th 承接企业级 Web Application、API Integration 以及政府/企业管理系统的设计与开发,并提供长期支持。

查看软件开发服务