ข้ามไปยังเนื้อหา

นโยบาย Restart และการ Inspect

โดยค่าเริ่มต้น container ที่หยุดหรือ crash จะอยู่ในสถานะหยุด นโยบาย restart บอก Docker ว่าเมื่อใดควรรีสตาร์ทอัตโนมัติ

นโยบายพฤติกรรม
noไม่รีสตาร์ทเลย (ค่าเริ่มต้น)
alwaysรีสตาร์ทเสมอ แม้แต่หลัง docker stop ด้วยตนเอง เริ่มต้นเมื่อ Docker daemon boot
unless-stoppedรีสตาร์ทอัตโนมัติ แต่ไม่รีสตาร์ทถ้าคุณหยุดด้วยตนเอง เริ่มต้นเมื่อ daemon boot เว้นแต่ถูกหยุดไว้
on-failure[:N]รีสตาร์ทเฉพาะเมื่อ exit code ไม่ใช่ศูนย์ มี retry count สูงสุดเป็น optional
Terminal window
# แนะนำสำหรับ service ที่ต้องทำงานต่อเนื่อง
docker run -d --restart unless-stopped nginx:alpine
# รีสตาร์ทสูงสุด 5 ครั้งเมื่อเกิดข้อผิดพลาด
docker run -d --restart on-failure:5 myworker:latest

docker inspect คืนค่า JSON configuration ทั้งหมดของ container — network settings, mounts, ตัวแปร environment, นโยบาย restart, และอื่นๆ:

Terminal window
docker inspect webserver

ใช้ --format พร้อม Go template syntax เพื่อดึงข้อมูลเฉพาะ field:

Terminal window
# รับ IP address ของ container
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' webserver
# รับนโยบาย restart
docker inspect --format '{{.HostConfig.RestartPolicy.Name}}' webserver

docker stats แสดงตารางที่อัปเดตแบบ live ของ CPU, memory, network I/O, และ disk I/O สำหรับ container ที่กำลังทำงาน:

Terminal window
# container ทั้งหมดที่กำลังทำงาน
docker stats
# container เฉพาะ, snapshot เดียว (ไม่ update แบบ live)
docker stats --no-stream webserver
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
a1b2c3d4e5f6 webserver 0.1% 5.2MiB / 7.62GiB 0.07% 1.2kB / 648B 0B / 0B

Container สามารถใช้ memory และ CPU ทั้งหมดที่มีได้ถ้าไม่กำหนดขีดจำกัด ตั้งค่าขีดจำกัดตอนรัน:

Terminal window
docker run -d \
--name limited \
--memory 256m \
--cpus 0.5 \
nginx:alpine
  • --memory 256m — จำกัด memory สูงสุด (container จะถูก OOM-kill ถ้าเกินนี้)
  • --cpus 0.5 — อนุญาตให้ container ใช้ CPU core ได้ครึ่งหนึ่ง

ยืนยันว่าขีดจำกัดถูกนำไปใช้:

Terminal window
docker inspect --format '{{.HostConfig.Memory}}' limited
# 268435456 (256 * 1024 * 1024 bytes)
# 1. Run nginx with a restart policy
docker run -d --name webserver --restart unless-stopped nginx:alpine

# 2. Inspect the full config (JSON)
docker inspect webserver | head -60

# 3. Extract just the restart policy
docker inspect --format '{{.HostConfig.RestartPolicy.Name}}' webserver

# 4. Live stats (one snapshot)
docker stats --no-stream webserver

# 5. Run a memory-limited container
docker run -d --name limited --memory 128m --cpus 0.25 nginx:alpine

# 6. Confirm the memory limit
docker inspect --format '{{.HostConfig.Memory}}' limited

# 7. Clean up
docker stop webserver limited && docker rm webserver limited
ตัวเลือกBenefitCost
--restart alwaysauto-heal container ที่ crash โดยไม่ต้องมีคนคอยดู รอดจาก host reboot เสมอซ่อน crash loop ไว้ — container ที่ตายซ้ำๆ ดูเหมือน “ทำงานปกติ” เพราะ Docker รีสตาร์ทให้ตลอด
--restart on-failure:Nจำกัดจำนวนครั้ง ป้องกัน infinite restart loop สังเกตปัญหาได้เร็วกว่าเพราะสุดท้ายจะหยุดถ้าตั้ง N ต่ำไป container อาจหยุดถาวรก่อนที่ปัญหาจริง (เช่น dependency ยังไม่พร้อม) จะถูกแก้
  • ตั้ง --restart always แล้วไม่เคยเช็ค docker logs เลย ทำให้ไม่รู้ว่า container วนลูป crash-restart อยู่เบื้องหลัง
  • docker restart ทันทีที่ container มีปัญหา โดยไม่ดู exit code จาก docker inspect --format '{{.State.ExitCode}}' ก่อน ทำให้แก้ปัญหาผิดจุด
  • ไม่ตั้งค่า --memory/--cpus เลย ปล่อยให้ container เดียวกิน resource จน host หรือ container ตัวอื่นล่มตามไปด้วย

💡 ตัวอย่างจากของจริง

Kubernetes ต่อยอดแนวคิด --restart ของ Docker เป็น restartPolicy (Always/OnFailure/Never) บวกกับ livenessProbe ที่คอย health check เป็นระยะ ถ้า container ไม่ตอบสนอง Kubernetes จะ kill แล้ว restart ให้อัตโนมัติ — เป็นภาพขยายของสิ่งที่ Docker ทำในเครื่องเดียว ไปสู่ระดับ cluster

นโยบาย restart ใดเริ่ม container อัตโนมัติหลัง host reboot แต่ยอมรับ 'docker stop' ด้วยตนเอง?
'docker stats --no-stream' ทำหน้าที่อะไร?
เกิดอะไรขึ้นเมื่อ container เกินขีดจำกัด --memory?
คำสั่งใดแสดง JSON configuration ทั้งหมดของ container ที่กำลังทำงาน?