Bir kapta sadece bir işlem yapılması neden tavsiye edilir?


79

Birçok blog yazısında ve genel görüşlerde, "konteyner başına bir işlem" anlamına gelen bir söz vardır.

Bu kural neden var? Neden tüm işlemlerin çalışması gereken ntp, nginx, uwsgi ve daha fazla işlemi tek bir kapta çalıştırmıyorsunuz?

bu kuraldan bahseden blog gönderileri:


Ancak - hala Docker'a sahip olmayan bir kurumsal sunucunun kullanıma sunulması ve çalıştırılması için düzinelerce işlemden oluşan "şişman" bir kabın olması uygun mudur?
Peter,

@ J.Doe muhtemelen iyi olmayacak. konteynırlar VM'lerden farklıdır, küçük bir uygulama için bile birçok küçük sorun vardır - kurumsal bir dağıtım için, her şeyden önce bir konteynırda çalışacak iki yıllık bir proje olacaktır.
Evgeny

Yanıtlar:


65

Bir an için üst düzey mimari ve felsefi argümanları unutalım. Tek bir kaptaki çoklu fonksiyonların mantıklı olabileceği bazı son durumlar olsa da, "konteyner başına bir fonksiyonu" dikkate almayı isteyebileceğiniz çok pratik sebepler vardır:

  • Kabın tek bir işleve izole edilmesi durumunda kabı yatay olarak ölçeklendirmek çok daha kolaydır. Başka bir apache kabına mı ihtiyacınız var? Birini başka bir yere çevirin. Bununla birlikte, eğer apache kabım aynı zamanda DB, cron ve diğer ayakkabı parçalarımı içeriyorsa, bu işleri karmaşıklaştırıyor.
  • Konteyner başına tek bir işleve sahip olmak, kabın diğer projeler veya amaçlar için kolayca yeniden kullanılmasını sağlar.
  • Aynı zamanda cihaz geliştiricilerin bir bileşeni tüm uygulama ortamından ziyade yerel olarak sorun gidermeye, üretimden bir parçaya çekmelerini sağlar.
  • Yama / yükseltme (hem işletim sistemi hem de uygulama) daha izole ve kontrollü bir şekilde yapılabilir. Konteynırınızdaki birden fazla bit ve bob'u hokkabazlamak yalnızca daha büyük görüntüler elde etmekle kalmaz, aynı zamanda bu bileşenleri birbirine bağlar. Neden Z'yi yükseltmek için X ve Y uygulamalarını kapatmanız gerekiyor?
    • Yukarıda ayrıca kod dağıtımları ve geri almalar için de geçerlidir.
  • İşlevleri çoklu kaplara bölmek, güvenlik ve izolasyon açısından daha fazla esneklik sağlar. Güçlü bir güvenlik duruşunu sürdürmek veya PCI gibi şeylere uymak için hizmetlerin ağ düzeyinde (fiziksel olarak ya da yer paylaşım ağları dahilinde) izole edilmesini isteyebilirsiniz.
  • Stdout / stderr ile başa çıkmak ve günlükleri konteyner günlüğüne göndermek, konteynerleri mümkün olduğu kadar geçici tutmak gibi diğer küçük faktörler

İşlediğimi, fonksiyon dediğimi not edin. Bu dil eski. Resmi liman işçisi belgeleri "bir işlem" demekten uzağa , bunun yerine konteyner başına "bir endişe" önermekten uzaklaştı .



Harika, kapsamlı cevap!
Rob Wells

Sorunun İS anlamında gerçekten 'süreç' anlamına gelmediği fikri - liman işçisi ve ilgili yazıların şimdi 'işlev' kelimesine geçerek açıklığa kavuşturulmuş farklı bir terminoloji kullandığı? Çünkü aksi halde, bunun kabul edilen ve en yüksek puan alan cevap olduğunu kabul ederken, sorulan soruyu yanıtladığını sanmıyorum.
Tom,

27

