หนึ่งในปัญหาที่พบบ่อยเมื่อใช้ 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 หลายตัวเข้าหากัน รอติดตามได้เลย!

