Java kullanırken Uncker ikili dosyalarına daha yakın olan diğer dillere kıyasla Docker'ı kullanmanın yararları olumsuz mu?


53

Bir arkadaşım vardı dedi ki:

Docker harika. Yerel makinenizde üretimi ve tüm tuhaflıklarını çoğaltmak için kullanabilirsiniz . Ardından, bu örneği doğrudan tüm iş akışlarında süper hızlı bir şekilde dağıtabilirsiniz .

Geliştiriciler Ruby, PHP veya Go yazarlarsa bu doğru olacaktır - burada işletim sistemine bir yön ikili bağlantısı vardı.

Ancak Java kullanırken - işletim sistemi ile dil arasında zaten bir sanal katman var, temel işletim sisteminden bağımsız olarak işlem tutarlılığı sağlanıyor.

Muhtemelen, bu durumda, Docker'ı yerel olarak geliştiricilere üretim ortamını çoğaltmak için çalıştırmanın yararları reddedilmiştir . (Ruby, PHP veya Go ile karşılaştırıldığında).

Bu konuda tartışmaya açığım ve muhalif bir bakış açısını duymaya istekliyim (kanıtlarla).

Java kullanırken Uncker ikili dosyalarına daha yakın olan diğer dillere kıyasla Docker'ı kullanmanın yararları olumsuz mu?


34
Ruby ve PHP'nin ikili olduğunu neden düşünüyorsun? Ruby ve php teknik olarak Java'dan bile daha sanaldır - Java'da önce derlemeniz ve ardından programınızı sanal bir makinede yürütmeniz gerekir. Ruby ve php'de kaynak kodunu gönderirsiniz ve sanal makine kaynağı doğrudan okur.
slebetman

12
"Ancak, Java kullanırken - işletim sistemi ile dil arasında zaten sanal bir katman var, altta yatan işletim sisteminden bağımsız olarak işlem tutarlılığı sağlıyor." LOL. Java "bir kez yaz, her yerde test et" i keşfetti.
Andy,

2
Java hareketli bir hedeftir. Bazen bazı şeyleri bozan özellikler (birkaç yıl önceki güvenlik sıkılaştırması en iyi örneklerdir) ya da belirli bir sürüm kullanmanızı gerektiren bir hatayla karşılaşıyorsunuz. Docker'da bunu kontrol etmek, ana bilgisayarın yerel paketleme sistemini kullanmaktan çok daha kolaydır.
Thorbjørn Ravn Andersen

1
"Altta yatan işletim sisteminden bağımsız olarak işlemin tutarlı hale getirilmesi" Dil çalışma zamanının tutarlı davranmasını sağlamanın muhtemelen hala bazı dış bağımlılıkların olduğu gerçeğini ihmal etmediğini unutmayın. Günlükleriniz için belirli bir dosya yolunu kullanmak kadar basit bir şey olabilir.
jpmc26

Yanıtlar:


86

Bir şey değil.

Geliştirme makinenizde ve sunucuda Java'nın 1.8.0 sürümünü çalıştırdığınızı hayal edin. Bu arada, her ikisi de Java kullanarak iki projede aynı anda çalışıyorsunuz.

Bir gün, JVM'de bir hata bulundu ve üzerinde çalıştığınız ilk projeyi çalıştıran sunucular 1.8.1'e taşındı. Bu arada, ikinci projeyi çalıştıran sunucular hatadan etkilenmez ve 1.8.1'e güncelleme yapmak istemeyen farklı bir sistem yöneticileri ekibi tarafından yönetilir.

Şimdi, en azından projelerden biri için farklı bir Java sürümü kullanıyorsunuz.

Bu sizi çok fazla rahatsız etmeyebilir (bir sunucu 1.9 sürümüne geçinceye kadar, diğeri eski sürümü tutarken), ancak bu, yerel makinenizde üretim ortamını artık çoğaltmadığınız anlamına gelir; içine sürünmek için hatalar.

Dosya sisteminizin, bağımlılıklarınızın, güvenlik ayarlarınızın, yerel yapılandırmanızın ve Linux sürümünüzün kendisinden farklı olduğunu düşünüyorsanız, kendinizi üretimde başarısız olacak kod yazma riskine sokarsınız. Bu riski almak yerine, sanallaştırma veya Docker'ı kullanıyor olabilirsiniz, küçük veya hiç verimlilik kaybı yoktur.


