Skip to main content

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

Kongvut Sangkla
Tags:

Intro

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

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

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

Docker volume bind mount

Docker volumes bind mounts

ชนิดของ Docker Volumes

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

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

  • ส่วนใหญ่จะเกิดจากการสร้างไฟล์ใน 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

4. Tempfs volume (temporary)

tmpfs volume คือ การ Mounts container กับ Memory (RAM) ของ Host

  • ถ้าใช้ Docker บน Linux จะสามารถ mounts volume ประเภทนี้ได้
  • tmpfs เป็นการ Mounts แบบ Temporary กับ Host memory (RAM) ข้อดีคือมีความเร็วสูงมาก
  • เนื่องจากเป็นการ Mounts แบบ Temporary ถ้ามีการ Restart Stop หรือ Remove Container ข้อมูลที่อยู่บน tmpfs จะถูกลบไปด้วย
  • ไม่สามารถแชร์ tmpfs mounts ระหว่าง Containers อื่น ๆ หรือใช้ร่วมกันได้

ขั้นตอนการ Backup

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

Backup เฉพาะอย่าง

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

แต่ที่จริงวิธีนี้ก็ใช้ได้กับทั้งแบบ Host และ Docker Volume ได้ด้วยเช่นกัน ขึ้นอยู่กับว่าจะใช้คำสั่ง Backup กับอะไร

ตัวอย่างนี้จะเป็นวิธีการ 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...