Docker & Containerization
Translate This Page:
Bu Makale DevOps dünyasının temelli olan container mimarisi ve bu mimarinin en popülerlerinden olan Docker platofmrundan bahsedeceğim.
Docker a geçmeden önce conatiner nedir ? ne işe yarar, altında yatan mantık nedir gibi soruları ortadan kaldıralım.
Container nedir ?
IT biliminde kapsayıcı, geliştirilen bir uygulama programını ve onun tüm bağımlılıkları(netowork,kod deposu,çalıştığı kernal,uygulama versiyonu….) hakkında kodları uyum içinde barındıran bir paket olarak tanımlayabiliriz.
Tarihçesi ;
Her ne kadar bu teknolojiyi Google kullansa da temeli daha öncelere dayanıyor. Konteyner kavramı ilk olarak 1979 yılında ortaya atıldı ve bu tarihten sonra gelişerek devam etti. Bu süreçte ilk çıkışını da Unix V7 ile gerçekleştirdi. FreeBSD Jails, Linux VServer, Oracle Solaris Containers, Open VZ, Process Containers (Google), LXC, Warden ve Lmctfy gibi gelişim süreçlerinden geçerek günümüze kadar geldi.
Düzenli hale gelmesi ise 2000’li yılların başında FreeBSD Jail ile olmuştur. Bir sonraki yılda ise Jacques Gélinas’ın VServer projesi ile Linux ortamına girdi. Linux’ta birden çok kontrollü kullanıcı alanı için bu temel oluşturulduktan sonra, bugünün Linux konteynerlerini oluşturmak için parçalar yerine oturmaya başladı.
Bu gelişmelere rağmen bu teknoloji hala kişiler ve şirketler tarafından kullanılmıyordu. Tarihler 2008’i gösterdiğinde ise Docker, bu konuda devrim niteliğinde bir iş yaptı. Google gibi dev bilişim şirketlerinin kullandığı bu sistemi son kullanıcıların hizmetine açtı ve konteyner teknolojisinin bu noktada gelişimi ciddi derecede hızlandı. 2008’de Docker, kendi adını taşıyan konteyner teknolojisiyle (dotCloud aracılığıyla) kullanıcıları tanıştırdı. Docker, teknolojik olarak birçok kavram ve araç eklemesi yaptı. Yeni katmanlı görüntüleri çalıştırmak ve oluşturmak için basit bir komut satırı arayüzü, bir sunucu arka plan programı, önceden oluşturulmuş konteyler imaj kitaplığı ve bir log sunucusu kavramı bunlardan yalnızca birkaçı. Red Hat, Docker ile birlikte Açık Konteyner Girişimi’nin (OCI) üyeleri arasında yer alıyor.
- Chroot(UnixV7) – 1979
Bu sistemle işlemlerin ve ona bağlı diğer alt işlemler izole edildi. Bunun yapılabilmesi için dosyalar “root directory” isimli bölüme taşınıp orada çalıştırılırdı.
- Linux vServer — 2001
Linux kernel ında kullanılabilmesiyle beraber 2001 yılında chroot’un aynı özelliklerini kullanan ve ek olarak CPU time,memory,network adresleri vb. sistem üzerindeki kaynakları güvenli şekilde bölümlendirebilen Linux vServer tanıtıldı.
- Oracle Solaris Containers – 2004
Oracle Solaris Containers sayesinde ZFS(ZetaByte Filesystem) üzerinden klonlama ve snapshot özellikleri kullanılmaya başlanmıştır.
- Docker – 2013
Container teknolojisinin kullanılmasını kolaylaştıran oluşturma yönetmeyi sağlayan yapıdır. Sanal sunucu kurulumları yerine Docker kütüphanelerinde hazır bulunan image’lar kullanılarak yeni servisler hizmetler uygulamalar saniyeler içinde kurulması, bakımının yapılması yönetimi sağlanabilir.
- Windows Containers – 2016
Microsoft 2015 yılında Windows Server için windows tabanlı uygulamaları geliştirmek için girişimde bulundu ve bu container teknolojisini Microsoft Containers olarak adlandırdı. 2016 yılındaki son gelişmelerle beraber Microsoft, Windows Server 2016 üzerinde Docker containerlarının genel kullanılabilirliğini duyurdu ve böylece Docker Engine containerları native olarak Windows üzerinde çalışabilir hale geldi.
Genel yapısı ;
Bu, hızlı yürütme ve gelişmiş güvenilirlik gibi çeşitli avantajlar sağlar. Bununla birlikte, en iyi faydalar, platformdan bağımsız olma ve gelişmiş erişilebilirlik şeklinde gelir.
Bir kapsayıcı, donanım yapılandırması hakkında çok fazla endişe duymadan hemen hemen her platformda kullanılabilir. Asırlık platform bağımlılığı sorunlarını çözmek söz konusu olduğunda bu dev bir adımdır.
Conatiner imajları yürütülebilir, hızlı ve bağımsız paketlerdir. Sahip oldukları uygulama programını çalıştırmak için her şeyi içerirler: kod, çalışma zamanı ortamı, ayarlar, sistem araçları ve kitaplıklar. Çalışma zamanı sırasında konteyner haline gelirler.
Örneğin, Docker kapsayıcı görüntüleri(Container imaj), Docker Engine üzerinde çalışmaya başlar başlamaz kapsayıcı haline gelir. Altyapıdan bağımsız olarak, kapsayıcılı yazılım uygulamaları aynı şekilde çalışır. Konteynerler, tekdüze şekilde yürütülmelerini sağlamak için uygulamaları donanım ve işletim sisteminden ayrıştırarak tüm ihtiyaçlarını kendi içerisinde karşılayacak şekilde izole bir alan içerisinde çalıştırırlar.
Makine sanallaştırması(VM virtulization), birkaç VM’nin bir donanım sunucusunun kaynaklarını paylaşmasına izin verir. Benzer şekilde, birkaç uygulama bileşeni, sanallaştırma adı verilen bir işlem kullanarak bir işletim sistemi çekirdek örneğinin kaynaklarını paylaşır. Bu, kapsayıcılarda işletim sistemi düzeyinde yapılır.
Konteynerler ve Sanal Makineler
Konteynerlerin nasıl çalıştığını anlamak için containerların sanal makinelerden ne kadar farklı olduklarını ve altında yatan mantıksal mimariyi anlamamız gerekiyor.
Konteynerlar, işletim sistemi düzeyinde ayrıştırma tekniği olarak tariflenebilir. Sanal makinelerde yapılan donanımsal katmanda sanallaştırma metodu yerine işletim sistemi (OS) düzeyinde sanallaştırma mantığına sahip olan ve içerdiği yazılımı bulunduğu altyapıdan bağımsız çalışacak şekilde ayrıştıran konteynerler, çalıştırabilir bir yazılım paketi gibi düşünülebilir. Yazılımların donanımdan bağımsız çalışmasını sağlayarak geliştirme, test ve production(canlı) ortamda devreye alma süreçlerinde karşılaşılabilecek donanımsal farklılıklardan kaynaklanan sorunların etkisini azaltmaya ciddi oranda yardımcı olur.
Konteynerler sanal makineler gibi ayrı bir işletim sistemi kullanmazlar, host işletim sistemini paylaşımlı kullanırlar. Konteyner imajı; bir programın çalıştırılması için gerekli olan kod, çalışma zamanı (runtime), sistem araçları, sistem kütüphaneleri (library) ve ayarlar gibi tüm bileşenleri içerir.
Bunu basit bir örnekle ele alalım bir java yada web uygulamanız var ve uygulamanın çalışması için ihtiyacınız olan kaynak 200 MB RAM , 300 Mb disk ve 1 cpu fakat siz bu uygulamayı çalıştırmak için geleneksel bir sanal makine kurduğunuzda işletim sisteminin minimum sistem gereksinimi olan 4GB ram 40 GB disk ve 2 core cpu gibi bir kaynağı ayırmanız gerekiyor belki gözünüze ilk başta bu değerler ufak gibi görünebilir fakat onlarca uygulama geliştiren ve kullanan bir kurumda iseniz her kurduğunuz sanal makinede karşınıza çıkacak kaynak israfını ve maliyeti tahmin edebilirsiniz.
Bu sebeple container mimarisi hem maliyet hem donanım bağımsızlığı hem de CI/CD gibi süreçlerde kurumlara büyük avantajlar sağlamaktadır.
VM’ler gibi, konteynerler de uygun maliyetli bir şekilde ölçeklenebilir, yalıtılmış olarak çalışır ve kolayca atılır. Bununla birlikte, işletim sistemi düzeyindeki ek soyutlama katmanı daha fazla fayda sağlar.
Bunlar:
- Daha İyi Geliştirici Üretkenliği: Konteynerlerin devreye alınması, sağlanması ve yeniden başlatılması sanal makinelere göre daha kolay ve hızlıdır. Bu nedenle, CI (sürekli entegrasyon) ve CD (sürekli teslimat) işlem hatlarını kullanmak için daha iyi bir seçenektir . Ayrıca Çevik(Agile) ve DevOps tabanlı süreçler için daha iyi bir seçimdir.
- Daha Hafif: Konteynerler yalnızca süreçleri ve bunlarla ilgili bağımlılıkları içerir. Öte yandan, sanal makinelerin ek bir işletim sistemi örneği vardır. Bu nedenle, aynı uygulama işlemi için bir kapsayıcı, sanal makine muadilinden daha hafiftir.
- Üstün Kaynak Kullanımı: VM’ler gibi, kapsayıcılar da bir uygulama işleminin birden çok kopyasının aynı donanım üzerinde birçok kez çalıştırılmasına izin verir. Bununla birlikte, kaynak açısından daha verimlidirler.
Docker Nedir ?
Docker en net basit anlatımla open source bir ‘container’ teknolojisidir. Aynı işletim sistemi üzerinde, yüzlerce hatta binlerce birbirinden izole ve bağımsız containerlar sayesinde sanallaştırma sağlayan bir teknolojidir. Web uygulamalarımızın kolayca kurulumunu, testini, çalışmasını ve deploymentını sağlar. Bunun yanında server maliyetlerini büyük ölçüde azaltır.
Docker teknolojisinin bileşenleri
Docker Daemon:
Hypervisor’ün dockerdaki karşılığıdır. Bütün CPU ve RAM vb gibi işletim sistemine ait işlerin organize edildiği bölümdür.
Container:
Docker Daemon tarafından Linux çekirdeği içerisinde birbirinden izole olarak çalıştırılan process’lerin her birine verilen isimdir. Virtual Machine (Sanal Makine) dünyasında Docker’ı Hypervisor’e benzetirsek fiziksel sunucu üzerinde çalışmakta olan olan her bir işletim sisteminin (sanal sunucunun) Docker’daki karşılığı Container’dır.
Image:
Containerlar layer halindeki Image’lardan oluşur. Docker Image ise containerlara kurulacak ve run edilecek olan uygulamaların veya OS’lerin image dosyalarıdır. Örnek verecek olursak mysql, mongodb, redis, ubuntu, centos, mariadb.. Yüzlercesi mevcut. Detaylı liste için : Docker Images List.( https://hub.docker.com/search?q=&type=image )
Burada şöyle bir ayrıntı var. Container içerisindeki imagelerin içeriklerinin ve tanımlamalarının gerekli tutulduğu Dockerfile. adında bir dosya bulunmakta burada dosyamızın adı “Dockerfile” şeklinde ilk harfi büyük gerisi küçük olacak şekilde verilmelidir.
Bu dosya bir bakıma containerlar içindeki imagelerın registration’ını yapan bir dosyadır. Burada önemli nokta şu: Her bir image Dockerfile dediğimiz bu dosyanın altında tanımlanması zorunlu.
Docker Registry:
Bu bölüm tıpkı github gibi geliştiriciler açık kaynaklı olarak docker imagelerini yükleyerek ve DockerHub’ta paylaşarak imagelerin bizim de indirip kullanmamıza olanak sağlıyorlar. Kısaca imagelar Docker Registrylerde tutuluyor. Örneğin siz mysql image’ını kullanmak istiyorsunuz; mysql image linkinden imajınızı indirebiliyorsunuz.
docker pull mysql
komutu ile indirip artık bu image ile container oluşturabiliyorsunuz. github’a çok benziyor. Siz de kendiniz imageleri oluşturup yükleyip başkalarının da sizin yarattığınız imageları kullanmalarını sağlayabiliyorsunuz. İsterseniz Private olarak ta registerynizi tutabilirsiniz. Docker bu hizmeti de size sunuyor.
Docker CLI:
Kullanıcının Docker Daemon ile konuşmasını sağlayan, docker komutlarının çalıştırıldığı CLI ekranıdır.
Docker Compose
Compose, birden fazla containere sahip docker uygulamalarını tanımlamak ve çalıştırmak için kullanılır. Compose ile uygulamanızın servislerini configure etmek için bir YAML dosya uzantısı kullanılır. Ardından, tek bir komutla yapılandırdığınız ayarlar ile tüm servislerinizi oluşturup ve başlatabilirsiniz. Compose tüm ortamlarda çalışır: production, staging, development, testing ve diğer CI iş akışları da dahil olmak üzere.
Compose kullanmak temel olarak üç adımlı bir işlemdir:
- Uygulamanızın ortamını Dockerfiledosyası ile herhangi bir yerde yeniden üretilebilecek şekilde tanımlayın.
- docker-compose.yml uygulamalarınızı izole ortamda beraber çalışacak şekilde yaml dosyası içinde set edebilirsiniz.
- docker-compose up komutuyla birlikte tüm uygulamanızı başlatır ve çalıştırabilirsiniz.
Örnek bir docker-compose.yml dosyası içeriği aşağıdaki gibidir :
web: image: nginx volumes: - ./templates:/etc/nginx/templates ports: - "8080:80" environment: - NGINX_HOST=serdarbayram.net - NGINX_PORT=80
Deployment and Orchestration
Docker Engine, çalışan yalnızca birkaç kapsayıcı olduğunda bir uygulamayı yönetmek için yeterlidir. Ek alet edevat araç gerekmez. Ancak dağıtımda binlerce veya daha fazla kapsayıcı ve birkaç yüz hizmet varsa, ek araçlar gerekecektir.
Bu tür senaryolarda, bir orkestrasyon aracına gereksinim vardır. Bu amaca yönelik en popüler araçlardan ikisi, Docker’ın kendi aracı olan Docker Swarm ve çok konteynerli ortamları yönetmek için en iyi araç olan Kubernetes’tir.
Docker Swarm – Docker’dan Docker için Yerel Konteyner Orkestrasyon Aracı
Docker kapsayıcıları için yerel kümeleme işlevi sunan Docker Swarm, birkaç Docker motorunu tek bir sanal Docker motorunda birleştirir. Swarm modu, Docker Engine’e entegre edilmiştir. Docker Engine CLI , aşağıdakiler dahil bir dizi görev için destek sağlar:
- Keşif belirteçleri oluşturma,
- Swarm kapsayıcılarını çalıştırma
- Kümedeki çeşitli düğümleri listeleme.
Docker arka plan programı kümelerini yönetmek için Docker, Raft Consensus Algorithm’den yararlanır.
Kubernetes – Popüler Konteyner Düzenleme Aracı
Kubernetes, konteynerlerin yönetimini, ölçeklenmesini, yönlendirilmesini vb. otomatikleştiren açık kaynaklı bir konteyner düzenleme sistemidir. Başlangıçta teknoloji kralı Google tarafından geliştirilmiş olsa da, daha fazla geliştirilmesi CNCF’nin (Cloud Native Computing Foundation) elindedir.
Docker Swarm’a rağmen Kubernetes, Docker kapsayıcılığına dayalı çok kapsayıcılı ortamları yönetmek için üstün bir seçimdir. Geliştiriciler, Kubernetes ve Docker’ı birlikte kullanmayı tercih ediyor . Docker Desktop, Kubernetes dağıtımını içerir.
Docker-Kubernetes sisteminde Docker, bir uygulamayı paketleme ve gönderme aracı olarak hizmet ederken, Kubernetes aynı uygulamayı dağıtma ve ölçeklendirme aracıdır.
Docker ve Sanal Makine Arasındaki Farklar Nedir?
Docker ile geleneksel sanallaştırma arasındaki farkları aşağıdaki tabloda ve görselde bulabilirsiniz.
Özellikler | Container | Sanal makine |
Tanım | Uygulamanın kodunu, kitaplıklarını ve uygulamayı çalıştıran ortamı meydana getiren diğer bağımlılıkları içeren yazılım kodu paketidir. | Fiziksel bir makinenin dijital replikasıdır. Fiziksel donanımı birden çok ortama ayırır. |
Sanallaştırma | İşletim sistemini sanallaştırır. | Temel fiziksel altyapıyı sanallaştırır. |
Kapsülleme | Uygulamayı veya uygulama bileşenini çalıştırmak için gerekli olan ve işletim sisteminin üstünde yer alan yazılım katmanı. | İşletim sistemi, üstünde yer alan tüm yazılımlar, birden çok uygulama. |
Teknoloji | Container altyapısı, kaynaklar için temel işletim sistemiyle koordinasyon kurar. | Hipervizör, temel işletim sistemi veya donanımla koordinasyon kurar. |
Boyut | Daha hafif (MB ölçeğinde). | Çok daha büyük (GB ölçeğinde). |
Denetim | Container dışında daha az ortam denetimi bulunur. | Ortamın tamamı üzerinde daha fazla denetim vardır. |
Esneklik | Daha esnek. Şirket içi ve bulut merkezli ortamlar arasında hızlıca geçiş yapabilirsiniz. | Esnekliği daha azdır. Geçiş yapmanın bazı zorlukları vardır. |
Ölçeklenebilirlik | Yüksek oranda ölçeklenebilir. Mikro hizmetlerde mümkün olan ayrıntılı ölçeklenebilirlik. | Ölçeklendirme maliyetli olabilir. Uygun maliyetli ölçeklendirme için şirket içinden bulut sunucularına geçiş yapılmasını gerektirir. |
Docker Neden ve Ne Zaman Kullanılmalı?
Docker kullanmak için , bir site geliştirmeniz ve ayrıca siteye yapılandırmalar koymanız gereken teknik alanda görevi kolaylaştırır.
Uygulamanızı, daha hızlı publish etmenize, kodu kusursuz bir şekilde taşımanıza ve ayrıca optimum olması nedeniyle kaynaklardan tasarruf etmenize olanak tanır.
Docker, oluşturulacak uygulama için sağlam bir ortam sağlar.
Konteynerlerin konuşlandırılması kolaydır, bir hata oluşursa tespit edilmesi kolay olacaktır ve önceki duruma geri dönülebilir.
Gelişmiş ve çeşitli teknolojileri kullanan bir web sitesi oluşturmak için Docker kullanılması tavsiye edilir.
Eğer çok sayıda uygulamanız varsa , mikrosevis gibi mimarileri kullanıyor web platformlarına yönelik geliştirmekler yapıyorsanız Docker dünyasına geçmek sizin için zaman, maliyet ve stabilite anlamında büyük yararlar sağlayacaktır.