20
Ayrıca, bu tür şeyler, daha büyük şirketlerdeki TÜM zamanın başına gelir. Bu sadece teorik bir şey değil.
enderland

5
Docker’da bir hata bulduğunda ne yaparsın?
Owen,

Ayrıca Java 9 bir şeyleri kıracak. İhtiyaç duyulacak kadar çaba sarf edilecektir
Thorbjørn Ravn Andersen

8
@Owen Java'da bir hata bulduğunuzda yaptığınız şey. Veya {Linux, Windows} 'da. Veya CPU'nuzda .
Kroltan

1
@Trilarion: Evet, çoğunlukla şirket geliştiricileri tarafından blog gönderileri şeklinde. Bununla birlikte, docker.com/customers adresindeki "Daha fazla bilgi edinin" bağlantılarından herhangi biri, bu tür sorunları çözmek için docker kullanan büyük şirketlere örnekler sağlayacaktır. Bununla birlikte, genellikle bu tür şirketler üretim ve geliştirme arasında mükemmel bir eşleşmeye ihtiyaç duyduklarını kabul ettiklerini ve bunu VM'lerle başardıklarını söyledi. Daha sonra, "hey, Docker VM'lerle aynı sorunu çözdü, ancak daha hızlı çalışır ve dağıtımları tutarlı tutmak için kullanılabilir."
Brian

35

Nadiren bir "Java Uygulaması" kullanırsınız. Java uygulamanızın çevresinde birçok farklı destek programı vardır. Doğrudan Java ile çalışmayan programlarla bütünleşmek için Apache HTTPD, Apache Tomcat, mesajlaşma için ActiveMQ, bir FTP Deamon, MySQL ve bir avuç özel hizmet kullanıyoruz.

Bu onunla birlikte gelen geliştirme yazılımına bile girmiyor - eclipse, ant, adobe flex, groovy, firefox ve subversion (Epeyce atlıyorum)

Yeni bir iş istasyonu kurmak tam bir gün ile bir hafta arasında bir zaman alıyor - bu sorunu basitleştirmek için Docker'a geçmeyi tartıştık. Birkaç saat içinde yeni bir iş istasyonunu güvenilir bir şekilde açabilseydik şaşırtıcı olurdu.

Konuşlandırırken 20 sunucuya kadar bakım yapmamız gerektiği gerçeğinden bahsetmiyorum; Docker oldukça iyi bir anlaşma gibi görünmeye başladı!

(20, bir kerede yalnızca bir sunucuda çalışan bir uygulama için oldukça acı verici görünüyor ... ama bir sunucuyu kümeler (x2), test / aşamalandırma / prod (x3), Dahili / Harici (x2) ve birincil site ile çarpın / yedekleme sitesi (x2) ve oraya oldukça hızlı bir şekilde çıkabiliyorsunuz)


Neden resimler yapmıyorsun?
Dmitry Kudriavtsev

Umarız ki. Oldukça yoğun kullanılan / önemli bir sisteme özellikler eklemeye çalışan küçük bir ekibiz ve dağıtımlarını dikte etmek için sunucular üzerinde yeterli kontrol sahibi değiliz. Yine de, dev için kullanabilirsiniz, 32mb ram'da zaten oldukça kısıtlıyız - Bir liman işçisi görüntüsünden kaçmanın bazı ek yükleri olacağını tahmin ediyorum ... ama planımız bu yönde hareket etmektir.
Bill K,

İş istasyonları için demek istedim
Dmitry Kudriavtsev

Zaman ve bellek - 32GB iş istasyonlarımızda çalışabilmemiz için zaten parçalarımızı ayırmamız gerekiyor (64GB sunucuların hepsi gayet iyi çalışıyor). Yine de biraz deney yaptık ve yeni bir dev iş istasyonu inşa etmemiz gerektiğinde deneyebiliriz.
Bill K,

8

Bu soru aynı zamanda, statik olarak bağlanmış ikili dosyaları ayıklayabileceğiniz ve bir yere koyabileceğiniz golang için de geçerli olacaktır; Python veya C ++ yerine, genellikle insanların çok sayıda bağlantı kabı konteyneri inşa etmesine neden olan çok sayıda bağlantılı kitaplığa sahip olursunuz. gelişme ortamı.

