Topik ini membahas kebijakan restart, yaitu aturan yang menentukan kapan Docker menghidupkan ulang container secara otomatis. Pembahasan mencakup empat nilai opsi --restart, perbandingan perilakunya saat container berhenti maupun saat Docker dimulai ulang, pemilihan kebijakan untuk layanan produksi, serta bentuk yang sama pada Compose. Setelah membacanya, container layanan dapat pulih sendiri tanpa campur tangan manual setiap kali prosesnya berhenti.
Fungsi kebijakan restart#
Proses di dalam container dapat berhenti karena dua sebab yang lazim, yaitu aplikasi yang mengalami error atau host yang dimulai ulang, yakni mesin tempat Docker berjalan. Tanpa kebijakan restart, container yang berhenti karena sebab mana pun dibiarkan berhenti, dan aplikasi hanya hidup kembali setelah perintah docker start dijalankan secara manual. Kondisi itu wajar untuk container uji coba, tetapi tidak wajar untuk layanan yang diharapkan terus tersedia.
Kebijakan restart adalah instruksi tetap yang diberikan kepada daemon, yaitu proses latar Docker yang mengelola seluruh container, agar menghidupkan ulang container mengikuti aturan tertentu. Kebijakannya ditetapkan melalui opsi --restart pada docker run dan tersimpan bersama konfigurasi container, sehingga tidak perlu diulang setiap kali container dijalankan. Nilai bawaannya adalah no, yang berarti tidak ada pemulihan otomatis sama sekali.
Empat nilai opsi –restart#
Empat nilai yang diterima --restart berbeda pada dua keadaan kunci, yaitu saat container berhenti karena kesalahannya sendiri dan saat daemon dimulai ulang. Tabel berikut merangkum perbedaannya.
| Nilai | Container berhenti sendiri | Daemon dimulai ulang | Catatan |
|---|---|---|---|
no | Tetap berhenti | Tetap berhenti | Nilai bawaan, tanpa pemulihan otomatis |
on-failure | Dihidupkan ulang hanya bila kode keluarnya bukan nol | Container yang sedang berjalan dihidupkan ulang | Bentuk on-failure:N membatasi jumlah percobaan |
always | Selalu dihidupkan ulang | Semua container dihidupkan ulang, termasuk yang sebelumnya dihentikan manual | Diperuntukkan bagi container yang harus selalu hidup |
unless-stopped | Dihidupkan ulang tanpa memandang kode keluar | Hanya container yang tidak dihentikan manual | Mirip always dengan pengecualian pada penghentian manual |
Perbedaan always dan unless-stopped hanya terlihat pada satu keadaan, yaitu container yang dihentikan secara manual lalu daemon dimulai ulang. Kebijakan always menjalankan kembali container tersebut, sedangkan unless-stopped menghormati keputusan penghentian itu dan membiarkannya berhenti. Pada daemon yang terus berjalan, container yang dihentikan manual tidak dihidupkan ulang oleh kedua kebijakan tersebut, sehingga pemeliharaan yang disengaja tetap aman dilakukan.
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# layanan catatan pulih sendiri, kecuali dihentikan manual
docker run -d --restart unless-stopped --name catatan-app catatan
# pekerjaan cadangan hanya diulang saat gagal, maksimal tiga kali
docker run --rm --restart on-failure:3 --name cadangan-harian image-cadanganKebijakan on-failure membedakan kegagalan dari penghentian yang wajar. Container yang prosesnya berakhir dengan kode keluar nol dibiarkan berhenti, sedangkan kode keluar lain memicu penghidupan ulang, sehingga pola ini cocok untuk pekerjaan berjeda yang seharusnya selesai dan tidak berputar terus. Batas percobaan pada on-failure:N mencegah pekerjaan yang selalu gagal diulang tanpa akhir.
Memilih kebijakan untuk layanan#
Layanan produksi yang harus terus tersedia paling tepat diberi kebijakan unless-stopped. Pilihan ini memulihkan layanan dari error mendadak maupun dari dimulai ulangnya host, tetapi tetap menghormati penghentian manual saat pemeliharaan dilakukan. Kebijakan always hanya dipilih bila container memang harus hidup dalam keadaan apa pun, termasuk setelah dihentikan manual, dan hal itu jarang menjadi kebutuhan yang sungguh-sungguh.
Kebijakan restart hanya berlaku setelah container berhasil dimulai, yang ditandai dengan container yang bertahan hidup paling sedikit sepuluh detik. Aturan ini mencegah container yang gagal sejak awal berputar dalam penghidupan ulang tanpa akhir. Meski demikian, aturan itu tidak menutup kemungkinan kegagalan yang muncul setelah masa sepuluh detik tersebut, sehingga pemantauan log tetap diperlukan.
Kebijakan restart pada Compose#
Pada Compose, peran --restart diambil alih oleh kunci restart: pada berkas compose.yaml. Kunci itu dituliskan pada tingkat service dan menerima keempat nilai yang sama dengan docker run, sehingga kebijakan yang selama ini diberikan lewat perintah cukup dinyatakan sekali di dalam berkas. Kebijakan pada berkas membuat pemulihan otomatis ikut aktif tanpa opsi tambahan saat proyek dijalankan.
services:
app:
image: catatan
restart: unless-stoppedSaat Compose menjalankan proyek, kebijakan pada kunci tersebut diterapkan ke container milik service yang bersangkutan, sehingga perilaku pemulihannya identik dengan opsi --restart pada docker run. Nilai yang tertulis di berkas juga terbaca dan dapat disunting seperti bagian konfigurasi lainnya, yang membuat kebijakan pemulihan ikut terdokumentasi bersama sisa konfigurasi aplikasi. Perilaku setiap nilai tetap mengikuti tabel pada bagian sebelumnya.
Kesalahan umum#
Container gagal dipulihkan terus-menerus. Aplikasi yang langsung berhenti karena konfigurasinya salah, misalnya
POSTGRES_PASSWORDyang kosong, akan dihidupkan ulang lalu berhenti lagi berulang-ulang apabila kebijakannyaalways. Lognya menumpuk pesan error yang sama, dan tanda-tandanya terlihat padadocker ps -asebagai container yang baru saja dimulai ulang. Perbaikannya dengan membaca log sampai penyebab awalnya ditemukan, bukan dengan menambah percobaan ulang.Mengira kebijakan mengalahkan penghentian manual. Container yang dihentikan dengan
docker stoptidak dihidupkan ulang selama daemon masih berjalan, sebagaimana pun kebijakannya. Harapan bahwa kebijakanalwayslangsung menyalakan kembali container yang baru dihentikan menimbulkan kesimpulan keliru bahwa kebijakannya rusak. Perbaikannya dengan menjalankandocker startsecara manual atau menunggu daemon dimulai ulang sesuai perilaku yang tertuang pada tabel di atas.
Ringkasan#
- Kebijakan restart ditetapkan dengan
--restartdan menyuruh daemon menghidupkan ulang container mengikuti aturan yang tersimpan bersama container. on-failurehanya bereaksi pada kode keluar bukan nol dengan batas percobaan opsional, sedangkanalwaysdanunless-stoppedmenghidupkan ulang tanpa memandang kode keluar.- Perbedaan
alwaysdanunless-stoppedterletak pada container yang dihentikan manual, yang dijalankan kembali olehalwayssaat daemon dimulai ulang dan dibiarkan olehunless-stopped. - Pada Compose, kebijakan yang sama dinyatakan melalui kunci
restart:pada compose.yaml.
Referensi#
- docker container run — Docker Docs
— Rujukan opsi
--restartbeserta tabel kebijakan restart. - Run containers — Docker Docs — Halaman konsep menjalankan container, termasuk kebijakan restart dan perilakunya.