Docker’ın teknoloji sektöründeki patlayıcı büyüme ve hakimiyeti, en temiziyle ifade etmek gerekirse inanılmaz düzeyde. Ancak Docker’ın yükselişi bu kadar hızlı olduğundan, birçok kişi onu gizemli, devrimci, tamamen yeni bir yöntemmiş gibi görmeye meyilli. Oysa gerçek çok daha basit: Linux, konteynerler için temeli decades önce attı ve Docker bunu kullanmanın cazip bir yolunu buldu.
Tüm Docker konteynerleri, ana makinenin Linux çekirdeğini paylaşır ve düzgün çalışmaları için beş temel çekirdek özelliğine dayanır. Bu beş özelliği anladığınızda, Docker’ın nasıl çalıştığını hem etkili hem de güvenli şekilde kullanmanın nasıl işlediğini anlamak çok daha kolay hale gelir.
Not: macOS veya Windows üzerinde Docker, Linux konteynerleri için bir çekirdek sağlamak üzere bir Linux VM kullanır.


Namespaces konteynerlerinize kör lüle takar
Burada görecek bir şey yok
Masaüstü Linux üzerinde doğrudan çalışan uygulamalar, doğru izinlerle dosya sisteminize, bağlı cihazlara, ağ arayüzüne, aktif süreçlere ve işletim sisteminizin diğer parçalarına erişebilir. Bu, bazı görevleri pratik hale getirebilir, ancak her zaman kullanışlı değildir. Aynı zamanda LAN veya WAN’a açık uygulamalar için bazı güvenlik endişelerini de beraberinde getirir.
Linux çekirdeğinin Namespaces özelliği, uygulamaların ve süreçlerin ana sistem görünümünü görmesini engeller. Aynı zamanda bir sürecin neye erişebileceğini tanımlamak için de kullanılabilir. Docker’ı birkaç dakikadan fazla kullandıysanız, bunun nereye gittiğini tahmin etmişsinizdir; Docker, konteynerleri ana makineden izole etmek ve dosya sistemindeki nokta bağlama noktaları gibi sınırlar koymak için Namespaces’ten yararlanır.
Ancak bu ayrılmanın farkında olmanız gereken sınırları var. Birincisi, tüm konteynerleriniz yine de ana makinenin çekirdeğini paylaşır, bu nedenle çekirdek açıkları bir konteyner üzerinden sömürülebilir.
Cgroups kaynak kullanımını kontrol etmeye yardımcı olur
Konteynerler yine de yeterince sık çöker, ama ne olur
Ad alanları konteynerları yalnızca izole eder; bir konteynerın tüketebileceği kaynak miktarını sınırlamaz. Bu nedenle Docker, konteynerlerin CPU ve RAM kullanımına sınır koymak için “cgroups” çekirdek özelliğini kullanır. Bu sınırlar açıkça belirlenebilir, ancak aynı zamanda kullanılabilir kaynaklara göre değişebilir ve bu da konteynerların çökertme riski olmadan mümkün olduğunca hızlı çalışabilmesini sağlar.
Konteynerların çeşitli kaynaklara erişim biçimini kontrol eden bir sürü farklı cgroup alt sistemi vardır; eş zamanlı çalışan süreç sayısı gibi aklınıza hiç gelmeyecek konuları da kapsar (buna PIDs alt sistemi denir ve bazı kötü niyetli sömürüleri engellemeye yardımcı olur).
Bununla birlikte, Docker’ın kaynakları otomatik olarak sınırlamadığını belirtmek gerekir. Sınırları çalışma sırasında kendiniz belirlemeniz gerekir.

