รู้จักกับ Docker volume
Docker volume คืออะไร
Docker volume คือตัวที่ใช้สำหรับสร้าง persistent storage ที่ docker จะเก็บเอาไว้ (มองง่ายๆเป็นเหมือน disk จำลอง 1 ก้อน)
- จะใช้สำหรับการเชื่อม data ที่อยู่ใน Container ออกมาภายนอก
- โดยปกติ เคสของการ map data ใน Container ออกมาสู่ภายนอกจะมีอยู่ 2 เคส คือ
- map ด้วยการ mount storage จริงในเครื่อ
- map ด้วยการใช้ docker volume
ข้อดีของการใช้ docker volume คือ
- มันจะสามารถ สร้าง persistent storage ขึ้นมาได้ทันทีโดยไม่ต้องหา path ภายนอกเครื่อง (ทำให้ไม่รบกวน path ภายในเครื่อง)
- รวมถึงตอนที่ลบ data สามารถใช้คำสั่ง
docker volume
ในการจัดการได้เลย (เดี๋ยวจะมีการแนะนำเพิ่มเติม)
คำถามคือ แล้วเคสไหนจำเป็นต้อง map data เก็บไว้ คำตอบก็คือ
- เคสที่ต้องมีการเก็บข้อมูลจากฝั่ง user เช่น database ในที่นี่ก็คือ mysql (db) = เราจะเรียก container พวกนี้ว่าเป็นแบบ
stateful
คือ container ที่จะสามารถเปลี่ยนแปลงตาม data ที่เข้ามาได้ - ถ้าเคสที่ไม่มี state ใดๆ (คือ user ไม่สามารถเปลี่ยนแปลงข้อมูลอะไรใน container ได้) = เราจะเรียก container พวกนี้ว่าเป็นแบบ
stateless
คือ container ที่ไม่สามารถเปลี่ยนแปลงตาม data ได้ (state จะเหมือนเดิมเสมอ ไม่เปลี่ยนแปลง)
เราจะมาลองทำ mysql แบบทั้ง 2 เคสกัน
map storage ใน mysql
1. map ด้วยการ mount path
services:
db:
image: mysql:latest
container_name: db
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: tutorial
ports:
- "3306:3306"
volumes:
- /data:/var/lib/mysql
2. map ด้วย docker volume
services:
...
db:
image: mysql:latest
container_name: db
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: tutorial
ports:
- "3306:3306"
volumes:
- mysql_data_test:/var/lib/mysql # เปลี่ยน path เป็น volume ที่เราสร้างไปด้านล่างใน docker-compose
volumes:
mysql_data_test: # กำหนดชื่อ volume ที่ต้องการจะสร้าง
driver: local
หลังจาก run เสร็จลองดู volume ทั้งหมดโดยใช้คำสั่ง docker volume ls
จะเจอ volume ทั้งหมดและเจอชื่อ volume ที่สร้างออกมาได้
ซึ่งไม่ว่าจะใช้วิธีที่ 1, 2 ข้อมูลก็จะไม่หายเหมือนกัน
วิธีการเข้าไปสำรวจใน container
# command
docker exec -it <container name> sh
# example
docker exec -it mysql sh
# ถ้าอันไหน support bash ก็ใช้ bash แทนได้
docker exec -it mysql bash