Birkaç gün önce bir "iki işlem" kabı öldürdüğümde benim için iki işlem başlatan bir python betiği yerine iki kabı kullanmama neden olan bazı acı noktaları var:

  1. Docker, çökmüş kapları tanımada iyidir. Ana süreç iyi göründüğünde bunu yapamaz, fakat başka bir süreç korkunç bir ölümle öldü. Elbette, işleminizi manuel olarak izleyebilirsiniz, ancak neden bunu yeniden uygulayın?
  2. Docker günlükleri, birden çok işlem günlüklerini konsola yayırken çok daha az kullanışlı olur. Yine, işlem adını günlüklere yazabilirsiniz, ancak liman işçisi de bunu yapabilir.
  3. Bir konteynırla ilgili test ve muhakeme çok daha zor.

Bu kabul edilen cevap olmalı.
ClintM,

Kabul. Bazı harika puanların verildiği başka cevaplar olsa da, kilit nokta, dockerin PID 1'i ele almasıyla ilgili.
Brett Wagner

13

Tavsiye, İşletim sistemi düzeyinde sanallaştırma hedefinden ve tasarımından gelir.

Konteynerler, kendi kullanıcı alanını ve dosya sistemini vererek başkaları için bir işlemi izole etmek üzere tasarlanmıştır .
Bu, mantıksal evrimin chrootizole edilmiş bir dosya sistemi sağlamasıydı, bir sonraki adım belleğin üzerine yazmaktan kaçınmak için işlemleri diğerlerinden izole etmek ve aynı kaynağı (örneğin, TCP port 8080) çakışma olmadan çoklu işlemlerden kullanmaya izin vermek oldu.

Kapsayıcıya olan ilgi, sürüm çatışmalarından endişe duymadan süreç için gerekli kütüphaneyi paketlemektir. Aynı kullanıcı alanında ve dosya sisteminde aynı kitaplığın iki sürümüne ihtiyaç duyan çoklu işlemleri gerçekleştirirseniz, her bir işlem için en az LDPATH ayarlaması yapmanız gerekir, böylece uygun kitaplık ilk önce bulunur ve bazı kitaplıklar bu şekilde çimdiklenemez. Yolları derleme zamanında çalıştırılabilir kodlarda kodlanmış olduğundan, daha fazla ayrıntı için bu SO sorusuna bakın.
Ağ düzeyinde, aynı bağlantı noktalarını kullanmaktan kaçınmak için her işlemi yapılandırmanız gerekir.

Aynı kapta birden fazla işlem çalıştırmak, biraz fazla ince ayar yapılmasını gerektirir ve günün sonunda, aynı kullanıcı alanı içinde birden çok işlemi yürütmek tamamsa, aynı dosya sistemini ve ağ kaynaklarını paylaşırken, neden bunları çalıştırmıyorsanız, yalıtma amacını yenin konağın kendisi?

