ลบ Container, Image และ Volume ที่ไม่ใช้ให้ระบบสะอาด

หนึ่งในปัญหาที่พบบ่อยเมื่อใช้ Docker มาสักระยะคือ Disk เต็มโดยไม่รู้ตัว สาเหตุหลักมาจาก Container ที่หยุดทำงานแล้ว, Image เก่าที่ไม่ได้ใช้, และ Volume ที่ถูกทิ้งไว้ บทความนี้จะสอนวิธีทำความสะอาด Docker อย่างถูกต้อง ทั้งแบบเลือกลบทีละรายการและแบบล้างทุกอย่างในคำสั่งเดียว

ทำไม Docker ถึงกิน Disk เยอะ?

เมื่อคุณทำงานกับ Docker ทุกวัน ระบบจะสะสมข้อมูลที่ไม่จำเป็นเพิ่มขึ้นเรื่อยๆ ได้แก่:

  • Stopped Containers — Container ที่รันเสร็จหรือ crash แล้วแต่ยังไม่ถูกลบ
  • Dangling Images — Image layer เก่าที่ไม่มี tag และไม่มี container อ้างอิง
  • Unused Images — Image ที่ pull มาแต่ไม่ได้ใช้งานแล้ว
  • Unused Volumes — Volume ที่ไม่มี container ใดเชื่อมต่ออยู่
  • Build Cache — Cache จาก docker build ที่สะสมไว้

มาดูคำสั่งสำหรับจัดการแต่ละส่วนกัน

ตรวจสอบ Disk Usage ก่อน

ก่อนลบอะไร ควรดูก่อนว่า Docker ใช้พื้นที่ไปเท่าไร:

docker system df

ผลลัพธ์ตัวอย่าง:

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          12        3         4.2GB     3.1GB (73%)
Containers      5         2         128MB     98MB (76%)
Local Volumes   8         3         2.1GB     1.4GB (66%)
Build Cache     47        0         892MB     892MB

คอลัมน์ RECLAIMABLE บอกว่าสามารถเพิ่มพื้นที่ได้เท่าไรหากลบข้อมูลที่ไม่ใช้ออก

ลบ Container ที่ไม่ใช้

ดู Container ทั้งหมด (รวมที่หยุดแล้ว)

docker ps -a

ลบ Container ที่ระบุ

docker rm <container_id>

ถ้า Container ยังรันอยู่และต้องการบังคับลบ ใช้ -f:

docker rm -f <container_id>

ลบ Container ที่หยุดทำงานทั้งหมดในคำสั่งเดียว

docker container prune

ระบบจะถามยืนยันก่อนลบ หากต้องการข้ามขั้นตอนยืนยันให้เพิ่ม -f:

docker container prune -f

ลบ Image ที่ไม่ใช้

ดู Image ทั้งหมด

docker images

ลบ Image ที่ระบุ

docker rmi <image_id>

ลบหลาย Image พร้อมกัน:

docker rmi <image_id1> <image_id2> <image_id3>

ลบเฉพาะ Dangling Images (Image ไม่มี tag)

docker image prune

ลบ Image ทั้งหมดที่ไม่มี Container ใช้งาน

docker image prune -a

⚠️ คำสั่งนี้จะลบ Image ทุกตัวที่ไม่มี Container รันอยู่ แม้แต่ Image ที่คุณเพิ่ง pull มา ใช้ด้วยความระมัดระวัง

ลบ Volume ที่ไม่ใช้

ดู Volume ทั้งหมด

docker volume ls

ลบ Volume ที่ระบุ

docker volume rm <volume_name>

ลบ Volume ที่ไม่มี Container ใช้งานทั้งหมด

docker volume prune

⚠️ ระวัง! การลบ Volume หมายถึงข้อมูลภายในจะหายไปถาวร ตรวจสอบให้แน่ใจว่าไม่มีข้อมูลสำคัญก่อนลบ

ลบ Network ที่ไม่ใช้

