DOCKER| NEDEN VE NASIL ?

Ömer Faruk Akyazan
Turk Telekom Bulut Teknolojileri
7 min readOct 27, 2022

Neden Docker?

Bilişim sektöründe çalışıyorsanız hatta bir uzmansanız dahi Docker konusunu sadece temel olarak ele aldığınız yeni bir akım olmaktan çıkararak “Docker konusunda detaylı bir bilgim ve deneyimim olmalı” şekline dönüştermeniz gerekir. 2013 senesinde ortaya çıkan Docker uygulama yazma, geliştirme ve dağıtım aşamasında çok büyük bir avantaj sağlayarak sektörde kısa süre içerisinde kendi yerini sağlamlaştırdı. Bu yüzden artık çoğu developer bununla beraber çalışmaya ve proje geliştirmeye başladı.

Zamanla Dockerın artan Trend Grafiği (Google Trends)

Container

Normalde uygulamamızı ya da servislerimizi barındıracak bir sistem inşa etmek istesek öncelikli olarak bir fiziksel sunucu almamız gerekecek. Sonrasında bu sunucu üzerine bir de işletim sistemi kurmalıyız. Bu aşamadan sonra da uygulamalarımızı kurarak çalıştırabiliriz. Peki diyelim ki benim bir web uygulamam var ve bu fiziksel sunucu (Bare Metal Server) üzerinde barındırıyorum. Ayrıca bir de faturalarımı, müşteri bilgilerimi ve diğer önemli bilgilerimi tuttuğum ve web uygulamamdan bağımsız çalışan bir veritabanım olsun. Fakat bu veritabanını web uygulamamla aynı fiziksel sunucu da barındırarak herhangi bir izolasyon sağlamadığım için herhangi yaşanabilecek bir aksaklıkta 2 uygulamamdan da zarar görebilir. Kısacası benim bu farklı işler için kullandığım uygulamalarımı izole edip birbirinden ayrı bir şekilde çalıştırmam gerekiyor. Pekala bu durumda gidip yeni bir sunucu mu kiralamalıyım? Evet ne yazık ki bu da çok maliyetli bir çözüm.

Ama biliyorsunuz ki bu noktada karşımıza Sanallaştırma (Virtualization) teknolojileri çıkıyor. Bir fiziksel sunucu üzerine kurulmuş altyapı ile sistem kaynakları imkanınca giderek farklı farklı işletim sistemleri ile dilediğim kadar sanal bilgisayar oluşturabilirim ve bunların hepsi birbirinden bağımsız bir şekilde çalışacak. A bilgisayarım çökse ya da hacklense bile B bilgisayarım bu durumdan etkilenmeyecek. Ayrıca normalde fiziksel sunucumda kullanamadığım boş boş bekleyen ram, cpu, disk gibi kaynaklarımı burada performansa göre paylaştırabilir böylece ek masraflara da girmemiş olurum. Gördüğünüz gibi Sanallaştırma ile bir çok problemi çözmüş oldum. Peki bu Container da ne? Sanallaştırma zaten muhteşem bir çözüm sunmadı? Evet sanallaştırma ile bir çok probleme çözüm getirilmiş oldu lakin unutmamak gerekiyor ki yine de bazı sıkıntılar halen devam ediyor. Örnek olarak Sanal ortamımımda 5 farklı hostum olacaksa 5 farklı hostum için de ayrı ayrı işletim sistemi kurmak zorundayım. Yani çok az kaynak kullanacak bir uygulamada bile işletim sistemi yer kaplamak durumunda. 5 farklı hostta evet belki problem edilecek bir durum söz konusu olmayabilir ama 100 ya da 1000 tane hostunuzun olabileceği bir durumda sadece işletim sistemine ayrılması gereken alanı tahmin edebilirsiniz. Dolayısıyla bir yerde buna Kaynak israfı da diyebiliriz.

Container teknolojisi de işte tam bu noktada devreye giriyor. Sanallaştırma aksine her hosta işletim sistemi kurmadan tek bir işletim sistemi üzerine birbirinden izole bir şekilde çalışabilen makineler kurabilir miyiz? sorusuna cevap oldu. Container dediğimiz teknoloji aslında ilk başlarda Temel Linux Çekirdeği üzerinde yer alan proseslerin namespaces denilen parçalara bölünmesi (Network namepaces, mount namespaces vs.) ile kendini göstermeye başladı. Bu namespaceler sayesinde bizler bu proseslerin birbirinden izole olarak çalıştığını gördük. Sonrasında yine Linux Kernel’ına Google mühendisleri tarafından control groups adlı bir özellik eklendi. Control groups özetle disk,ram,cpu vb. kaynaklarının prosesler tarafında izole edilmesini sağlamakta ve bu sınırlamayı kontrol etme imkanı vermiştir. İşte Container dediğimiz olay bu konseptlerin birleşiminden doğan bir platform olarak karşımıza çıkıyor.