Burada cevaplanması gereken iki nokta var:

Birincisi: Daha iyi bir yol olmalı ve var: Sadece kurulum ortamını kullanarak daha küçük (ve daha verimli) liman konteynerleri oluşturabilirsiniz; bu, Golang-with-golang ile olduğu gibi benzer avantajlara yol açar. -binaries kapları. Java durumunda, tüm kütüphane kavanozlarını ve bir kabuk betiğini içeren şişman bir kavanoz veya yüklenebilir bir uygulama oluşturabilirsiniz; Python'da, derleme ortamından bağımsız, bağımsız tekerlekler oluşturmak için denetleme tekerleğini kullanabilirsiniz (ve C ++ 'ı hemen hemen aynı etkiye statik bağlama ile kullanabilirsiniz).

İki: liman işçisi için neye ihtiyacın var? Java ülkesinde, sınıf yükleyicileri kullanarak farklı bileşenler arasında çok fazla ayrım yapabilirsiniz, ancak asıl nokta Java uygulamasının etrafındaki şeydir. Hiçbir Java uygulaması kendi başına çalışmaz - liman işçisi olarak çalışmazsa, genellikle gözetmen veya sistemd veya benzerleri tarafından denetlenir. Ana makineyi değil sanallaştırmak için kap soyutlamasını kullanan Kubernetes, Marathon veya Docker bulutuna girin, ancak aslında tüm kapsayıcıyı dağıtabileceğiniz ve bazı rasgele bir ana bilgisayarda çalışacak şekilde sanallaştırın.

Mikro-servisler genellikle liman tabanlı bulutlarda çalışır, çünkü liman ev sahiplerine evcil hayvan gibi değil aynı zamanda limanlanmış uygulamalarla aynı şekilde sığır gibi davranmanızı sağlar. Elbette, bu soyutlama, ana bilgisayar birimlerini docker'a bağladığınız anda sızıntı yapar ve docker kaplarını tam olarak bu hacimleri barındıran ana bilgisayarda çalıştırmanız gerekir. Bazı insanlar bunun etrafında bile olsun.


5

Bu gerçekten iyi bir soru ama Docker ile çalıştıktan sonra, onu tersine çevirirdim:

JVM'nin faydaları konteynırlaştırma (örneğin Docker) tarafından olumsuz mu tutuluyor?

Konteynerler deneyimlerimden kaynaklanan gelişim hakkında sahip olduğum varsayımların çoğuna gerçekten meydan okuyor. Örneğin, bir kişi bir uygulamadaki bir kaynak dosyasına giden yolu zor kodlayacak olsaydı, birçok deneyimli geliştirici bunun sorunlu olduğunu ve bunu yapılandırılabilir hale getirmeniz gerektiğini bilirdi. Ama bir konteyneri hedefliyorsanız, bu gerçekten böyle mi? Kabı oluştururken, dizin yapılarının ne olduğunu söylersiniz. Oradaki yolu yapılandırıyorsunuz. Öyleyse iki kez yapılandırmalı mıyım? Fayda ne? Onları eşleştirmezseniz, işe yaramayacak kadar ... KURU?

Geçenlerde Java ve Docker ile GC olaylarını izleyen bir prototip uygulaması yarattım ve yığının eski kısmı eşik yüzdesine çarptığında, kendini kapattı. Docker (swarm modu) daha sonra yenisini açacaktır. Temel olarak, JVM'deki büyük GC çevrimlerine duyulan ihtiyacı ortadan kaldırır ve liman işçilerinin onları yönetmesine izin verir. Umduğum gibi işe yaramadı (müşteriler kapanmanın bir etkisi gördü), ancak kalabalığa canlı bir demo yapacak kadar işlevseldi.

Merak ediyorsanız gerçekten sadece kapları denemelisiniz. Gerçekten yıkıcı bir teknolojidir ve onunla başa çıkmak için ihtiyacınız olacak. Docker başlamak için harika bir yer ancak herkes için uygun olan en az bir başka alternatif var, IMO.


“... ama herkes için iyi olan en az bir tane daha uygulanabilir alternatif var.” Peki bu da uygulanabilir bir alternatif olabilir?
Trilarion

@Trilarion rkt (veya roket) . Şu anda Docker ile birlikte Kubernetes tarafından desteklenmektedir.
JimmyJames
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.