apa perbedaan antara `docker stop` dan` docker kill`?

116

Apa perbedaan antara docker stopdan docker kill?

Afaik, keduanya akan menghentikan wadah berjalan. Apakah itu docker stopmencoba menghentikan proses yang berjalan di dalam wadah dengan cara yang benar, sementara docker killakan mengirim sinyal mematikan? Jika demikian bagaimana cara docker stopmengetahui cara menghentikan proses yang berjalan dengan benar. (Karena ini berbeda dari proses ke proses)

Geert-Jan
sumber

Jawaban:

113

Apakah itu karena buruh pelabuhan menghentikan upaya untuk menghentikan proses yang berjalan di dalam wadah dengan cara yang benar, sementara buruh pelabuhan akan mengirimkan sinyal bunuh?

Pada dasarnya ya, perbedaannya halus, tetapi dijelaskan dalam referensi Baris Perintah :

  • buruh pelabuhan berhenti : Hentikan wadah berjalan ( kirim SIGTERM, dan kemudian SIGKILL setelah masa tenggang ) [...] Proses utama di dalam wadah akan menerima SIGTERM, dan setelah masa tenggang, SIGKILL. [penekanan milikku]
  • kill buruh pelabuhan : Bunuh kontainer yang sedang berjalan ( kirim SIGKILL, atau sinyal yang ditentukan ) [...] Proses utama di dalam kontainer akan dikirim SIGKILL, atau sinyal apa pun yang ditentukan dengan opsi - sinyal. [penekanan milikku]

Jadi stopupaya untuk memicu shutdown anggun dengan mengirimkan sinyal POSIX standar SIGTERM, sedangkan killhanya membunuh proses secara default (tetapi juga memungkinkan untuk mengirim sinyal lain):

Sinyal SIGTERM dikirim ke suatu proses untuk meminta penghentiannya. Berbeda dengan sinyal SIGKILL, sinyal dapat ditangkap dan ditafsirkan atau diabaikan oleh proses. Hal ini memungkinkan proses untuk melakukan penghentian bagus melepaskan sumber daya dan menyimpan keadaan jika perlu. Perlu dicatat bahwa SIGINT hampir identik dengan SIGTERM.

Meskipun tidak dipaksakan, proses umumnya diharapkan untuk menangani dengan SIGTERManggun dan melakukan hal yang benar tergantung pada tanggung jawab mereka - ini dapat dengan mudah gagal karena upaya shutdown yang anggun membutuhkan waktu lebih lama daripada masa tenggang, yang merupakan sesuatu yang perlu dipertimbangkan jika integritas data terpenting (misalnya untuk basis data); lihat misalnya SIGTERM Mayor Hayden vs. SIGKILL untuk penjelasan yang lebih terperinci:

Aplikasi dapat menentukan apa yang ingin dilakukan setelah SIGTERM diterima. Sementara sebagian besar aplikasi akan membersihkan sumber daya mereka dan berhenti, beberapa mungkin tidak. Aplikasi dapat dikonfigurasikan untuk melakukan sesuatu yang sama sekali berbeda ketika SIGTERM diterima. Juga, jika aplikasi dalam keadaan buruk, seperti menunggu disk I / O, itu mungkin tidak dapat bertindak pada sinyal yang dikirim.

Steffen Opel
sumber
1
Jadi jika saya ingin memiliki prosedur penutupan umum untuk kontainer, saya harus menangkap SIGTERM dalam proses pengawas / runit?
CMCDragonkai
Apa praktik terbaik di sini? Saya mengerti mengapa kita akan menggunakan docker killtangan untuk menghemat waktu selama shutdown, tetapi dalam sebuah skrip, bukankah selalu lebih baik untuk mencoba shutdown yang anggun melalui docker stop? Saya masih melihat banyak docker kills dalam skrip.
Dennis
10

docker kill akan menghentikan proses / program titik masuk utama secara tiba-tiba

docker stop akan mencoba menghentikannya dengan anggun (akan bertanya dengan sopan: P)

dalam kedua kasus perubahan sistem file akan bertahan (pada saat berhenti atau membunuh) jadi jika Anda docker start <container>maka itu akan dilanjutkan dari sana.

awkwardarts
sumber
1
... tetapi jika docker killada perubahan pada sistem file yang tertunda, proses utama yang masih ada di memori akan hilang, sehingga sistem file mungkin berakhir rusak?
Arjan
jelas, karena berhenti mendadak, hanya perubahan pada saat membunuh yang akan bertahan. Apa pun yang tertunda akan hilang. Maksud saya adalah bahwa buruh pelabuhan tidak benar-benar ... membunuh kontainer, itu menghentikan proses. seperti saat Anda mematikan komputer alih-alih mematikan
awkwardarts
2
Kontainer Docker bukan VM dan kernel tetap hidup melalui proses kill. Oleh karena itu, setiap perubahan sistem file yang telah mencapai kernel akan dilakukan secara utuh. Seharusnya tidak mungkin merusak sistem file (dalam arti fsck; aplikasi mungkin tidak suka kehilangan sebagian dari penulisan). docker killanalog dengan membunuh suatu proses, tidak mematikan komputer.
Ian Howson
3

Dan tambahan jawaban ditambahkan sebelumnya

berjalan docker eventssetelah docker stopacara menunjukkan

  • kill (sinyal 15): di mana sinyal 15 = SIGTERM
  • mati
  • berhenti

berjalan docker eventssetelah docker killacara menunjukkan

  • kill (sinyal 9): di mana sinyal 9 = SIGKILL
  • Mati (kode keluar 137)

docker stopmemiliki batas waktu sebelum mematikan proses. Standarnya adalah 10 detik.

Tabel ini bahkan memiliki lebih banyak detail.

faboulaw
sumber
1

Ini analog dengan Mencabut Desktop dan mematikan komputer

Seperti menarik Plug Off berarti mematikan daya, docker killberarti cara langsung untuk membunuh my_container, yang tidak berusaha untuk mematikan proses dengan anggun terlebih dahulu.

Mematikan komputer berarti mengirim sinyal ke OS untuk mematikan semua proses yang docker stopartinya mengirim SIGTERMsinyal ke wadah yang sedang berjalan untuk menghentikan proses dengan anggun.

Rajat Badjatya
sumber