Farklı kaplarda nginx ve php'yi dockerize etmenin avantajları nelerdir?


19

Docker ve Kubernetes ile çalışmaya yeni başladım ve bazı insanların tek bir görüntüde nginx + php oluşturduğu ve bazılarının nginx ve php ile başka bir görüntü oluşturduğu (aynı yolu takma ve çevreleyen) birçok yığın izliyorum her iki kap da Kubernetes'te aynı dağıtımda).

Her ikisi de nginx + php'yi aynı olana yüklemek yerine iki docker görüntüsü oluşturmanın avantajları neler olurdu?

Yanıtlar:


19

Nginx'li PHP genellikle ayrı bir işlem olan php-fpm kullanılarak yapılır.

Docker'ın temel fikrini bir işlemin (bu nokta hakkında daha fazla ayrıntı için yanıtın sonuna bakın) konteyner başına tutmak, nginx işleminin ve php-fpm işleminin ayrı kaplarda olması mantıklıdır.

Nginx ve php-fpm arasındaki iletişim fastcgi aracılığıyla ortaya çıktığında, php-fpm kabı ayrı bir konakta da olabilir ve bu, nginx'in arkasında bir php-fpm kapları kümesinin kullanılmasına izin verir.

Yorum duvarından sonra biraz daha arka plan var, liman işçilerinin belgelerinde bir konteynerin sadece bir endişesi olması gerektiği fikri var .

Linux kapsayıcısının ( lxc ) ana fikri , işlemci ve bellek düzeyinde yalıtılmış bir ad alanında bir işlem yürütmektir, docker bunun üzerine dosya sistemi düzeyinde bir yalıtım ekler.
Avantajı, bu isim alanındaki bir işlemin tehlikeye atılmasının, diğer işlemlerin belleğinin okunmasına izin vermemesidir ve bu nedenle ana bilgisayarda diğer tehlikelerin önüne geçmelidir.

Nginx ve php-fpm hakkında konuşurken, çift olarak çalışırlar, ancak her birinin kendi endişesi vardır, nginx HTTP bölümünü, yönlendirme, üstbilgileri doğrulama vb. . Her ikisinin birlikte zorunlu olmayan tek bir uygulamaya hizmet etmesi normaldir.

Bağlama bağlı olarak, bir uygulama için tüm yığını içeren bir kapsayıcı, örnek için bir geliştirici iş istasyonunda bulunması daha kolay olabilir. Ama ideal üretim amaçlı, (exemple hikaye zombi sürecinin vadede sorunun payını getiriyor supervisord ile aynı kap içinde ayrı süreçler sahip kabın içine az etkileşim tutmaya çalışın ve işleme log burada örnekleme amaçlıdır için).

Nihayet docker sayfasını biraz vurgulayarak alıntılayacağım:

“Konteyner başına bir işlem” genellikle iyi bir kural olsa da, zor ve hızlı bir kural değildir. Kapları mümkün olduğunca temiz ve modüler tutmak için en iyi muhakemenizi kullanın .

Her şey için geçerli bir "gümüş kurşun kuralı" yoktur, bu her zaman konteynerin içindeki karmaşıklık ile konteynırların kendilerini düzenleyen karmaşıklık arasında bir denge oluşturur.


3
Temel fikir aslında "Her kapsayıcıda yalnızca bir endişe olmalıdır" ve "kapsayıcı başına yalnızca bir işletim sistemi işleminin olması gerektiği doğru değildir". docs.docker.com/engine/userguide/eng-image/…
user2640621

Fikri vurmak için bir kısayol olduğunu itiraf ediyorum, nginx tek bir monolitik süreç ya da php-fpm değil, ama
cevabımdaki

3
Cevap genellikle konteyner başına bir hizmettir, gerçekte bir işlem değildir. Öte yandan, bir kapta birden çok çalışan işleminiz varsa, bazı başlatma sürecini, hizmet yönetimini, yeniden başlatmaları, bağımsız günlüğe kaydetmeyi, bağımsız paket bağımlılıklarını düşünmeniz gerekir, bu biraz daha karmaşık hale gelir. Bazen 1: 1 eşleme, ölçekleme sırasında 1: n eşlemeye dönüşür.
Jiri Klouda

@ Jiri şeytanın avukatı oynuyor: Peki bir postgres DB kullanan bir raylar uygulaması önünde bir apache aynı kap içinde gitmek gerekir? Ne de olsa bu, dış açıdan sadece bir hizmet.
Tensibai

1
@JiriKlouda cevabı değiştirildi, umarım yorumlarda dile getirilen tüm noktaları iletmek için yeterince ayrıntılıdır.
Tensibai

4

İki konteynırı yönetmek zorunda kalmadan ağır basan anlamlı bir fayda yoktur. Süreçler arasında 1: 1 ilişkiniz olduğu ve tek bir amaca hizmet ettiği sürece, bunları aynı kaba koyun.


Aynı kapta farklı resimler mi demek istediniz?
CarlosAS

Nginx ve php-fpm'yi aynı kapta nasıl başlatacaksınız? Lütfen bir örnek ekleyin.
030

1
@ 030 burada bir örnek
CarlosAS

2
@carlos Geliştirme amaçları için çok geçerli bir örnek, üretim kullanımı için bu tür şeyleri engellerdim (bir konteyner içinde süpervizör çalıştırmak bir tabancaya kolayca
dönebilir

Bu cevaba katılmıyorum, bu nedenle, mod güvenliği olan bir apache sunucusu, sadece bir uygulamayı barındıran bir postgresql sunucusuna konuşan bir tomcat ile konuşurken tek bir kap içine sığmalıdır.
Tensibai

4

Aslında, burada eksik olan bir nokta yatay ölçeklenebilirliktir. Jamie Alquiza'dan uzun zaman önce şu konuya değinen bir makale var:

http://archive.is/pDzz0

Kısacası, daha yüksek performansa ulaşmak için php-fpm'nizi yatay olarak ölçeklendirirsiniz. Nginx + php-fpm'yi birlikte ölçeklendirmek size herhangi bir fayda sağlamaz. Makalenin ne dediğini doğrulamak için bazı stres testleri (örneğin, Tsung, Gatling vb. Şahsen, makalenin genel olarak doğru olduğunu kanıtlayan birkaç gerçek dünya deneyimim var.

Ancak çıplak metal makineleri / VM'ler için iki dezavantaj var (belki Kubernetes için değil):

  1. Nginx, php-fpm kapsayıcı değişikliklerini dinamik olarak nasıl keşfeder? Bu kolay kısmı.
  2. Ölçekledikten sonra aynı birim / dosya sistemlerini nasıl paylaşıyoruz? Nginx ve php-fpm kapları tutarlılığı sağlamak için aynı içeriği okumalıdır. Bu, üzerinde çalışmak için en az bulmaca parçası (ve en eğlenceli kısmı) bırakır.

DÜZENLENEN: Şimdi 2019'un neredeyse yarısı. Aynı modeldeki php-fpm + nginx'in eski modeli farklı kullanıma sahip. Hizmet ağına aşina iseniz, nginx (veya Nginmesh olarak adlandırılan şey) doğu-batı bağlantılı trafiği işlemek için bir sepet olarak işlev görür. Doğu-batı sınırı trafiği çoğunlukla hizmetler veya diğer fantezi işlevler arasında kimlik doğrulaması için kullanılırken, saf php-fpm bunu başaramadı.


-1

Avantajı: arka uçta birden fazla php-fpm kapsayıcısı çalıştırabilirsiniz, biz port sayısı aracılığıyla PHP kümesi diyoruz. Örnek port 9000, 9001, 9002 .. vb.

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.