Docker Network ที่ไม่มี Container เชื่อมต่อก็สามารถลบออกได้:

docker network prune

ล้างทุกอย่างในคำสั่งเดียว: docker system prune

ถ้าต้องการล้างทุกอย่างพร้อมกัน Docker มีคำสั่งรวม:

docker system prune

คำสั่งนี้จะลบ:

  • Container ที่หยุดทำงานทั้งหมด
  • Network ที่ไม่มี Container ใช้งาน
  • Dangling Images (Image ไม่มี tag)
  • Build Cache ทั้งหมด

หากต้องการลบ Volume ด้วย ให้เพิ่ม --volumes:

docker system prune --volumes

หากต้องการลบ Image ทุกตัวที่ไม่มี Container ใช้งาน (ไม่ใช่แค่ dangling) ให้เพิ่ม -a:

docker system prune -a

รวมทั้งหมด (ล้างสุดๆ):

docker system prune -a --volumes -f

⚠️ ใช้คำสั่งนี้บนเครื่อง Production ด้วยความระมัดระวังสูงสุด

ลบทุกอย่างแบบ Advanced (สคริปต์)

สำหรับคนที่ต้องการควบคุมได้มากขึ้น สามารถใช้สคริปต์นี้เพื่อลบ Container และ Image ทุกตัว:

# หยุดและลบ Container ทั้งหมด
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)

# ลบ Image ทั้งหมด
docker rmi $(docker images -q)

# ลบ Volume ทั้งหมด
docker volume rm $(docker volume ls -q)

# ลบ Network ที่กำหนดเอง
docker network rm $(docker network ls | grep -v 'bridge\|host\|none' | awk 'NR>1 {print $1}')

⚠️ สคริปต์นี้จะลบ ทุกอย่าง รวมถึง Container ที่กำลังรันอยู่ด้วย ใช้เฉพาะบน Dev/Test Machine เท่านั้น

สรุปคำสั่ง Cleanup ทั้งหมด

สิ่งที่ต้องการลบ คำสั่ง
Container ที่หยุดแล้ว docker container prune
Dangling Images เท่านั้น docker image prune
Image ทั้งหมดที่ไม่ถูกใช้ docker image prune -a
Volume ที่ไม่ถูกใช้ docker volume prune
Network ที่ไม่ถูกใช้ docker network prune
ล้างทุกอย่าง (ยกเว้น Volume) docker system prune
ล้างทุกอย่างรวม Volume docker system prune --volumes
ล้างสุดๆ ไม่ถามยืนยัน docker system prune -a --volumes -f

ตั้ง Cron Job ทำความสะอาดอัตโนมัติ

สำหรับ Server ที่ใช้งาน Docker อยู่ตลอดเวลา แนะนำให้ตั้ง Cron Job ทำความสะอาดโดยอัตโนมัติทุกสัปดาห์:

# เปิด crontab
crontab -e

# เพิ่มบรรทัดนี้เพื่อรันทุกวันอาทิตย์เวลา 02:00 น.
0 2 * * 0 docker system prune -f >> /var/log/docker-cleanup.log 2>&1

คำสั่งนี้จะล้าง Container, Image dangling, Network และ Build Cache โดยไม่ถามยืนยัน และบันทึก log ไว้ที่ /var/log/docker-cleanup.log

สรุป

การทำความสะอาด Docker เป็นงานที่ควรทำสม่ำเสมอ โดยเฉพาะบน Server ที่มีพื้นที่จำกัด คำสั่ง docker system prune เป็นตัวเลือกที่ง่ายและครอบคลุมที่สุด แต่ถ้าต้องการความปลอดภัยมากขึ้น ให้ใช้คำสั่งแบบเลือกลบทีละประเภท เช่น docker container prune, docker image prune และ docker volume prune แทน

บทความถัดไปในซีรีส์ Docker จะพูดถึง Docker Network — การเชื่อมต่อ Container หลายตัวเข้าหากัน รอติดตามได้เลย!