İşte düşünebileceğiniz ağır tweaking / tuzaklar listesi olmayan ayrıntılı listesi:

  • Günlükleri kullanma

    Ya monte edilmiş bir hacme sahip olmak ya da stdout'a serpiştirmek bu biraz yönetim sağlar. Eğer monte edilmiş bir hacim kullanıyorsanız, kabınız ana bilgisayar üzerinde kendine ait bir "yere" sahip olmalıdır, yoksa aynı kaynak için iki aynı konteyner mücadele eder. docker logsKaynaklardan kolayca anlaşılamıyorsa, faydalanmak için stdout'a girerken analiz için bir kabusa dönüşebilir.

  • Zombi işlemlerinden sakının

    Bir konteynır kazasında yaptığınız işlemlerden biri, süpervizörün çocukları zombi durumunda temizleyemeyebilir ve ev sahibi init bunları asla devralmayacaktır. Bir kere kullanılabilir pids (2 ^ 22 yaklaşık 4 milyon) tükendiğinde bir sürü şey başarısız olur.

  • Endişelerin ayrılması

    Bir apache sunucusu ve aynı kapsayıcıdaki logstash gibi iki ayrı şey çalıştırırsanız, günlük işlemeyi kolaylaştırabilir, ancak logstash'ı güncellemek için apache'yi kapatmanız gerekir. (Gerçekte, Docker'ın günlük sürücüsünü kullanmalısınız) Geçerli oturumların bitmesini beklememek zarif bir duraklama olur mu? Zarif bir duraksa, biraz zaman alabilir ve yeni sürümü piyasaya sürmesi uzun sürebilir. Bir öldürme yaparsanız, kullanıcıları bir günlük göndereni için etkileyeceksiniz ve bu IMHO'dan kaçınılması gerekir.

Sonunda, birden fazla işleminiz olduğunda, bir işletim sistemi üretiyorsunuzdur ve bu durumda bir donanım sanallaştırması kullanmak bu ihtiyaca göre daha fazla ses çıkarır.


3
Bu argümanları ikna edici bulmuyorum. Birden fazla kap içeren bir işlem ile ana bilgisayarda çalışan arasında büyük bir fark var. Kapların orijinal amacını açıklamak biraz alakalı olsa da, çok işlemli kaplardan kaçınmak gerçekten zorlayıcı bir neden değil. ŞİMDİ, “neden olmasın” diye “neden evet” olarak yanıtlıyorsunuz, bu olması gerektiği kadar yararlı değil. Aynı kap içinde birden fazla işlemi çalıştırmak çok uygun olabilir - işte bu yüzden evet. Neden açıklanmayacak.
Assaf Lavie

1
Aklınızdaki tweaking konusunda ayrıntılı bilgi vermediniz. Ve bu ayar düzenlemenin birden fazla konteynır kurmaktan daha fazla iş olduğu konusunda bir karar vermediniz. Somut bir örnek alalım: Sıklıkla bazı ana işlemleri ve bazı yardımcı işlemleri çalıştıran süpervizöre sahip paketlenmiş liman işçisi görüntüleri görürsünüz. Bu kurulumu çok kolaydır; Muhtemelen kapları ayırmak kadar kolay. örneğin uygulama ve günlük gönderici. Öyleyse, onus sizin tarafınızdan, neden böyle olmadığını tartışmak için inanıyorum.
Assaf Lavie

1
BTW, çok işlemli konteynerlere karşı geçerli argümanlar olduğuna inanıyorum, ancak bunlardan hiçbirinden bahsetmediniz. Ancak her durumda kesin bir dava olmaktan uzak. Bazı durumlarda, birden fazla işleme izin vermek tamamen kabul edilebilir. Heck, bazı popüler resimler birkaç alt işlem ortaya çıkarmaktadır - bu da kötü mü? Söylediğim şey değiş tokuşlar olduğu ve cevabınız neşe ve ayrıntıdan yoksun tek taraflı bir tablo çiziyor.
Assaf Lavie

1
ilginç ... Bu konuda benzer (özdeş) bir görüşümüz var gibi görünüyor. Belki bu davada görmezden
gelmelisin

1
Sonuca varmak için "acele etmem" ... Sadece görmezden gelmenizi tavsiye ederim. Fakat “siz”, cevabınızın anonim düşürücüsünün kim olduğu hakkındaki kendi gözlerimle gördüğüm hakkındaki fikrimi değiştiremezsiniz. Neyse, zaman ... ilerlemeye
Pierre.Vriens

6

Çoğu durumda olduğu gibi, hepsi ya da hiçbiri değildir. "Konteyner başına bir işlem" yönlendirmesi, konteynerlerin ayrı bir amaca hizmet etmesi gerektiği fikrinden kaynaklanmaktadır. Örneğin, bir kap, bir web uygulaması hem de olmamalıdır ve bir Redis sunucusu.

Her iki işlem de tek, modüler bir işlevi desteklediği sürece, tek bir kapta birden fazla işlemi yürütmenin bir anlamı yoktur.


2

Burada servis olarak adlandırdığım işlem, 1 konteynır 1 servis , eğer herhangi bir servis başarısız olursa o zaman sadece ilgili konteynırı ve saniyeler içinde her şey tekrar başlar. Dolayısıyla, hizmetler arasında herhangi bir bağımlılık olmayacak. Kap büyüklüğünüzü 200 MB'tan ve en fazla 500 MB'den küçük tutmak (Windows yerel kapsayıcıları hariç), aksi takdirde, performans tam olarak değil, sanal makineye benzer olacaktır. Ayrıca, ölçeklendirme, servis esnekliği, otomatik dağıtım vb. İşlemleri nasıl yapabilirim?

Ve bu tamamen sizin çağrınız, ortamınızı en iyi şekilde karşılayan ve sizin için şeyleri otomatik hale getirecek olan kapsayıcı teknolojisini kullanarak, çoklu servis ortamında mikro-servis gibi mimari kalıplarınızı nasıl yapmanız gerektiğidir.

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.