Tag Archive unless-stopped

Byphunsanit

Docker: container restart policy

Docker container จะมี restart policy ให้ใช้อยู่ในการ restart container ใหม่ ถ้า Crash, restart, Manual stop, daemon restart


restart policy

PolicyCrash → restart?Daemon restart → restart?Manual stop แล้ว daemon restart → restart?เหมาะกับ
no (default)ไม่ไม่ไม่ทดสอบ, dev ชั่วคราว
on-failureเฉพาะ exit ≠ 0ไม่ไม่งานที่ crash = ปัญหาจริง
alwaysใช่ทุกกรณีใช่ใช่ (แม้ stop ด้วยมือก็ restart ตาม)บริการต้อง up เสมอ ไม่สนใจ manual stop
unless-stoppedใช่ทุกกรณีใช่ไม่ (respect การ stop ด้วยมือ)Production ทั่วไป (แนะนำมากสุด)

— –restart=unless-stopped

— –restart=unless-stopped เป็น restart policy ที่คนนิยมใช้มากที่สุดสำหรับ production หรือบริการที่ต้องการความเสถียรสูง แต่ไม่อยากให้มัน “ดื้อ” เกินไป นี่คือผลกระทบหลัก ๆ และพฤติกรรมที่เกิดขึ้นจริง

  • Container จะ restart อัตโนมัติ ถ้า
    • Crash หรือ exit เอง ( ไม่ว่าจะ exit code อะไรก็ตาม ยกเว้นบางกรณีพิเศษ )
    • Docker daemon / engine restart ( เช่น restart Docker service, หรือเครื่อง reboot แล้ว OrbStack / Docker เริ่มใหม่ )
    • Docker daemon เริ่มทำงานครั้งแรกหลังเครื่องบูต ( ถ้า container เคย running มาก่อน )
  • แต่ จะไม่ restart ถ้า
    • คุณ หยุดด้วยมือ ( docker stop, docker compose stop, หรือ kill ในบางกรณี )
    • Container ถูกหยุดแล้ว → มันจะ คงสถานะ stopped ไว้แม้เครื่องจะ reboot หรือ Docker daemon restart จนกว่าคุณจะ start ด้วยมือ ( docker start หรือ docker compose up -d )

ข้อดีของ unless-stopped

  • respect การหยุดด้วยมือ → คุณ stop ไว้ตอน maintain, deploy, debug แล้ว reboot เครื่องหรือ restart Docker มันจะไม่เริ่มเอง ทำให้ปลอดภัย ไม่กระทบงาน
  • แต่ถ้า crash หรือเครื่องดับจริง ๆ มันจะขึ้นมาทันทีตอน Docker เริ่ม → uptime สูง
  • เหมาะกับ OrbStack บน macOS เพราะ OrbStack มัก restart engine บ่อย ( sleep/wake, update, etc. ) แต่คุณยังควบคุมได้ด้วย manual stop

ข้อควรระวัง / ผลกระทบที่อาจเจอ

  • ถ้าคุณ docker kill ( แทน stop ) บางครั้งอาจทำให้มันคิดว่า “stopped” แล้วไม่ restart หลัง reboot ( มี bug report บน GitHub บ้าง แต่ส่วนใหญ่ไม่ค่อยเจอ )
  • ถ้า container ยังไม่ run สำเร็จอย่างน้อย ~10 วินาทีตอนแรก restart policy จะไม่ทำงาน ( ป้องกัน restart loop )
  • ใน Docker Compose: เขียน restart: unless-stopped ใน yaml ได้เลย เหมือนกัน
  • เปลี่ยน policy ทีหลังได้ด้วย docker update --restart=unless-stopped

สรุป: –restart=unless-stopped คือตัวเลือก “ฉลาด” ที่สุดสำหรับคนส่วนใหญ่ เพราะ balance ระหว่างความน่าเชื่อถือ ( auto recover จาก crash / reboot ) กับการควบคุม ( manual stop แล้วมันอยู่เฉย ๆ จริง ๆ )
ถ้าใช้ใน OrbStack แล้วอยากให้ run ตอนเปิดเครื่อง → ยังไงก็ต้องตั้งค่า OrbStack ให้เปิดอัตโนมัติใน Login Items อยู่ดี ( ตามที่บอกไปก่อนหน้า ) แล้ว unless-stopped จะช่วยให้ container ที่เคย run อยู่ก่อนหน้านี้ขึ้นมาอัตโนมัติ