Docker Inside Docker nasıl (ve neden) çalıştırılır - CloudSavvy BT
Docker'ı Docker'da çalıştırmak, zaten kapsayıcılı bir ortamda görüntüler oluşturmanıza ve kapsayıcıları başlatmanıza olanak tanır. Alt veya kardeş kapsayıcıları başlatmak isteyip istemediğinize bağlı olarak bunu başarmak için iki olası yaklaşım vardır.
Docker'a bir Docker kapsayıcısının içinden erişmek, çoğunlukla CI ve CD sistemleri bağlamında arzu edilir. İşlem hattınızı çalıştıran aracıları bir Docker kapsayıcısında barındırmak yaygındır. Ardışık düzen aşamalarınızdan herhangi biri kapsayıcıları görüntüler veya bunlarla etkileşim kurarsa, Docker-in-Docker stratejisini kullanırsınız.
özet
Docker-in-Docker görüntüsü
Docker, tek başına bir görüntü olarak teslim edilir. docker:dind
Docker Hub'da etiket. Bu görüntünün önyüklenmesi size yeni kapsayıcınızda Docker arka plan programının çalışan bir kurulumunu verecektir. Sunucunuzun çalıştıran arka plan programı ne olursa olsun çalışacaktır. dind
konteyner, bu nedenle docker ps
konteynerin içinde farklı sonuçlar verecektir docker ps
ev sahibinizde.
docker run -d --privileged --name docker -e DOCKER_TLS_CERTDIR=/certs -v docker-certs-ca:/certs/ca -v docker-certs-client:/certs/client docker:dind
Docker-in-Docker'ı bu şekilde kullanmanın önemli bir dezavantajı, ayrıcalıklı modu kullanmak zorunda olmanızdır. Bu kısıtlama, kapsayıcıları kök olmadan kullanıyor olsanız bile geçerlidir. Ayrıcalıklı mod tarafından etkinleştirilir --privileged
yukarıdaki komutta bayrak.
Ayrıcalıklı modun kullanılması, kapsayıcıya ana bilgisayar sisteminize tam erişim sağlar. Bu, bir Docker-in-Docker senaryosunda, dahili Docker'ınızın yeni kapsayıcılar oluşturabilmesi için gereklidir. Ancak bu, bazı ortamlarda kabul edilemez bir güvenlik riskini temsil edebilir.
ile ilgili başka sorunlar var dind
çok fazla. Bazı sistemler, AppArmor ve SELinux gibi Linux Güvenlik Modülleri (LSM) ile çakışmalar yaşayabilir. Bu, dahili Docker, harici arka plan programının tahmin edemediği LSM ilkeleri uyguladığında gerçekleşir.
Başka bir zorluk, kapsayıcı dosya sistemleriyle ilgilidir. Harici arka plan programı, ana makinenizin aşağıdaki gibi normal dosya sisteminde çalışır: ext4
. Ancak, dahili Docker arka plan programı da dahil olmak üzere tüm kapsayıcıları, yazma üzerine kopyalama (CoW) dosya sistemine güvenecektir. Dahili arka plan programı bir p kullanmak üzere yapılandırılmışsa, bu uyumsuzluklara neden olabilir.iloMevcut bir CoW dosya sisteminde kullanılamayan depolama.
Bunun yerine ana makinenizin Docker fişini takın
ile ilgili zorluklar dind
kullanımından tamamen kaçınarak en iyi şekilde tedavi edilir. Birçok senaryoda, ana makinenizin Docker soketini bir kutuya monte ederek istediğiniz efekti elde edebilirsiniz. docker
konteyner:
docker run -d --name docker -v /var/run/docker.sock:/var/run/docker.sock docker:en son
İçindeki Docker CLI docker
görüntü, bulduğu Docker daemon soketi ile etkileşime girer. /var/run/docker.sock
. Ana bilgisayarınızın soketini bu yola monte etmek şu anlama gelir: docker
kapsayıcının içinde çalıştırılan komutlar, mevcut Docker arka plan programınızda çalışır.
Bu, dahili Docker tarafından oluşturulan kapsayıcıların, Docker kapsayıcısının yanında ana bilgisayar sisteminizde bulunacağı anlamına gelir. İç içe geçmiş Docker ebeveynin çocuğu gibi görünse de tüm kapsayıcılar kardeş olarak var olacaktır. işleyen docker ps
ana bilgisayarda veya kapsayıcınızın içinde çalıştırılsa da aynı sonuçları üretecektir.
Bu teknik, uygulamanın zorluklarını hafifletir. dind
. Docker soketinin montajının kendisi potansiyel bir güvenlik sorunu olmasına rağmen, ayrıcalıklı modu kullanma ihtiyacını da ortadan kaldırır. Sokete erişimi olan herkes, ana makinenizde kapsayıcı başlatma, görüntüleri çıkarma veya verileri silme yeteneği sağlayan Docker arka plan programına talimatlar gönderebilir.
Her bir yaklaşım ne zaman kullanılır?
Docker-in-Docker aracılığıyla dind
CI ortamlarında her zaman yaygın olarak kullanılmıştır. Bu, "iç" kapsayıcıların ana bilgisayardan bir yalıtım katmanına sahip olduğu anlamına gelir. Tek bir CI çalışma zamanı kapsayıcısı, ana bilgisayarın Docker arka planını kirletmeden her bir ardışık düzen kapsayıcısını destekler.
Bu genellikle işe yarasa da yan etkilerle doludur ve amaçlanan kullanım durumu değildir. dind
. İç içe Docker kurulumları için son kullanıcı desteği sağlamak için değil, Docker'ın geliştirilmesini kolaylaştırmak için eklenmiştir.
Yaratıcısı Jérôme Petazzoni'ye göre dind
Soket tabanlı yaklaşımı benimsemek tercih ettiğiniz çözüm olmalıdır. Ana makinenizin soket arka plan programını bağlamak daha güvenli, daha esnek ve bir dind
alıcı.
Kullanım durumunuz kesinlikle ihtiyacınız olduğu anlamına geliyorsa dind
, onu dağıtmanın daha güvenli bir yolu var. Modern Sysbox projesi, ayrıcalıklı modu kullanmadan diğer çalışma zamanlarını iç içe geçirebilen özel bir kapsayıcı çalışma zamanıdır. Sysbox kapsayıcıları sanal makinelere benzer hale gelir, böylece fiziksel veya sanal bir makinede tipik olarak işletim sistemi olmadan çalışan yazılımları destekleyebilirler. Bu, herhangi bir özel yapılandırma olmadan Docker ve Kubernetes'i içerir.
Sonuç
Docker'ı Docker'da çalıştırmak nispeten yaygın bir gereksinimdir. Kullanıcı tarafından oluşturulan ardışık düzenlerden kapsayıcı görüntü derlemelerini desteklemesi gereken CI Sunucularını yapılandırırken bunu büyük olasılıkla göreceksiniz.
kullanma docker:dind
size kendi kapsayıcısında çalışan bağımsız bir Docker arka plan programı sunar. Ana bilgisayardan doğrudan görülemeyen alt kapsayıcıları verimli bir şekilde oluşturur. Güçlü bir izolasyon sunuyor gibi görünse de, dind
aslında birçok çevresel vaka sorununa ve güvenlik sorununa ev sahipliği yapar. Bunlar Docker işletim sisteminin etkileşimlerinden kaynaklanmaktadır.
Ana makinenizin Docker soketini, aşağıdakileri içeren bir kapsayıcıya monte edin: docker
ikili daha basit ve daha öngörülebilir bir alternatiftir. Bu, iç içe Docker işleminin kendi kardeşleri haline gelen kapsayıcıları başlatmasını sağlar. Soket tabanlı yaklaşımı kullanırken başka hiçbir parametre gerekli değildir.