Docker Compose Volumes
การใช้งาน Volumes ใน Docker Compose
Volumes ใน Docker Compose ใช้สำหรับจัดการการเก็บข้อมูลภายใน Docker containers. Volumes ช่วยให้คุณสามารถเก็บข้อมูลในที่ที่ปลอดภัยและสามารถเข้าถึงได้แม้จะมีการหยุดและเริ่มใหม่ของ container. Volumes ใช้เพื่อเก็บข้อมูลที่ไม่ต้องการให้หายไปเมื่อ container ถูกลบหรือสร้างใหม่ เช่น ฐานข้อมูล, ข้อมูลผู้ใช้, หรือข้อมูลแคชต่างๆ.
การใช้ Volumes ใน Docker Compose
ใน Docker Compose, คุณสามารถกำหนด volumes ในไฟล์ docker-compose.yml ได้ทั้งในระดับบริการ (services) และในระดับการกำหนดค่าของโครงสร้าง (top-level).
การกำหนด Volumes ในไฟล์ docker-compose.yml
ตัวอย่างการใช้ volumes ใน Docker Compose:
version: '3'
services:
app:
image: my-app
volumes:
- mydata:/app/data
networks:
- frontend
volumes:
mydata:
driver: local
ในตัวอย่างนี้:
- เรามีบริการ
appที่เชื่อมต่อกับ volume ชื่อmydata - Volume นี้จะถูกผูกเข้ากับ path
/app/dataภายใน container - เรากำหนด volume
mydataให้ใช้ driverlocalซึ่งเป็น driver ที่ Docker ใช้ในระบบ local โดยค่าเริ่มต้น
การเชื่อมต่อ Volume กับ Container
ใน Docker Compose, คุณสามารถกำหนด volumes ให้เชื่อมต่อกับ path ภายใน container โดยใช้โครงสร้าง volumes ในบริการ (services) ในไฟล์ docker-compose.yml. ตัวอย่างนี้จะแสดงการผูก volume กับ directory ภายใน container:
version: '3'
services:
db:
image: postgres
volumes:
- db-data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: example
volumes:
db-data:
driver: local
ในตัวอย่างนี้:
dbเป็นบริการที่ใช้ภาพpostgres- เราผูก volume
db-dataกับ path/var/lib/postgresql/dataภายใน container เพื่อเก็บข้อมูลฐานข้อมูล db-dataใช้ driverlocalซึ่งเป็นค่ามาตรฐาน
การใช้ Named Volumes
Docker Compose รองรับการใช้ named volumes ซึ่งหมายถึง volume ที่มีชื่อที่คุณกำหนดให้กับมัน. Named volumes จะถูกเก็บและบริหารจัดการโดย Docker.
การสร้างและใช้ Named Volumes
คุณสามารถกำหนดชื่อ volume ให้กับข้อมูลของ container โดยใช้โครงสร้างในระดับ top-level ดังนี้:
version: '3'
services:
web:
image: nginx
volumes:
- web-data:/usr/share/nginx/html
volumes:
web-data:
driver: local
ในตัวอย่างนี้:
web-dataเป็น named volume ที่ Docker จะจัดการให้- Path
/usr/share/nginx/htmlใน container จะผูกกับ volumeweb-dataที่กำหนด
การใช้ Anonymous Volumes
Anonymous Volumes คือ volumes ที่ไม่ระบุชื่อในไฟล์ docker-compose.yml. โดยปกติแล้ว Docker Compose จะสร้าง volume ใหม่เมื่อ container ที่รันไม่ต้องการการเก็บข้อมูลที่เป็น persistent storage.
การใช้ Anonymous Volumes
ตัวอย่างการใช้ anonymous volumes ใน Docker Compose:
version: '3'
services:
app:
image: my-app
volumes:
- /app/data
ในตัวอย่างนี้:
- Docker จะสร้าง anonymous volume โดยอัตโนมัติและผูกกับ path
/app/dataใน container - Anonymous volume จะไม่ถูกตั้งชื่อและจะถูกลบออกเมื่อ container ถูกลบ
การใช้ Bind Mounts
นอกจากการใช้ volumes ที่จัดการโดย Docker แล้ว, คุณยังสามารถใช้ bind mounts เพื่อผูก directory บน host machine กับ container. โดยปกติแล้ว bind mounts ใช้ในกรณีที่ต้องการให้ข้อมูลระหว่าง host และ container เชื่อมโยงกัน.
การใช้ Bind Mounts
ตัวอย่างการใช้ bind mount:
version: '3'
services:
app:
image: my-app
volumes:
- ./data:/app/data
ในตัวอย่างนี้:
- เราผูก directory
./dataบนเครื่องโฮสต์กับ/app/dataใน container - การใช้ bind mount จะทำให้ข้อมูลที่เก็บใน
./dataบนเครื่องโฮสต์สามารถเข้าถึงได้จาก container และสามารถแก้ไขได้จากทั้งสองฝั่ง
การใช้ Volumes ในหลายๆ บริการ
คุณสามารถใช้ volume เดียวกันในหลายๆ บริการ (services) ภายใน Docker Compose ได้ โดยไม่ต้องสร้าง volume หลายๆ ตัว. ตัวอย่างนี้แสดงให้เห็นว่า container web และ app ใช้ volume เดียวกัน:
version: '3'
services:
web:
image: nginx
volumes:
- shared-data:/usr/share/nginx/html
app:
image: my-app
volumes:
- shared-data:/app/data
volumes:
shared-data:
driver: local
ในตัวอย่างนี้:
shared-dataเป็น volume ที่ใช้ในทั้งสองบริการ (webและapp)- Docker Compose จะใช้ volume เดียวกันสำหรับ container ทั้งสอง ซึ่งหมายความว่าข้อมูลใน
/usr/share/nginx/htmlและ/app/dataจะสามารถแชร์กันได้ระหว่าง container ทั้งสอง
การจัดการ Volumes
การดูรายการ Volumes
คุณสามารถใช้คำสั่ง docker volume ls เพื่อดูรายการ volumes ที่มีอยู่ในระบบ Docker:
docker volume ls
การลบ Volumes
หากคุณต้องการลบ volume ที่ไม่ใช้งานแล้ว สามารถใช้คำสั่ง docker volume rm:
docker volume rm volume_name
การลบ Volumes อัตโนมัติเมื่อหยุดการทำงานของ Docker Compose
คุณสามารถตั้งค่าให้ Docker Compose ลบ volumes อัตโนมัติเมื่อหยุดโปรเจกต์ Compose โดยการใช้ --volumes หรือ -v ในคำสั่ง docker-compose down:
docker-compose down -v
คำสั่งนี้จะหยุดบริการทั้งหมดและลบ volumes ที่เกี่ยวข้อง
สรุป
การใช้ volumes ใน Docker Compose เป็นวิธีที่ดีในการจัดการข้อมูลที่ต้องการเก็บถาวรระหว่างการรัน container. Docker Compose รองรับการใช้ named volumes, anonymous volumes, และ bind mounts ซึ่งแต่ละแบบมีลักษณะและการใช้งานที่แตกต่างกัน. นอกจากนี้ยังมีวิธีการจัดการ volumes เช่น การลบ volumes ที่ไม่ใช้งานแล้ว และการแชร์ volumes ระหว่างหลายๆ บริการใน Docker Compose.