Neden Docker-in-Docker kötü kabul ediliyor?


21

Ağustos 2013'te Jérôme Petazzoni, Docker’da Docker’ı yarattı, dindkısacası Docker konteynerlerinin Docker Containers içinde oluşturulmasına izin verdi, bu işlevsellik çok popüler oldu ve Jérôme’in GitHub Deposu bin yıldız ve üç yüz çatal aldı.

Ağustos 2015'te iki yıl sonra piyasaya sürülen Docker 1.8'den itibaren, Docker'daki Docker, Docker tarafından doğrudan kutudan desteklenir. Bununla birlikte, Docker’da Docker’ın kullanılması, görünüşe göre Jérôme’nin Post: Docker-Docker’ı CI’nız için mi kullanacağınız veya test ortamınızla mı ilgili? İki kere düşün. Docker’daki Docker’ın Sürekli Entegrasyon için mükemmel bir seçim olmama nedenlerine odaklanıyor.

Neden Docker’ı Docker’da kullanmak kötü kabul ediliyor? Sadece kaplumbağaları tamamen engellemekten kurtulmak için bir durum mu? veya performansla ilgili konular?

Bütünüyle kaplumbağalar!


Okumaktan başka docker ile aşina değilim. Ancak bunu düşününce, donanım üzerinde ana bilgisayar işletim sistemi varmış gibi hissediyorum, ana bilgisayar bir kap yükler, sonra bu kap başka bir yük alır. Fikir bir görüntü dağıtmak için verilen ek yükü gibi görünüyor. Bir resmin resminin resmi ... Bu q'ya verilen cevaplarla da ilgileniyorum.
İade Yok İadesi Yok

Cevabınızı sorunuza bağlıyorsunuz ... yoksa bir şey mi eksik?
AnoE

Yanıtlar:


16

Sürekli Entegrasyon Kaygıları

Kısacası: Docker’daki Dock (dind) eşzamanlılığı iyi işlemez.

CI için dind kullanmamanızın nedeni, Docker'ın depolama için kullandığı dizine (normalde /var/lib/docker) özel erişim sağlayacak şekilde tasarlanmasıdır . Dind buna saygı duymuyor çünkü tüm alt işlemler bu dizini aynı anda kullanıyor. Her seferinde (örneğin CI'den) her yeniden oluşturduğunuzda, bu dizindeki uygulamanızla ilgili herhangi bir şey silinerek sıfırdan başlamaya zorlanabilir. Kullanıcılarınız, ödeme ayrıntılarını girip "Satın Al" ı tıkladılar ve aniden bir şey yapmamışlar gibi giriş ekranlarında aniden kendilerini bulsa nasıl sevinirdi? Bu sadece iyi UX değil. Bir seferde iki yeniden inşa olur mu? Bu, katılan herkes için (veri bütünlüğünüz dahil) gerçekten kötü bir şekilde bitecek.

Diğer endişeler

OP'nin gönderdiği bağlantıdan, güvenlik politikaları, sistemin güvenlik politikalarını, açıkça yasaklanmadıkça daha düşük bir konteynerin dış konteyner kaynaklarına erişebileceği çok "CSS benzeri" bir biçimde uygulamaya çalışacağı için ortaya çıkacaktır. "Mywebsite.com/../another_folder/private_resource.txt" gibi bir şey yaparak web sunucusu kaynaklarına ne zaman erişebileceğinizi hatırlıyor musunuz? Ayrıca, bazen dosya sistemleri iç içe olduklarında birbirleriyle iyi oynamazlar.

Çözüm

Neyse ki, OP’deki blog gönderisinin bu sorun için iyi bir çözümü var. İhtiyaçlarınızı "Docker'da çalışan CI sisteminizden Docker kapsayıcılarını oluştur / çalıştır / çalıştır / zorla" ile karşılanmadıkça , Docker soketindeki (genellikle ) -vmodunu (kapsayıcınıza veri hacmi ekleme /var/run/docker.sock:/var/run/docker.sock) kullanabilirsiniz (genellikle ) "paylaşılan" veri hacmine ihtiyacınız var. Bu konteynırlar, eşzamanlı IO'yu zorlamak için, altındakiler yerine ana boyunca başlatılacaktır. Şimdi dind olarak değil Docker eşzamanlılık için inşa olmamak ile gelen olumsuzlukları olmadan aynı şeyi (neredeyse) var.

Referans (OP'den): CI'nız için docker-in-Docker mı yoksa test ortamınız mı? İki kere düşün.


İşte Jenkins için açıklanan yaklaşım (dood) bir örnek, henüz kullanırken çeşitli sorunlar bildirdi hub.docker.com/r/psharkey/jenkins-dood
rombob

Bu açıklamadan, benim durumumda zorlanmadan kaçınılması gerekip gerekmediğini hala tam olarak söyleyemem ... Yapım aracım bir dock kabında çalışıyor ve aşağıdakileri yapıyor: 1. Checkout repo.2. Start container & mount repo.3. Run some build-/test script inside container.Temsilci başına, sadece bir tane var ' dind'-container çalışıyor. Bu kullanım durumunda hala sorun var mı?
helmesjo
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.