“liman işçisi” ile liman işçisi öldürme arasındaki fark nedir?


116

Arasındaki fark nedir docker stopve docker kill?

Afaik, ikisi de çalışan bir konteyneri durduracak. O mi docker stopederken, doğru bir şekilde kabın içine çalıştırmak işlemini durdurmak için çalışır docker killbir kill sinyali gönderir? Eğer öyleyse docker stop, çalışan süreci nasıl doğru bir şekilde durduracağımı nasıl bilebilirdim. (Bu süreçten süreçe farklılık gösterdiğinden)

Yanıtlar:


113

Liman işçisi durdurma, konteyner içindeki işlemi doğru şekilde durdurma girişiminde bulunurken liman işçisi öldürme bir öldürme sinyali gönderir mi?

Temel olarak evet, fark incedir, ancak Komut Satırı referansında ana hatlarıyla belirtilmiştir :

  • docker stop : Çalışan bir konteyneri durdur ( SIGTERM'i ve daha sonra ödemesiz dönemden sonra SIGKILL'i gönder ) [...] Konteynırın içindeki ana işlem SIGTERM'yi ve ödemesiz bir süre sonunda SIGKILL'i alır. [vurgu madeni]
  • liman işçisi öldürme : Çalışan bir kabı öldür ( SIGKILL veya belirtilen sinyali gönder ) [...] Kabın içindeki ana işlem SIGKILL veya --signal seçeneği ile belirtilen herhangi bir sinyal gönderilir. [vurgu madeni]

Bu nedenle stop, standart POSIX sinyalini göndererek zarif bir kapatmayı tetiklemeye çalışır SIGTERM, oysaki killişlemi varsayılan olarak öldürür (aynı zamanda başka bir sinyal göndermeyi de sağlar):

SIGTERM sinyali sonlandırılmasını istemek için bir işleme gönderilir. SIGKILL sinyalinin aksine, işlem tarafından yakalanabilir, yorumlanabilir veya yoksayılabilir. Bu, sürecin kaynakları serbest bırakarak güzel bir sonlandırma yapmasına ve uygunsa durumu kurtarmasına olanak tanır. SIGINT'in neredeyse SIGTERM ile aynı olduğu unutulmamalıdır.

Zaten zorlanmamakla birlikte, işlemlerin genel olarak SIGTERMzarafetle ele alınması ve sorumluluklarına bağlı olarak doğru şeyi yapması beklenir - bu durum, zarafet süresinden daha uzun süren zarafi kapatma girişimi nedeniyle kolayca başarısız olabilir; olağanüstü (örneğin veritabanları için); Daha ayrıntılı bir açıklama için bakınız örneğin Major Hayden's SIGTERM - SIGKILL

Bir SIGTERM alındığında uygulama ne yapmak istediğini belirleyebilir. Çoğu uygulama kaynaklarını temizler ve durdurur, ancak bazıları olmayabilir. Bir SIGTERM alındığında bir uygulama tamamen farklı bir şey yapacak şekilde yapılandırılabilir. Ayrıca, uygulama disk G / Ç için beklemek gibi kötü bir durumda ise, gönderilen sinyale müdahale edemeyebilir.


1
Öyleyse, konteynırlar için genel bir kapatma prosedürüne sahip olmak istersem, süpervizör / runit sürecinde SIGTERM'i yakalamak zorunda kalacağım?
CMCDragonkai

Buradaki en iyi uygulama nedir? docker killKapatma sırasında neden biraz zaman kazanmak için neden el ile kullandığımızı anlıyorum , ancak bir komut dosyasında zarif bir kapatma girişiminde bulunmak her zaman daha iyi olmaz mıydı docker stop? Hala docker killsenaryolarda bir sürü yazı görüyorum .
Dennis,

10

docker kill Ana giriş noktası işlemini / programı aniden durduracak

docker stop incelikle durdurmaya çalışacağım (kibarca soracak: P)

Her iki durumda da, dosya sistemi değişiklikleri (durdurma veya öldürme sırasında) docker start <container>devam edecek, o zaman eğer devam ederseniz oradan devam edecektir.


1
... ancak docker killbeklemede olan herhangi bir dosya sistemi değişikliği durumunda , ana işlem hala bellekte kalıyorsa, dosya sistemi zarar görebilir mi?
Arjan

Açıkçası, ani bir durma olduğu için, sadece öldürme sırasındaki değişiklikler devam edecektir. Bekleyen her şey kaybolacak. Demek istediğim, liman işçisi öldürmenin ... kabı öldürmesi değil, süreci durdurmasıydı. kapatmak yerine bilgisayarınızı kapattığınız zamanki gibi
awkwardarts

2
Liman işçisi konteynırları VM değildir ve çekirdek bir ölümle hayatta kalır. Bu nedenle, çekirdeğe ulaşan herhangi bir dosya sistemi değişikliği bozulmadan yapılır. Dosya sistemine zarar vermek mümkün olmamalıdır (fsck anlamında; uygulama bazı yazılarını kaybetmek istemeyebilir). bilgisayarı kapatmak değildocker kill , bir işlemi öldürmekle aynıdır.
Ian Howson

3

Ve daha önce eklenmiş cevaplara ekleme

şov docker eventssonrası docker stopolayları çalıştırma

  • öldür (sinyal 15): burada sinyal 15 = SIGTERM
  • ölmek
  • Dur

şov docker eventssonrası docker killolayları çalıştırma

  • öldür (sinyal 9): burada sinyal 9 = SIGKILL
  • Ölüm (Kod 137'den çıkış)

docker stopSüreci öldürmeden önce zaman aşımına sahiptir. Varsayılan ayar 10 saniyedir.

Bu masa daha da fazla ayrıntıya sahip.


1

Bu, Masaüstünden Çıkarma ve bilgisayarın Kapatılması ile aynıdır.

Fişi Kapatmak gibi, güç kesmek docker killdemek, ilk önce süreci dikkatlice kapatmak istemeyen my_container'ı öldürmenin doğrudan yolu demektir.

Bilgisayarın kapatılması, tüm işlemlerin kapatılması için işletim sistemine bir sinyal gönderme anlamına gelir; burada işlemleri incelikle durdurmak için çalışan kaba sinyal docker stopgönderme anlamına gelir SIGTERM.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.