Docker
Merhabalar;
Bugün sizlere “Docker” teknolojisi ile ilgili elimden geldiğince anlaşılır bilgiler sunmaya çalışacağım.
“Docker” yapısınını temelini anlatmayı hedeflediğim bu yazımdan sonra ikinci yazımda “Docker”’ın
daha detayına girmeyi hedefliyorum. Yorumlarınız ikinci yazı için bana iyi bir temel oluşturacağından
lütfen düşüncelerinizi iletmenizi çok rica ederim.
Sanallaştırma hayatımıza girmeden evvel nasıl bir yapı ile ihtiyaçlarımızı karşılıyorduk? Şekil 1’de
görüldüğü gibi veri merkezimize her izole olması gereken uygulamalarımız için farklı fiziksel sunucu
alıyor ve her birine işletim sistemi yükleyerek uygulamalarımızı bu fiziksel sunucular üzerinde
yapılandırıyorduk. Bu yöntem aşırı maliyetinin yanı sıra deployment sürecinin çok yavaş olmasını da
beraberinde getiriyordu. Ek olarak migrasyonlarda zorluklar yaşıyorduk.

Şekil 1. Geleneksel mimari

Sonra hayatımıza sanallaştırma girdi. Bu yeni yapıda hipervizör katmanı sayesinde tek bir fiziksel
sunucu üzerinde birden fazla işletim sistemi yapılandırabildik. Kaynaklarımızı çok daha verimli
kullanmaya başladık. Migrasyon ve deployment süreçlerimizi daha hızlandırdık. Şekil 2 bize
sanallaştırma dünyasının genel bir resmini göstermektedir. Bu yapının daha fazla maliyet avantajı
sağladığı ortadadır. Elbette daha ölçeklenebilir bir mimari sunduğu da açıktır. Buna rağmen, dikkat
ederseniz her bir “guest” için hala farklı işletim sistemi kurmamız gerekmekte ve sonucu olarakta
“kernel” duplikasyonundan kaçamamaktayız. Ek olarak uygulama taşınabilirliği ile ilgili esnekliğe
yeterince sahip değildir. Bu durumu çözmek için “container” bazlı sanallaştırma “container-based
virtualization” teknolojisi hayatımıza girmiş durumdadır.

Şekil 2. Hipervizör teknolojisi

Şekil 3’de “container” bazlı sanallaştırma teknolojisinin görselini inceleyebiliriz. “Container engine”
sayesinde uygulamalar ihtiyaç duyduğu kütüphanelerle birbirinden izole olacak şekilde
çalışabilmektedir. Bu yapı, maliyet avantajı getirdiği gibi hızlı deployment yapılabilmesini sağlamakta
ve uygulamaların taşınabilirliğini mümkün kılmaktadır.

Şekil 3. “Container” bazlı sanallaştırma yapısı

Burda anahtar soru: “iki farklı java uygulamasını, iki farklı JRE ortamında nasıl çalıştırabiliriz” dir. Bu
yapının bize sağladığı avantaj “runtime” izolasyonu getirmesidir. Şekil 4, anlatmak istediğimiz durumu
resmetmektedir. Bu yeni teknoloji “Docker” olarak isimlendirilmektedir.


Şekil 4. “Runtime” izolasyon

“Docker”, “client-server” mimarisini kullanmaktadır. Kullanıcı doğrudan “docker daemon” ile
haberleşemez. Bunun yerine “docker client” üzerinden “docker daemon” ile haberleşir. Şekil 5,
Docker clint-server mimarisini özetlemektedir.

Şekil 5. Docker client-server mimarisi

“Docker client”, kullanıcı arabirimidir. Kullanıcıdan komutları alır ve “docker daemon” ile haberleşir.
İki tür “docker client” vardır. Kitematic docker client (GUI) ve “command line docker client”.


Şekil 6. Command line Docker client

“Docker daemon”, host üzerinde devamlı çalışan bir prosestir. “Docker server”, “Docker engine”
olarakta isimlendirilir.


Şekil 7. Docker daemon

Tipik bir kurulumda “Docker client” ve “Docker daemon” aynı Linux host üzerinde çalışır.


Şekil 8. “Docker” mimarisi

