Docker sanallaştırma kovasına atılır, çünkü insanlar bir şekilde altındaki donanımı sanallaştırdığını varsayar. Bu, Docker'ın kullandığı terminolojiden, özellikle de konteyner teriminden geçen bir yanlış isimdir.
Ancak Docker, bir sistemin donanımını sanallaştırma konusunda büyülü bir şey yapmıyor. Aksine, Linux Çekirdeğinin, bir sürecin ağ, dosya sistemi ve etkileşime girdiğiniz yanılsamasını vermesi için izinler (diğer şeylerin yanı sıra) gibi kaynaklarla etkileşime girmesini sağlayan temel tesisler etrafında "çitler" kurma yeteneğinden yararlanıyor. tamamen işlevsel bir sistemle.
İşte bir Docker konteyneri başlattığımızda neler olup bittiğini gösteren bir örnek /bin/bash
.
$ docker run -it ubuntu:latest /bin/bash
root@c0c5c54062df:/#
Şimdi bu kabın içinden kaçmak biz eğer ps -eaf
:
Docker kapsayıcısını barındıran ana sisteme giriş yaptığımız başka bir terminal sekmesine geçerek, kapsayıcının "gerçekten" kapladığı işlem alanını görebiliriz:
Şimdi Docker sekmesine geri dönüp içindeki çeşitli işlemleri başlatıp bunların arkaplanını bırakırsak, başlangıçta Docker konteyner lansmanının bir parçası olarak başlattığımız birincil Bash işlemi altında çalışan birkaç alt işlem olduğumuzu görebiliriz.
NOT: İşlemler sleep 1000
arkaplanlı 4 komuttur.
Docker konteynerinin içerisindeki işlemlere, 48-51 arasındaki işlem kimlikleri (PID'ler) atandığına dikkat edin. Bunları ps -eaf
çıktılarında da görün :
Bununla birlikte, bu sonraki görüntüyle Docker'ın gerçekleştirdiği "sihir" in çoğu ortaya çıkar.
4 sleep 1000
sürecin gerçekte yalnızca orijinal Bash sürecimize göre alt süreçler olduğunu görün. Ayrıca, orijinal Docker konteynerimizin /bin/bash
aslında Docker daemon'unda bir alt işlem olduğunu unutmayın .
Şimdi, orijinal sleep 1000
komutların bitmesi için 1000+ saniye beklememiz ve ardından 4 yenisini daha çalıştırıp şöyle bir Docker konteynerini başlatmak için:
$ docker run -it ubuntu:latest /bin/bash
root@450a3ce77d32:/#
Ana bilgisayarın çıktısı ps -eaf
şöyle görünür:
Ve diğer Docker konteynerleri de Docker daemonu altındaki süreçler olarak ortaya çıkacak.
Görüyorsunuz, Docker gerçekten sanallaştırmıyor ( geleneksel anlamda ), çeşitli Çekirdek kaynakları etrafında "çitler" inşa ediyor ve belirli bir süreç + çocuklar için görünürlüğünü sınırlıyor.