Skip to main content

รู้จักกับ Docker volume

Docker volume คืออะไร

Docker volume คือตัวที่ใช้สำหรับสร้าง persistent storage ที่ docker จะเก็บเอาไว้ (มองง่ายๆเป็นเหมือน disk จำลอง 1 ก้อน)

  • จะใช้สำหรับการเชื่อม data ที่อยู่ใน Container ออกมาภายนอก
  • โดยปกติ เคสของการ map data ใน Container ออกมาสู่ภายนอกจะมีอยู่ 2 เคส คือ
  1. map ด้วยการ mount storage จริงในเครื่อ
  2. 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

storage-1

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 ที่สร้างออกมาได้

storage-2

ซึ่งไม่ว่าจะใช้วิธีที่ 1, 2 ข้อมูลก็จะไม่หายเหมือนกัน

วิธีการเข้าไปสำรวจใน container

# command
docker exec -it <container name> sh

# example
docker exec -it mysql sh

# ถ้าอันไหน support bash ก็ใช้ bash แทนได้
docker exec -it mysql bash