Sanallaştırma ile kıyaslayarak gidecek olursak Container tarafında tek bir Linux işletim sistemi üzerinde birbirinden bağımsız servisler yani Containerlar çalıştırabiliyoruz. Bu parçalanmış uygulamarda servisin ihtiyaç duyduğu tüm paketler ve kütüphaneler mevcuttur fakat Linux Çekirdeği ile ilgili herhangi bir şey yoktur. Aşağıda çizmiş olduğum görselle hepsine tek tek kıyaslayabilirsiniz.

Fiziksel Sunucu — Sanallaştırma — Container Karşılaştırması

Docker’ın Çıkışı

Bir önceki bölümde bahsettiğim namespaces ve Control Groups eklemeleri o dönem pek popülerleşemedi ve tam olarak kabul edilmedi. 2013 senesinde benzer bir Container yapısı kullanarak firmalara PaaS hizmeti veren dotCloud mühendisleri tarafından Docker isimli teknoloji ileri sürüldü. Docker kelime manası ile gemi limanlarında gemilere yük yükleyen ve indiren işçiler demektir. Yazdıkları yazılımda buna benzer olarak Linux Sistemlerde Container yapısını oluşturabilen ve dağıtabilen bir yapıya sahipti. Sonrasında kullandığı Container yapısını kullanarak tamami ile kendilerinin geliştirdiği ve Go dili ile yazılmış Dockerı kullanmaya başladılar.

2013 senesinde PyCon etkinliğinde Docker tanııtımı yapılıyor.

Docker Engine

Ürün olarak Docker’ı inceleyelim ve Docker kendisini nasıl tanıtıyor bakalım: “Docker uygulama geliştirmek, dağıtmak ve çalıştırmak için oluşturulan açık kaynak kodlu bir platformdur. Docker uygulamalarınızı altyapınızdan bağımsız kılmanızı sağlar, bu şekilde yazılım üretim ve dağıtım süreçlerinizi daha hızlı bir şekilde yapabilirsiniz. Docker ile altyapınızı, uygulamalarınızı yönettiğiniz gibi yönetebilirsiniz. Docker’ın hızlı nakliye, test etme ve kodu dağıtma metodolojilerinden yararlanarak, kod yazma ile üretimde çalıştırma arasındaki gecikmeyi önemli bir ölçüde azaltabilirsiniz.”

Gördüğünüz gibi bu Docker platformu altında çeşitli hizmetler sunulmaktadır. Bu hizmetlerin merkezinde ise Docker Engine bulunmaktadır. Docker Engine Server-Client mimarisinde çalışan ve Linux, Windows işletim sistemlerinde yer alabilen bir uygulamadır. Docker Engine 3 önemli bileşenden oluşmaktadır:

1- Docker Daemon

2- Docker Rest API

3- Docker CLI

Yazının devamında detaylı olarak bahsedeceğim ama burada bu bileşenleri kısaca tanıtmak istiyorum. Docker Daemon, Docker Engine’nin temelini oluşturur ve image (imaj), container, network bileşenleri, volume gibi Docker objelerini oluşturmamızı ve idare etmemizi sağlayan bir serverdır. Rest API ise bu bileşenlerin oluşturduğu Container’ları dış dünya ile haberleştirme işinden sorumludur. Diğer uygulamalar Rest API’ye nasıl davranması gerektiğini söylerler. Docker Client ile ise mevcut ya da farklı bir yerdeki Docker Daemon servisi ile konuşabilirsiniz. Aslında bu 3 component birbirinden ayrıdır lakin beraber çalışırlar. Dockerın 2 farklı kullanım şekli vardır: Docker Engine Enterprise ve Docker Engine Community. Burada bunların kullanım alanlarından vs. bahsedip konu dışına çıkmak istemediğimden dilerseniz Docker’ın resmi sitesinden size uygun olanı seçebilirsiniz.

Image ve Container

Diyelim ki bir sunucu kiraladım ve içine bir uygulama kurdum. Bu uygulamam java tabanlı bir uygulama olsun. Uygulamamın çalışabilmesi için gerekli olan kütüphaneleri de yüklemiş olayım. (Örneğin Jre- Java Runtime Enviroment vs.). Uygulamanın çalışabileceği bir ortam olan gerekli işletim sistemimi de yükledim. O da örneğin Ubuntu Linux olsun. Artık uygulamamı çalıştırabilirim. Şimdi bu sistemden gelin İşletim sistemi çekirdeğini çıkaralım. İşte basit bir şekilde ifade etmiş olursak şu an bir Docker Image oluşturmuş olduk. Kernel dışında diğer gerekli her şeyin paketlenmesiyle oluşan image bir işletim sistemine ihtiyaç duymaz çünkü Container dediğimiz yapı üzerinde koşacağı işletim sistemi çekirdeğine bağlıdır.