“Docker” daemon, Linux olmayan platformlarda çalışmaz çünkü Linux kernel spesifik bazı
fonksiyonları kullanır. Windows ve OS X için, Linux VM içerisinde “Docker” daemon çalışır. Eğer Mac
sürümünüz OS X 10.10.3.’den, Windows sürümünüz ise Windows 10’dan düşükse “Docker Toolbox” i
sisteminize yüklemeniz gerekmektedir. “Docker” ın resmi kurulum web sayfasına giriş yaptığınızda
sayfada bulunan yönergelere göre “Docker Toolbox” ı “download” edebilir ve sisteminize
yükleyebilirsiniz.
“Docker” ile ilgili pratik çalışmalarına geçmeden önce bazı önemli kavramlardan bahsetmemiz
gerekiyor. İlk kavram: “Images”. İmajlar, “container” ları oluşturmak için kullanılan “read-only”
şablonlardır. İmajlar, “docker build” komutuyla bizim tarafımızdan veya başka kullanıcılar tarafından
oluşturulur. İmajlar, diğer imaj katmanlarından oluşur. İmajlar, “Docker registry” de depolanır.
“Container”ı “run-time” obje olarak düşünebiliriz. “Container” larla uygulama taşınabilir şekle
getirilmiştir. “Container” lar imajlardan oluşur. Uygulamanın çalışması için gerekli tüm betikleri ve
bağımlılıkları içerir.
“Registries”, imajları depoladığımız yerdir. Kendi “registry”nize sahip olacağınız gibi “Docker public
registry” de kullanabilirsiniz. Bu “registry”, “DockerHub” olarak isimlendirilir. “Docker repository”,
aynı isimli ama farklı “tag” lere sahip farklı “Docker” imajlarının derlenmiş halidir. Her bir “tag”, imajın
farklı sürümünü ifade eder.
“docker info” komutunu sistemimize yüklediğimiz “Docker Toolbox” üzerinde çalıştıralım. Şekil 9,
komut çıktısını bize göstermektedir.


Şekil 9. “docker info”

“docker images” komutuyla sistem üzerinde hangi imajlar olduğunu görebiliriz (Şekil 10).


Şekil 10. “docker images”

Görüldüğü gibi sistem üzerinde herhangi bir imaj yoktur.
“Hello World” uygulamasıyla çalışmamıza başlayalım. “docker run busybox:1.24 echo “Hello World”
“. Lokalimizde bu imaj bulunmadığı için “docker public repository” den bu imajı “download”
edecektir (Şekil 11).


Şekil 11. “Hello World”

Bu işlem sonrasında daha önce hiç imaj yokken artık “busybox” imajımıza sahibiz (Şekil 12).


Şekil 12. “docker images”

Sistemimiz üzerinde “debian linux” çalıştıralım. Bu amaç ile “docker run -it debian:jessie” komutunu
yürütebiliriz (Şekil 13). İşlemin aşağıda ne kadar kolay olduğunu göreceksiniz.


Şekil 13. “docker run -it debian:jessie”

İmaj, lokalde olmadığı için “download” edilmesi gerekmektedir (Şekil 14).


Şekil 14.

“docker run -it debian:jessie” komutu sonrasında “debian linux” sistemini çalıştırmış olduk. Şekil
15’den görüldüğü gibi “ls” komutu debian linux’un kök dizininde bulunan dosyaları/dizinleri
listelemektedir.


Şekil 15. Debian linux container’da ls komut çıktısı


Şekil 16. “git” komutunun sorgulanması

Debian linux container’da “git” komutunu çalıştıralım. Sistem üzerinde mevcut olmadığını görüyoruz
(Şekil 16). “git” komutunu sistem üzerine yükleyelim (Şekil 17).


Şekil 17. “git” in yüklenmesi

“git” in yüklenmesi sonrasında, “git” komutu çalışmaktadır (Şekil 18).


Şekil 18. “git” komutu


Şekil 19.

Debian linux’dan çıkış yapalım (Şekil 19).
“docker ps -a” ile debian:jessie “container”ı sistem üzerinde görebiliriz (Şekil 20).


Şekil 20. “docker ps -a”

“Download” ettiğimiz “debian:jessie” imajını, üzerine “git komutunu yükleyerek yaptığımız bu
değişikliği işleyerek yeni bir imaj olarak isimlendirebiliriz. Şekil 21’da “asiyeyigit/debian:1.00” olarak
imajı oluşturmuş olduk.


Şekil 21. “docker commit”

“docker images” ile oluşturduğumuz bu imajda artık sistem üzerinde görünmektedir (Şekil 22).


Şekil 22. “docker images”

Dikkat ederseniz “asiyeyigit/debian” imajı, “debian” baz imajından daha büyük boyutludur çünkü baz
imaja “git” yükleyerek elde ettik bu imajı.
Örneklerden görüldüğü gibi “container” mantığıyla uygulamalarımızı çok kolay deploy edebilmekte,
imajlarımızı farklı eklentilerle baz imajdan oluşturabilmekteyiz. “Container” ın temel mantığını bu
örneklerle anlaşılır yapmaya çalıştım. İkinci yazımda “container” larla ilgili daha detaya girmeyi
hedefliyorum.

6 Kasım 2016 – Asiye Yiğit
Kaynakça:
Değerli hocam James Lee’ye çok teşekkür ediyorum.