Docker Nedir?
Docker son zamanlarda sıkça duyulan bir kelime oldu hem geliştiriciler için hemde sistem yöneticileri için. Bu Nedir yazısında:
- Docker Nedir?
- Image ve Container arasında ki fark nedir?
- Basit bir Image nasıl yazılır ve nasıl çalıştırılır
- Hangi firmalar ne amaç ile kullanıyor?
konularına değineceğiz. Ayrıca öncesinde de belirtmekte fayda bu yazı giriş seviyesinde olacak yani eğer öncesinde Docker hakkında hiçbirşey duymamış iseniz rahatlık ile okuyabilirsiniz.
Bazı kavramların tam Türkçe çevirisi olsa bile anlamını tam karşılamadığı için tercüme edilmedi.
Docker Nedir?
Docker, açık kaynak kodlu yazılım geliştirme platformudur. Kendisi uygulamaları paketleyerek (Containerization), bu paketleri taşınabilir ve platformdan bağımsız bu uygulamaları çalıştırma olanağı sunuyor.
Eğer sanal makinalar ile çalıştıysanız Docker’ı bu makinalara benzetebilirsiniz ama aralarında çok büyük bir çalışma farkı bulunmaktadır.
Örnek hosted hypervisor (tip-2) olarak Oracle VirtualBox verilebilir ki linkte ki yazıda Ubuntu 18.04 üzerine kurduk.
Üstteki slaytda Container motoru ile hosted hypervisor (hay-pır-vi-zor) (tip-2) üzerinde ki sanal bilgisayarlar arasında ki farkı rahatlık ile görebilirsiniz ama senaryo ile örnek vermek gerekirse; Server kısmı zaten bizim bildiğimiz bir metal yığını veya bir bulut cihazı ve Host OS kısmı ise yine bildiğimiz sunucu işletim sistemleri veya son kullanıcı için hazırlanan masaüstü işletim sistemleri (Ubuntu, Red Hat Enterprise Linux vb.). İşin ilginç kısmı buradan itibaren başlıyor.
Her bir uygulama için ayrı bir sanal makine oluşturulması gerekirken tip-2 sanalaştırmada, Docker tarafında bir makina üzerinde donanınımız yettiği kadar uygulamayı çalıştırabiliyoruz çünkü Docker işletim-sistemi-seviyesinde sanalaştırma1 sunuyor.
Ele alalım ki bir WordPress yazılımımız var ve Apache + PHP-CGI ile çalıştıracağız.
Normalinde bir sunucu kurmamız, bir işletim sistemi ile gerekli paketleri kurduktan sonra WordPress’i kurabiliriz — yani slaytta ki birinci durum ama burada önemli üç sorun var:
- Aynı sistemden birden fazla hazırlamamız gerekirse, tekrar aynı adımları takip etmemiz gerekiyor (ayrıca farklı yapılandırmalarda da bulunmamız gerekiyor. Örneğin bir statik IP adresi ayarlamak veya yük dengeleyiciye bağlamak).
- Apache, PHP veya sistem paketlerine bir güncelleme gelirse her bir sisteme aynı güncellemeyi aynı zamanda yapmamız gerekiyor.
Aslında bu sorunlardan en önemlisi bu Software Stack‘den2 birden fazla ihtiyacınız olduğu gözünüze çarpmış olabilir ama, aynı zamanda bir geliştirici perspektifinden bakarsak, geliştirici yazdığı yazılımın veya bir eklentinin bir işletim sisteminde çalışıp çalışmamasından daha çok yazdığı kısım ile ilgilenmek ister.
Bu yapacağımız yazılım yığınını şimdi Docker üzerinde nasıl yapılacağını açıklayarak yapalım.
Image ve Container arasında ki fark nedir?
En başta belirtmek isterim ki bu birbirine nerdeyse benzeyen ama farklı şeyleri ifade eden iki kelimeye çok takılmaktan ise olayın nasıl işlediği ile ilgilenmenizi isterim.
Image
üstteki slaytta Image kısmın göremezsiniz
Bir Docker Image, işletim sistemi ve uygulamamızın bir şablonudur. Eğer
nesne tabanlı bir programlama dili öğrendiyseniz, Image tanımını Class
tanımına benzetebilirsiniz yani sadece bir durumu veya nasıl
çalışacağını ifade etmekdir.
Container
üstteki slaytta Container, mavi renkli kutucuklar ve altlarında ki kütüphaneler ile tanımlı
Docker Container, artık sisteminiz üzerinden belirli kaynakları (ağ
adaptörleri, depolama birimi veya alanı) kullanan bir siyah kutu. Burada
siyah kutu dememin sebebi ise asıl sistemden izole bir şekilde
çalışıyorlar. Nesne tabanlı bir programlama dilinde ki karşılığı ise
Object
.
Basit bir Image nasıl yazılır ve nasıl çalıştırılır
Eğer bilgisayarınız da Docker yok ise burada ki rehberi 5:20’ye kadar takip ederek bu rehberde yapacağımız herşeyi yapabilirsiniz.
Bir Image tarifini Dockerfile
adında ki kendisine özel bir sözdizimi
(syntax) olan metin dosyasına yazıyoruz. Hadi örnek bir Dockerfile
‘a
bakalım
FROM ubuntu:18.04
WORKDIR /home/berkhan
RUN apt update
RUN apt install -y nginx
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Bu Dockerfile
tarifimizde Nginx kuracağız Ubuntu üzerine. Fark
ediceksiniz ki sözdizimi çok bariz şeyleri ifade etmekte. FROM
ile bir
işletim sistemini baz alıcağız, WORKDIR
ile ana klasörümüzü ifade
edeceğiz, RUN
ile bazı komutları çalıştıracağız, EXPOSE
ile bir HTTP
portunu dışarıya açacağız ve son olarak CMD
ile Nginx’i arka plan da
çalıştıracağız.
Bu Image’i elde etmek için bilgisayarım da
docker build -t nginx:0.1.0 .
komutunu çalıştırıyorum ve bu Image’i
çalıştırmak için ise docker run -p 8000:80 nginx:0.1.0
komutunu
çalıştırıp internet tarayıcımdan http://127.0.0.1:8000 e gidiyorum.
Elbette bu yazdığımız Dockerfile production bir sistemde kullanmak mümkün değil çünkü optimize edilmedi. Ama ilerki bir bölümde bu konuya da değinilecek.
Eğer kendiniz yazmak değilde hemen kullanmak istiyorsanız (ki bu örnekte Nginx) hemen Docker Hub‘a gidip arama kısmına Nginx yazarsanız size kullanıcıların veya şirketlerin yaptığı Imageleri gösterecek. Ama orjinal kütüphaneden bir Nginx kullanmak istiyorsanız ise bu nginx sürümünü kullanabilirsiniz. Hazır kullanmanın en avantajlı yanı bir çok Image production kullanım için optimize edilmiş ve belli bir dökümantasyona sahip olan Imagelerdir.
Hangi firmalar ne amaç ile kullanıyor?
StackShare verisine göre 3730 den fazla şirket kullanmaktadır ve örnek olarak Twitter, Spotify, eBay, Cloudflare veya Disqus gibi farklı sektörlerden bulunmakta.
En çok kullanılma amacı ise bir servisi (mikroservis veya monolit) Kubernetes veya Docker Swarm gibi konteyner orkestrasyon yazılımları ile kullanılıyor.
Son söz
Bu yazımızda Docker ile geliştiricilerin işletim sistemi tabanını düşünmeden özellikler geliştirmesini ve sistem yöneticileri için ise donanımı efektif kullanmayı, aynı zamanda uygulamayı sanal bir bilgisayara göre daha hızlı çalıştırarak servisin hizmetini vermesini sağlıyor.