Docker'ı docker'ın içinden çalıştırmak uygun mudur?


185

Jenkins'i Docker konteynerinin içinde çalıştırıyorum. Jenkins konteynerinin bir Docker ana makinesi olmasının iyi olup olmadığını merak ediyorum. Düşündüğüm Jenkins içerisinden her entegrasyon testi için yeni bir liman konteyneri başlatmak (veritabanları, mesaj brokerleri vb başlatmak için). Dolayısıyla, entegrasyon testleri tamamlandıktan sonra kaplar kapatılmalıdır. Docker kaplarının başka bir docker kapının içinden bu şekilde çalıştırılmasını önlemek için bir neden var mı?


11
Başka bir olasılık, docker soketini ana bilgisayardan kapta bir birim olarak monte etmektir. Bu, "kardeş" kaplar oluşturmanıza olanak tanır ve önbelleği yeniden kullanabilme avantajına sahiptir.
Adrian Mouat

4
Harici birimler bağlamak istediğiniz durumlarda ana bilgisayardan docker soketini kullanırken, docker arka plan programının çalıştığı gibi ana bilgisayara göre birim yolunu ayarlamanın gerekli olduğunu buldum. Kapları başlatan kapsayıcıya göre ayarlanması, yollar çakışmadıkça çalışmaz.
Jakob Runge

Yanıtlar:


224

Mümkünse, Docker'ı Docker (aka dind ) içinde çalıştırmaktan kaçınılmalıdır. (Kaynak aşağıda verilmiştir.) Bunun yerine, ana kapsayıcınızın kardeş kapları üretmesi ve onlarla iletişim kurması için bir yol ayarlamak istersiniz .

Docker'ın bir Docker konteynerinin içinde çalışmasını mümkün kılan özelliğin yazarı Jérôme Petazzoni , aslında yapmamak için bir blog yazısı yazdı . Açıkladığı kullanım durumu, OP'nin diğer Docker kapları içinde işleri yürütmesi gereken bir CI Docker kapsayıcısının tam kullanım durumu ile eşleşir.

Petazzoni, dind'in zahmetli olmasının iki nedenini listeler:

  1. Linux Güvenlik Modülleri (LSM) ile iyi işbirliği yapmaz.
  2. Ana kaplarda oluşturulan kaplar için sorun yaratan dosya sistemlerinde bir uyumsuzluk oluşturur.

Bu blog gönderisinden aşağıdaki alternatifi açıklıyor,

[En basit] Docker soketini -vbayrakla bağlayarak CI konteynırınıza maruz bırakmaktır .

Basitçe söylemek gerekirse, Docker-in-Docker ile birlikte bir şey kesmek yerine CI kabınızı (Jenkins veya diğer) başlattığınızda aşağıdakilerle başlayın:

docker run -v /var/run/docker.sock:/var/run/docker.sock ...

Şimdi bu kapsayıcı Docker soketine erişebilecek ve bu nedenle kapsayıcıları başlatabilecek. Dışında "alt" kapsayıcılar başlatmak yerine, "kardeş" kaplar başlayacak.


1
Docker komutlarını böyle yapmadan nasıl çalıştırırım sudo? Teşekkürler
c4k

3
Sen kullanıcıyı eklemeniz gerekir dockergrubuna: sudo usermod -aG docker $USER. Bundan sonra yeniden blog yazmanız gerekecek.
predmijat

2
Bir jetonun içinde nasıl relog?
thiagowfx

1
@AlexanderMills Aynı şey çünkü docker soketiniz /var/run/docker.sockmacos makinenizde mac için docker'ı çalıştırdığınızda da bulunur .
Bruce Sun

1
Pencereler ne olacak? ben yok/var/run/docker.sock
Abdelhafid

54

Docker içinde bir Docker konteynerinin nasıl çalıştırılacağı konusunda daha önce benzer bir soruyu yanıtladım .

Docker'ı docker'ın içinde çalıştırmak kesinlikle mümkündür. Önemli olan run, dış konteynere ekstra ayrıcalıklarla (ile başlayan --privileged=true) ve daha sonra bu konteynere docker'ı yüklemenizdir.

Daha fazla bilgi için bu blog yayınına bakın: Docker-in-Docker .

Bunun için olası kullanım durumlarından biri bu girişte açıklanmaktadır . Blog, bir Jenkins liman işçisi konteyneri içinde liman işçisi konteynırlarının nasıl oluşturulacağını açıklar.

Ancak Docker, Docker'ın içinde bu tür sorunları çözmek için önerilen yaklaşım değildir. Bunun yerine önerilen yaklaşım, bu yayında açıklandığı gibi "kardeş" kaplar oluşturmaktır

Bu nedenle, Docker'ı Docker'da çalıştırmak, birçok kişi tarafından bu tür sorunlar için iyi bir çözüm türü olarak kabul edildi. Şimdi, eğilim "kardeş" kapları kullanmaktır. Daha fazla bilgi için bu sayfada @predmijat tarafından verilen cevaba bakınız .


Bağlantı istasyonunda bağlantı istasyonundan kaçınma ile ilgili aşağıdaki açıklamaya bakın.
Dan Poltawski

6

Docker-in-Docker'ı (DinD) çalıştırmak sorun değil ve aslında Docker'ın (şirket) resmi bir DinD resmi var .

Bununla birlikte, güvenlik gereksinimlerinize bağlı olarak uygulanabilir bir alternatif olmayabilecek ayrıcalıklı bir kap gerektirdiği uyarısıdır.

Docker'ı kardeş kapları (Docker-of-Docker veya DooD) kullanarak çalıştırmanın alternatif çözümü ayrıcalıklı bir kap gerektirmez, ancak kapsayıcıyı bir bağlamdan başlattığınızdan kaynaklanan birkaç dezavantaja sahiptir. içinde çalıştığından farklı (yani, kapsayıcıyı bir kapsayıcıdan başlatırsınız, ancak kapsayıcı içinde değil, ana bilgisayarın düzeyinde çalışır).

Burada DinD vs DooD artılarını / eksilerini açıklayan bir blog yazdım .

Bunu söyledikten sonra, Nestybox (yeni kurduğum bir başlangıç) gerçek Docker-in-Docker'ı (ayrıcalıklı kaplar kullanmadan) güvenli bir şekilde çalıştıran bir çözüm üzerinde çalışıyor. Www.nestybox.com adresinden kontrol edebilirsiniz .


0

Evet, docker'ı docker'da çalıştırabiliriz, docker arka plan programının varsayılan olarak "-v / var / run" kullanarak ana docker'a ses olarak dinlediği unix sockeet "/var/run/docker.sock" i eklememiz gerekir. "/docker.sock:/var/run/docker.sock. Bazen, "sudo chmod 757 /var/run/docker.sock" yazabileceğiniz docker daemon soketi için izin sorunları ortaya çıkabilir.

Ayrıca, docker'ın ayrıcalıklı modda çalıştırılması gerekir, bu yüzden komutlar şöyle olur:

sudo chmod 757 /var/run/docker.sock

docker run --privileged = true -v /var/run/docker.sock:/var/run/docker.sock -it ...

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.