นโยบาย Restart และการ Inspect
นโยบาย restart
หัวข้อที่มีชื่อว่า “นโยบาย restart”โดยค่าเริ่มต้น container ที่หยุดหรือ crash จะอยู่ในสถานะหยุด นโยบาย restart บอก Docker ว่าเมื่อใดควรรีสตาร์ทอัตโนมัติ
| นโยบาย | พฤติกรรม |
|---|---|
no | ไม่รีสตาร์ทเลย (ค่าเริ่มต้น) |
always | รีสตาร์ทเสมอ แม้แต่หลัง docker stop ด้วยตนเอง เริ่มต้นเมื่อ Docker daemon boot |
unless-stopped | รีสตาร์ทอัตโนมัติ แต่ไม่รีสตาร์ทถ้าคุณหยุดด้วยตนเอง เริ่มต้นเมื่อ daemon boot เว้นแต่ถูกหยุดไว้ |
on-failure[:N] | รีสตาร์ทเฉพาะเมื่อ exit code ไม่ใช่ศูนย์ มี retry count สูงสุดเป็น optional |
# แนะนำสำหรับ service ที่ต้องทำงานต่อเนื่องdocker run -d --restart unless-stopped nginx:alpine
# รีสตาร์ทสูงสุด 5 ครั้งเมื่อเกิดข้อผิดพลาดdocker run -d --restart on-failure:5 myworker:latestการ inspect container
หัวข้อที่มีชื่อว่า “การ inspect container”docker inspect คืนค่า JSON configuration ทั้งหมดของ container — network settings, mounts, ตัวแปร environment, นโยบาย restart, และอื่นๆ:
docker inspect webserverใช้ --format พร้อม Go template syntax เพื่อดึงข้อมูลเฉพาะ field:
# รับ IP address ของ containerdocker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' webserver
# รับนโยบาย restartdocker inspect --format '{{.HostConfig.RestartPolicy.Name}}' webserverการติดตาม resource แบบ live ด้วย docker stats
หัวข้อที่มีชื่อว่า “การติดตาม resource แบบ live ด้วย docker stats”docker stats แสดงตารางที่อัปเดตแบบ live ของ CPU, memory, network I/O, และ disk I/O สำหรับ container ที่กำลังทำงาน:
# container ทั้งหมดที่กำลังทำงานdocker stats
# container เฉพาะ, snapshot เดียว (ไม่ update แบบ live)docker stats --no-stream webserverCONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/Oa1b2c3d4e5f6 webserver 0.1% 5.2MiB / 7.62GiB 0.07% 1.2kB / 648B 0B / 0Bการจำกัด resource
หัวข้อที่มีชื่อว่า “การจำกัด resource”Container สามารถใช้ memory และ CPU ทั้งหมดที่มีได้ถ้าไม่กำหนดขีดจำกัด ตั้งค่าขีดจำกัดตอนรัน:
docker run -d \ --name limited \ --memory 256m \ --cpus 0.5 \ nginx:alpine--memory 256m— จำกัด memory สูงสุด (container จะถูก OOM-kill ถ้าเกินนี้)--cpus 0.5— อนุญาตให้ container ใช้ CPU core ได้ครึ่งหนึ่ง
ยืนยันว่าขีดจำกัดถูกนำไปใช้:
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ข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
--restart always | auto-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