Skip to main content

ชนิดของ Docker volumes และแนวทางการ Backup ข้อมูล

· 2 min read
Kongvut Sangkla

Intro

สวัสดีครับ บทความจะพูดถึง Docker volumes ที่เหมาะกับคนที่ใช้ Docker และมีความเข้าใจในระดับนึงแล้วนะครับ

ที่จริงช่วงหัด Docker ใหม่ ๆ ก็มีความสงสัยอยู่ว่าชนิดของ Volumes ของ Docker นั้นมีกี่แบบและต่างกันอย่างไร และที่สำคัญคือการสำรองข้อมูล (Backup) ของ Docker volume นั้นต้องทำอย่างไร

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

Imgur

Docker volumes bind mounts

ชนิดของ Dcoker Volumes

ชนิดของ Docker volumes นั้นจะมีอยู่ 3 แบบดังนี้

1. Host volume (host)

Host volume คือการใช้ Storage ของ Host ที่บางทีเรียกว่า Bind mounts เข้ากับ Docker container

  • เป็นการ Mount storage ของ Host เข้าไปทำให้เมื่อ Container มีการ Re-Created หรือ ลบออก ข้อมูล Volume ที่ใช้ Mount ก็จะอยู่ที่เดิมเสมอ
  • การ Backup ข้อมูลในวิธีนี้จะไม่ได้มีความจำเป็นเท่าไหร่ เนื่องเราสามารถสำรองข้อมูล Volume ได้จาก Host โดยตรง (นอกเสียจาก Storage ของฝั่ง Host จะเสียหรือเผลอลบทิ้งเองนะครับ 😅)

2. Container volume (anonymous)

Container volume คือการใช้ Volume ที่อยู่ใน Container

  • ส่วนใหญ่จะเกิดจากการสร้างไฟล์เพื่อใช้ Storage ภายในเมื่อ Build Dockerfile
  • Volume แบบนี้มีทั้งข้อดี - ข้อเสีย โดยข้อดีหลัก ๆ คือไม่ต้อง Mount และไม่ต้องสร้าง Volume ก่อนแต่สามารถใช้พื้นที่ใน Container ได้โดยตรงจึงมีความง่าย และรวดเร็วดี
  • ส่วนข้อเสียคือเนื่องจากเป็นการใช้ Storage ใน Container ดังนั้นเมื่อมีการ Re-created Container หรือลบ Container ข้อมูลที่อยู่ใน Container volume นั้น ๆ ก็จะหายไปด้วย
  • การ Backup ข้อมูลต้องสั่งผ่าน CLI เพื่อ Export ข้อมูลมาไว้ที่ Host

3. Docker volume (named)

Docker volume คือ Volume ที่ต้องสร้างด้วยคำสั่ง docker volume create name_of_volume

  • ประโยชน์จะคล้าย ๆ และความสามาารถจะคล้ายกับรูปแบบ Host volume
  • จะไม่สามารถเข้าถึงไฟล์ใน Docker Volume จาก Host ได้โดยตรง (เช่น การเปิดไฟล์ หรือการไป List ดูว่ามีไฟล์อะไรบ้าง)
  • สามารถ Link เข้ากับ Container กี่อันก็ได้
  • เมื่อมีการ Re-created Container หรือลบ Container ข้อมูลที่อยู่ใน Volume นั้น ๆ ก็จะ ไม่ หายไปด้วย (เพราะว่าเป็นการสร้าง Volume แยก)
  • การ Backup ข้อมูลต้องสั่งผ่าน CLI เพื่อ Export ข้อมูลมาไว้ที่ Host
  • รองรับการสเกลเมื่อขนาดใหญ่ขึ้น เช่น การเชื่อมต่อกับ Storage อื่น ๆ จากภายนอก หรือบน Cloud

ขั้นตอนการ Backup

ขั้นตอนต่อไปนี้จะเป็นการสำรองข้อมูลใน Volume ซึ่งจะสามารถใช้ได้กับ Docker volumes ทุกชนิดสามารถทำได้ดังนี้

Backup เฉพาะอย่าง

ที่จริงวิธีนี้ใช้ได้กับทั้งแบบ Host และ Docker Volume ได้ด้วย แต่วิธีนี้จะเหมาะกับแบบ Container volume (ที่เป็นแปบ anonymous) เพราะข้อมูลอาจจะหายได้ถ้า Container นั้นถูกลบ

ตัวอย่างนี้จะเป็นวิธีการ Backup ฐานข้อมูล SQL ของ MariaDB ใน Container (ที่ใช้ Volume แบบ Container volume) และ Export file ออกมาไว้ที่ Host โดยหลักการคือ

  • ใช้คำสั่ง exec กับ Container ที่ต้องการ
  • จากนั้นเรียกโปรแกรมคำสั่ง (mysqldump) เพื่อรันและสร้างไฟล์สำหรับการ Export
MariaDB Backup
docker exec mariadb_container_name \
/usr/bin/mysqldump -u root --password=1234 \
database_name > database_name_$(date +%Y%m%d).sql

Backup ทั้ง Volume

วิธีนี้เป็นการ Backup ทั้ง Volume จากนั้น Export เป็นไฟล์ .tar ไว้ที่ Host โดยที่

  • ใช้ Image ของ Ubuntu ช่วย (หรือตัวไหนก็ได้ที่สามารถใช้พวกคำสั่งบีบอัดได้)
  • เพิ่มคำสั่ง --rm เมื่อทำงานเสร็จจะลบ Container ของ Ubuntu ทิ้งทันที
Export as a tar archive
docker run --rm -v docker_volume:/mnt \
ubuntu tar cf - -C /mnt . > backup_file_name.tar

สรุป

ก็ถือเป็นแนวทางสำหรับการสำรองข้อมูลใน Docker volume ทุกท่านสามารถพัฒนาต่อยอดคำสั่งด้วยการทำเป็น Schedules (crontab) เพื่อการสำรองข้อมูลตามรอบของเวลา หวังว่าบทความนีจะมีประโยชน์สำหรับท่านที่ผ่านมาเจอครับ 😊

References

Loading...