Skip to main content

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 ให้ใช้ driver local ซึ่งเป็น 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 ใช้ driver local ซึ่งเป็นค่ามาตรฐาน

การใช้ 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 จะผูกกับ volume web-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.