Docker’ı Docker içinde ç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 konteynerinin içinden erişim, ç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. İşlem hattı aşamalarınızdan biri bir görüntü oluşturursa veya kapsayıcılarla etkileşime girerse, Docker-in-Docker stratejisini kullanırsınız.
Docker-in-Docker Görüntüsü
Docker, aşağıdakiler aracılığıyla bağımsız bir görüntü olarak sağlanır:
docker:dind Docker Hub’da etiket. Bu görüntüyü başlatmak size yeni kapsayıcınızın içinde çalışan bir Docker arka plan programı yüklemesi sağlayacaktır. Sunucunuzu çalıştıran sunucunuzun arka plan programından bağımsız olarak çalışır.
dind konteyner, yani
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 kullanmak büyük bir uyarı ile birlikte gelir: ayrıcalıklı modu kullanmanız gerekir. Bu kısıtlama, köksüz kaplar kullanıyor olsanız bile geçerlidir. Ayrıcalıklı mod tarafından etkinleştirilir
--privileged bayrak yukarıda gösterilen komutta.
Ayrıcalıklı modun kullanılması, kapsayıcıya ana bilgisayar sisteminize tam erişim sağlar. Bu, Docker-in-Docker senaryosunda gereklidir, böylece iç Docker’ınız yeni kapsayıcılar oluşturabilir. Yine de bazı ortamlarda kabul edilemez bir güvenlik riski olabilir.
ile ilgili başka sorunlar var
dind fazla. Bazı sistemler, AppArmor ve SELinux gibi Linux Güvenlik Modülleri (LSM) ile çakışmalar yaşayabilir. Bu, iç Docker, dış arka plan programının tahmin edemediği LSM ilkeleri uyguladığında oluşur.
Başka bir zorluk, kapsayıcı dosya sistemleriyle ilgilidir. Dış arka plan programı, ana makinenizin aşağıdaki gibi normal dosya sisteminin üzerinde çalışır:
ext4. İç Docker arka plan programı da dahil olmak üzere tüm kapsayıcıları, yazma üzerine kopyalama (CoW) dosya sistemine oturacaktır. Dahili arka plan programı, mevcut bir CoW dosya sisteminin üzerinde kullanılamayan bir depolama sürücüsü kullanacak şekilde yapılandırılmışsa, bu uyumsuzluklara neden olabilir.
Bunun Yerine Ana Bilgisayarınızın Docker Soketini Takma
ile ilgili zorluklar
dind kullanımından tamamen kaçınarak en iyi şekilde ele alınır. Birçok senaryoda, ana makinenizin Docker soketini normal bir yuvaya monte ederek istediğiniz efekti elde edebilirsiniz.
docker konteyner:
docker run -d --name docker -v /var/run/docker.sock:/var/run/docker.sock docker:latest
İçindeki Docker CLI
docker görüntü, bulduğu Docker arka plan programı soketiyle 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ıza karşı yürütülür.
Bu, iç Docker tarafından oluşturulan kapsayıcıların, Docker kapsayıcısının yanı sıra ana bilgisayar sisteminizde bulunacağı anlamına gelir. Tüm kapsayıcılar, yuvalanmış Docker ebeveynin çocuğu gibi görünse bile kardeş olarak var olacaktır. Koşma
docker ps ana bilgisayarda veya kapsayıcınızın içinde çalıştırılsa da aynı sonuçları üretecektir.
Bu teknik, uygulama zorluklarını azaltır.
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 herhangi bir şey, Docker arka plan programına talimatlar gönderebilir, bu da ana makinenizde kapsayıcıları başlatma, görüntü çekme veya verileri silme yeteneği sağlar.
Her Yaklaşımın Ne Zaman Kullanılacağı
Docker-in-Docker aracılığıyla
dind tarihsel olarak CI ortamlarında yaygın olarak kullanılmaktadır. Bu, “iç” kapların ana bilgisayardan bir izolasyon katmanına sahip olduğu anlamına gelir. Tek bir CI koşucu kapsayıcı, ana bilgisayarın Docker arka planını kirletmeden her boru hattı kapsayıcısını destekler.
Sıklıkla işe yarasa da, bu yan etkilerle doludur ve amaçlanan kullanım durumu değildir.
dind. Docker’ın gelişimini kolaylaştırmak için eklendi, iç içe Docker kurulumları için son kullanıcı desteği sağlamadı.
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 arka plan programı soketini bağlama, daha güvenli, daha esnek ve bir
dind konteyner.
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ı VM benzeri hale gelir, böylece genellikle fiziksel veya sanal bir makinede tam anlamıyla çalışan yazılımları destekleyebilirler. Bu, herhangi bir özel yapılandırma olmadan Docker ve Kubernetes’i içerir.
Çözüm
Docker’ı Docker içinde çalıştırmak nispeten yaygın bir gereksinimdir. Kullanıcı tarafından oluşturulan ardışık düzenlerden kapsayıcı görüntü oluşturmalarını desteklemesi gereken CI sunucularını kurarken görmeniz daha olasıdır.
kullanma
docker:dind size kendi konteynerinin içinde çalışan bağımsız bir Docker arka plan programı sunar. Ana bilgisayardan doğrudan görünmeyen alt kapsayıcıları etkili bir şekilde oluşturur. Güçlü bir izolasyon sunuyor gibi görünse de,
dind aslında birçok uç vaka sorununu ve güvenlik endişesini barındırır. Bunlar Docker’ın işletim sistemi etkileşimlerinden kaynaklanmaktadır.
Ana makinenizin Docker soketini aşağıdakileri içeren bir konteynere monte etmek
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ı kullandığınızda başka ayar gerekmez.