OverlayFS şişkinliği uzaklaştırır
Buraya kopya dosya yok, patron
Bir çekirdek tek başına uygulama çalıştıramaz ve Docker konteynerları masaüstü işletim sisteminizin işletim sistemi düzeyindeki kütüphanelere veya araçlara erişemez. Bu nedenle Docker görüntüleri, çalışmaları için gereken kullanıcı alanı araçları, ikili dosyalar ve kütüphanelerle paketlenir.
Bu, verimsizliğe ve boşa harcanan alana yol açabilir; çünkü çoğu Docker görüntüsü aynı temel ortak dosya kümesini içerir. Ancak Docker, Bu sorunu Overlay Dosya Sistemleri (OverlayFS) kullanarak dengeler.
Fikir ilk bakışta biraz karmaşık görünse de, parçalara ayrıldığında oldukça sezgiseldir. Temel olarak, Docker görüntüleri ortak dosyaların paylaşılmasına olanak tanıyan bir dizi katmana ayrılır; bu sayede konteynera özgü dosyaların bütünlüğü bozulmadan paylaşım sağlanır.
Öncelikle, söz konusu temel kullanıcı alanı araçlarını ve kütüphaneleri içeren salt okunabilir LowerDir bulunur. Konteynerlar, kopya dosyalar sorunuyla karşılaşmamak için LowerDir’i paylaşır; aksi takdirde bu durum depolama alanını tüketir ve yükleme sürelerini uzatır.
Ardından, tek bir container’a özgü tüm öğeleri barındıran read-write UpperDir geliyor. Zeki bir MergedDir, LowerDir ile UpperDir’i bir container’ın kendi kök klasörü olarak gördüğü bir yapıya birleştirerek “izolasyon”in en iyi yönünü korurken sisteminize yük bindirmez. (Aynı zamanda container süreçleri için geçici depolama hizmeti veren bir WorkDir de vardır.)
OverlayFS, Docker’ın kullanabileceği tek depolama arka ucu değil, ancak en yaygın olanıdır ve Docker dosyaları üzerinde derinlemesine inerken karşılaşabileceğiniz, verimsiz görünen bazı tuhaflıkları açıklamaya yardımcı olur.
Capabilities kök ayrıcalıklarını denetim altında tutar
Docker container’larının her istediğini yapmasını istemezsiniz, değil mi?
Kök ayrıcalıkları, Linux’un en tehlikeli (ve ara sıra en komik) tuhaflıklarından biridir. Standart bir Linux ortamında, root kullanıcısı istediği her şeyi, sinir bozucu güvenlik duvarları ya da dosya izinlerinden herhangi bir itiraz olmadan, istediği zaman değiştirebilir.
Bazı dağıtımlar koruyucu önlemler alır, ancak genel olarak Linux, işleri bozan aptalca kararlar vermenizi engellemez. Kök erişimine sahip kötü amaçlı süreçleri de engellemez.
Docker container’ları, özellikle ağ üzerinden erişilebilir hale getirilenler, tam kapsamlı kök ayrıcalıklarına sahip olmamalıdır. Bu nedenle Docker, Linux çekirdeğinin “capabilities” özelliğini kullanarak bir container’ın gücünü oldukça güvenli ama aynı zamanda oldukça pratik bir şekilde parçalar ve sınırlar.
Docker container’ları için varsayılan profil, dosya sistemlerini bağlama ve sistem yapılandırmalarıyla oynam gibi yüksek riskli çok sayıda capability’yi engeller. Ancak 1024 altındaki portlar için ağ bağlama hizmetleri gibi çoğu zararsız ya da pratik olanı yerinde bırakır.
Docker’ın capabilities’lerini ayrıca ince ayar yapabilirsiniz, ancak ne yaptığınızı bilmiyorsanız gerçekten herhangi bir capability eklememeli ya da kaldırmamalısınız.
Seccomp container’ların kötü sistem çağrıları yapmasını engeller
Savunmanın son hattı
Docker’ın kullandığı çekirdek özelliklerinin çoğu, örneğin yukarıda bahsedilen “yetkiler” (capabilities) özelliği gibi, zarar görmüş veya kötü niyetli konteynerlerin makinenizi bozmasını veya ağınızdaki diğer cihazlara saldırmasını engeller. Ancak bu özellikler her zaman yeterli olmayabilir; bu yüzden Docker, son ve nihai savunma hattı olarak “seccomp”a güvenir.
Seccomp temelde, önceden tanımlanmış bir sistem çağrıları kümesini engelleyen bir güvenlik duvarıdır. Yapılandırmanın birçok yolu vardır, ancak Docker’ın varsayılan seccomp profili, konteynerlerin ptrace veya unshare gibi saldırımcıların veya kötü yazılımların ayrıcalıkları yükseltmek için kullanabileceği sistem çağrıları yapmasını engellemek üzere tasarlanmıştır.
Aynı şekilde, ne yaptığınızı bilmiyorsanız burada Docker’ın varsayılanlarına bağlı kalmak en iyisidir. Ancak ekstra izole gerektiren bir iş yükü gerekiyorsa, özel bir seccomp izin listesi oluşturmanız gerekebilir.
Bilgi Testi
8 Soru · Bilginizi Test Edin
Docker hakkında ne biliyorsunuz?
Bilgi Yarışması
Konteynerler, görüntüler ve orkestrasyon — Docker hakkında gerçekten ne kadar bildiğinizin farkınaessin.
Konteynerler
Ağ
Komutlar
Tarihçe
Kavramlar
Başla
01 / 8
Tarihçe
Docker ilk kez hangi yılda halka açık biçimde yayınlandı?
A
2010
B
2011
2013
2015
Doğru! Docker, ilk kez Mart 2013’te Solomon Hykes tarafından PyCon’da halka açık biçimde yayınlandı. Kısa sürede modern yazılım geliştirmedeki en etkili açık kaynak projelerinden biri haline geldi.
Hayır, tam doğru değil. Docker, Mart 2013’te Solomon Hykes tarafından PyCon’da gösterildiğinde halka açık biçimde sahneye çıktı. Sadece birkaç yıl içinde geliştiricilerin yazılım inşa etme ve yayma biçimini dönüştürdü.
Devam
02 / 8
Kavramlar
Bir Docker görüntüsü ile bir Docker konteyneri arasındaki temel fark nedir?
A
Bir görüntü çalışan bir örnektir, konteyner ise statik bir şablon
B
Bir görüntü salt-okunur bir şablon, konteyner ise bu görüntünün çalışan bir örneğidir
C
Bir görüntü kalıcı verileri saklar, konteyner ise yalnızca uygulama kodunu içerir
D
Fark yok — terimler yerinde kullanılıyor
Doğru! Bir Docker imajı, ortamı tanımlayan salt-okunur bir taslak iken, bir konteyner bu imajdan oluşturulan canlı ve çalıştırılabilir bir örnektir. Tek bir imajdan birçok konteyner çalıştırabilirsiniz.
Tam değil. İmaj statik, salt-okunur bir şablonken, konteyner aslında çalıştırdığınız şeydir. İmajı bir tarif, konteyneri ise bu tariften hazırladığınız yemek gibi düşünün.
Devam
03 / 8
Komutlar
Çalışan tüm Docker konteynerlerini listelemek için hangi komutu kullanırsınız?
A
docker list
B
docker container show
C
docker ps
D
docker status
Doğru! docker ps komutu, çalışan tüm konteynerleri listeler. -a bayrağını eklemek durdurulmuş konteynerler dahil tüm konteynerleri gösterir — bilinmesi çok faydalı bir püf noktası.
Tam değil. Doğru komut docker ps olup, çalışan konteynerleri listeler. Bu isim, Unix’teki süreçleri listelemek için kullanılan ps komutundan gelir ve Docker’ın konteyneri-süreç felsefesini yansıtır.
Devam
04 / 8
Kavramlar
Bir Docker imajı inşa etmek için kullanılan talimatları tanımlayan dosya hangisidir?
A
docker-compose.yml
B
Containerfile
C
Dockerfile
D
.dockerignore
Doğru! Bir Dockerfile, Docker’ın imaj inşa etmek için kullandığı bir dizi talimat içeren düz metin dosyasıdır. Her talimat imajda yeni bir katman oluşturur ve bunu inşa işlemlerini verimli ve önbelleklenebilir kılar.
Tam değil. Bir Docker imajı inşa etmek için kullanılan dosyaya Dockerfile denir. docker-compose.yml de önemli bir Docker dosyası olsa da, bu imaj inşa adımlarını değil, çok konteynerli uygulama kurulumlarını tanımlar.
Devam
05 / 8
Ağlar
Docker, ağ belirtmeden yeni bir konteyner oluştururken varsayılan olarak hangi ağ sürücüsünü kullanır?
A
host
B
overlay
C
none
D
bridge
Doğru! Docker, varsayılan olarak bridge ağ sürücüsünü kullanır. Ana bilgisayarda özel bir iç ağ oluşturur ve aynı bridge ağı üzerindeki konteynerler birbirleriyle iletişim kurabilirken dışarıdan izole kalmaya devam eder.
Tam değil. Varsayılan ağ sürücüsü bridge’dir. Bu, makinanızda konteynerlerin birbirleriyle konuşabileceği ancak dış trafiğin bağlantı noktası eşlemesi (port mapping) ile açıkça yönlendirilmesi gereken izole bir ağ oluşturur.
K devam
06 / 8
Bu komutlar
Docker Hub gibi bir kayıt defterinden görüntü indirmek için hangi Docker komutu kullanılır?
A
docker fetch
B
docker pull
C
docker get
D
docker download
Doğru! docker pull, bir görüntüyü kayıt defterinden yerel makinanıza indirir. Bir etiket belirtmezseniz, Docker varsayılan olarak latest etiketli görüntüyü otomatik olarak çeker.
Tam değil. Doğru komut docker pull'dir. Docker Hub gibi bir kayıt defterinden bir görüntü çeker ve yerel olarak saklar, böylece bundan konteynerler oluşturabilirsiniz. Karşıt komut olan docker push ise görüntüleri kayıt defterine yükler.
K devam
07 / 8
Kavramlar
Docker, Linux üzerinde konteynerleri birbirinden ve ana sistemden izole etmek için ne kullanır?
A
Sanal makineler ve hypervisor'lar
B
Tam işletim sistemi çekirdeği kopyaları
C
Linux namespace'leri ve cgroups
D
BSD jails ve Zones
Doğru! Docker, izole etmek için Linux namespace'lerini (işlem, dosya sistemi ve ağları ayrı tutar) ve CPU ve bellek gibi kaynak kullanımını sınırlamak için cgroups (control groups / kontrol grupları) kullanır. İşte konteynerlerin VM'lere kıyasla bu kadar hafif olmasının nedeni de budur.
Tam değil. Docker, izole etmek için Linux namespace'lerini ve cgroups'a güvenir. Sanal makinelerin aksine, konteynerler ana işletim sistemi çekirdeğini paylaşır ve işte onları bu kadar hızlı başlatıp kaynakları verimli kullanmasını sağlayan da budur.
K devam
08 / 8
Kavramlar
Docker Compose temel olarak ne için kullanılır?
A
Optimize edilmiş üretim Docker görüntüleri oluşturma
B
Yalıtılmış çoklu kapsayıcı uygulamaları tek bir yapılandırma dosyasıyla yönetme ve orkestrasyon
C
Büyük ölçekli üretim kümelerinde Kubernetes'i değiştirme
D
Tek tek kapsayıcıların CPU ve bellek kullanımını izleme
Doğru! Docker Compose, çoklu kapsayıcı uygulamaları docker-compose.yml adlı bir YAML dosyası kullanarak tanımlamanıza ve çalıştırmanıza olanak tanır. Tek bir docker compose up` komutuyla, veritabanları, API’ler ve ön uçları da içeren tüm bir uygulama yığınını ayağa kaldırabilirsiniz.
Tam değil. Docker Compose, çoklu kapsayıcı uygulamaları tek bir YAML yapılandırma dosyası üzerinden tanımlamak ve yönetmek için tasarlanmıştır. Özellikle birden fazla hizmetin birlikte çalışması gerektiği yerel geliştirme ortamlarında oldukça popülerdir.
Meydan Okuma Tamamlandı
Puanınız
Oynadığınız için teşekkürler!
Evet, bu biraz basitleştirme
Docker kapsayıcıları yalnızca birkaç Linux çekirdeği özelliğine dayanmaz. Kullanıcı alanı bileşenleri, ağ araçları ve bir daemon gibi altta yatan birçok başka şey de vardır.
Yine de Docker’ı çalıştıran beş temel çekirdekle özelliğini anlamak, konuyu perspektif içine oturtur. Kapsayıcılarınız tamamen yalıtılmış şekilde çalışan bağımsız sistemler değil, tek bir çekirdeğe dayanan süreçlerin bir koleksiyonudur. Bu süreçler arasındaki sınırların yanı sıra, bir kapsayıcının sömürülmesi durumunda sisteminizin güvenliği de ancak Docker yapılandırmanız kadar güçlüdür.
Bu Gelişmeyi Toplulukta Değerlendirin
Haber hakkındaki düşüncelerinizi, donanım deneyimlerinizi ve teknik sorularınızı topluluk üyeleriyle anlık olarak tartışın.
Bu gelişme hakkında düşüncelerinizi, donanım deneyimlerinizi veya sorularınızı Topluluk Forumumuzda paylaşın.
Foruma Katıl & Yanıtla ➔




Söz sizde.
Deneyiminizi, sorularınızı ve katkılarınızı paylaşın. E-posta adresiniz yayımlanmaz.