Docker container จะมี restart policy ให้ใช้อยู่ในการ restart container ใหม่ ถ้า Crash, restart, Manual stop, daemon restart
restart policy
| Policy | Crash → 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 อยู่ก่อนหน้านี้ขึ้นมาอัตโนมัติ