Peki bu Docker Image nasıl kullanılacak ? Bu imajlar barındırıldığı yerden (Docker HUB) bir Docker Engine üzerine geldiğinde çalışmaya başlayacak böylece bu imajtan bir Container elde etmiş olacağız. Container dediğimiz şey de aslında Docker Engine üzerinde çalışan bir Docker İmajıdır ve bir imaj üzerinde bizler isteğimiz kadar Container oluşturma imkanına sahibiz.

Docker Image üzerinde sadece Read işlemi yapılabilen bir şablondur. Container ise bu şablonun çalışan halidir. İmajlarımızı barındırdığımız yerlere de Image Registry deriz. Genel olarak kullanılan Registry ortamı ise Dockerın kendisine ait olan Ducker Hub platformudur. Buradan pull edeceğiniz bir imaj üzerinden hızlı bir şekilde Container oluşturabiliriz.

faruk_pc> docker image pull farukakyazan/uygulama_1

Yukarıda basit bir şekilde terminal üzerinden bir imajı nasıl pull edebileceğinizi göstermek istedim. Docker Engine burada farklı bir Registry belirtilmediği için Default olarak Docker Hub üzerinden bu imaja ulaşmaya çalışır. Bunlara ileride daha detaylı bir şekilde değineceğim. İmajı çektiğimize göre artık bunu ayağa kaldırarak bir Container oluşturabiliriz. Bu arada uygulama_1 adlı uygulamamız basit bir şekilde “Merhaba Dünya” diyen bir uygulama olsun.

faruk_pc> docker container run farukakyazan/uygulama_1

Yukarıdaki komut ile de kendi sistemimize çektiğimiz imaj üzerinden bir Container oluşturmuş olduk ve uygulamamız çalışmaya başladı. Ekrana “Merhaba Dünya” çıktısını verdi ve uygulamamız kapandı. Aynı imajdan farklı bir container daha oluşturmak istersem aşağıdaki kod bloğundaki gibi — — name parametresi ile farklı bir isim vererek oluşturabilirim. Ve uygulamamız yine aynı şekilde “Merhaba Dünya” şeklinde çıktı verecektir.

faruk_pc> docker container run --name ikinci_container farukakyazan/uygulama_1

Bu Image hangi Docker Engine üzerinde çalışırsa çalışsın aynı şekilde aynı çıktıyı verecektir. İşte Docker’ın güzelliğide burada yatıyor. Bir uygulama paketi (Image) oluşturuyoruz ve bunu her yerde defalarca kullanabiliyoruz.

Sanal Makine ile Container Farkları

Sanallaştırma ortamı da Container teknolojisi gibi ilk çıktığı zaman bir devrim yaratmıştı. İki ortamında kendince avantajları ve dezavantajları var. Şimdi gelin bu ikisi arasındaki farklara bir göz atalım.

Öncelikli olarak en büyük farkımız daha önce de bahsettiğim üzere kaynak tüketimi. Ayrıca sanallaştırma ortamında kaynak dışında bakılması gereken makine sayısınca işletim sistemim var. Hepsinin ayrı ayrı upgrade ve patch işlemleri buna örnek olarak verilebilir. Farklara devam edelim. Sanallaştırmada işletim sistemi izolasyonu vardır. Containerda ise uygulama izolasyonu. Her seferinde yeni bir işletim sistemi kurmamız gerekmediğinden Container VM’e göre daha hızlı devreye alınabilir de diyebiliriz. Şunu da söylemek gerekir ki Container Sanal Makinelere göre daha taşınabilir ve daha ulaşılabilirdir. Image halinde her ortamda aynı şekilde çalışabilir.

Containerlar uygulama katmanında kodu ve kodun getirdiği bağımlılıkları yani kütüphaneleri birlikte paketleyen bir soyutlama işlemidir. Aynı makinede birden fazla container çalışabilir ve işletim sistemi çekirdeğini (Kernel) paylaşırlar. Containerlar VM’lerden daha az yer kaplar, daha fazla uygulamayı işleyebilir ve daha az VM ve işletim sistemi gerektirir.

Windows Containers

Container teknolojisi ilk çıktığında Linux temelli bir teknoloji idi ve adımlarını buna göre atıyordu. Zamanla popülerleşmesi daha fazla alana platforma genişlemesi gerektiğini gösterdi. Günümüzde Docker Teknolojisini Windows, MacOs işletim sistemlerinde de kullanabiliyoruz. Nasıl kullanabileceğimizi serinin devamında anlatacağım. Bu işletim sistemleri dışında Datacenterlarda (Veri Merkezlerinde) ve hatta Cloud yani bulut ortamında dahi artık kullanabiliyoruz.

Serinin ilk bölümünde sizlere Docker neden ve nasıl kullanılır gibi temel soruları anlattım. Serinin 2. kısmını Docker Kurulumuna ayıracağım. Ayrıca Windows bilgisayarınızda sanal bir makine oluşturmadan Shell kullanarak nasıl Linux kullanabileceğinize değineceğim. Teşekkürler.

--

--