ชนิดของ Docker volumes และแนวทางการ Backup ข้อมูล
Table of contents
Intro
สวัสดีครับ บทความจะพูดถึง Docker volumes ที่เหมาะกับคนที่ใช้ Docker และมีความเข้าใจในระดับนึงแล้วนะครับ
ที่จริงช่วงหัด Docker ใหม่ ๆ ก็มีความสงสัยอยู่ว่าชนิดของ Volumes ของ Docker นั้นมีกี่แบบและต่างกันอย่างไร และที่สำคัญคือการสำรองข้อมูล (Backup) ของ Docker volume นั้นต้องทำอย่างไร
ดังนั้นบทความนี้เป็นการรวบรวมเหมือนสรุป และเป็นการเขียนเอาไว้เผื่อให้ตัวเองเข้ามาดูในอนาคตด้วย 😊
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
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 ทิ้งทันที
docker run --rm -v docker_volume:/mnt \
ubuntu tar cf - -C /mnt . > backup_file_name.tar
สรุป
ก็ถือเป็นแนวทางสำหรับการสำรองข้อมูลใน Docker volume ทุกท่านสามารถพัฒนาต่อยอดคำสั่งด้วยการทำเป็น Schedules (crontab) เพื่อการสำรองข้อมูลตามรอบของเวลา หวังว่าบทความนีจะมีประโยชน์สำหรับท่านที่ผ่านมาเจอครับ 😊