DOCKER Nedir ?

Sıla Kazan
6 min readSep 14, 2021

--

Herkese merhaba bu yazımda İstanbul Data Science Academy de almış olduğum eğitimde Docker hakkında öğrenmiş olduklarımı sizlerle paylaşacağım.

Docker, uygulamaları geliştirme yayına alma ve çalıştırma gibi süreçleri Container üzerinden yürütmemize olanak sağlayan bir platformdur.

Docker’in altında ki mantık , bizleri işletim sistemlerinden soyutlayarak her biri ayrı Container üzerinden çalışabilen birbirlerinin bozulması veya değiştirilmesinden etkilenmeyecek ayrı uygulama yayın alanları oluşturulmasını sağlamaktır.

Öncelikle Docker ‘ın çıkışından bahsedelim kısaca. Docker, Linux Kernel’e 2008 yılında eklenen Linux Containers (LXC) üzerine kurulu bir teknolojidir. LXC, Linux’da aynı işletim sistemi içerisinde birbirinden izole olmuş bir biçimde çalışan Container’lar (Linux tabanlı sistemler) sağlamaktadır.(Container nedir ilerleyen kısımda anlatacağım.)Anlaşıldığı üzere LXC, işletim sistemi seviyesinde bir sanallaştırma (virtualization) altyapısı sunmaktadır.

Peki neden Docker ‘ a ihtiyacımız var ?

Burada ki tüm uygulamaların hepsi işletim sistemi (Operating System(OS)) olacak biçimde çalışabilir. Aslında tam da bu nokta da bazı problemler ortaya çıkıyor;

  • Peki gerçekten bu çalışma uyumu her bir server da için geçerli olabilir mi? Bazen mümkün bazen mümkün olmayabilir.
  • Zamanla bu servisler güncellenir ya da servisler içerisinde kullanılan bağımlılıklar kullanmış olduğumuz servisler ile uyumlu olmayabilir. Tabi ki yapabileceğimiz en mantıklı çözüm bu servis için uygun bir işletim sistemini bulmak olacaktır. Peki bulacağımız uygun işletim sistemi diğer servisler için uyumlu olacak mıdır?
  • Uygulamanın çalışacağı ortamı, sürece dahil olan tüm ekibin sahip olması beklenemez (Development / Test / Production)

Doğal olarak bu şekilde uygulama geliştirmek bunları yönetmek ve sunucular arasında taşımak oldukça zor bir durumdur.

Bu durumda imdadımıza Docker yetişiyor!!!

Neye ihtiyacımız var??

Tam olarak burada bu servisler arasında iletişimi en iyi şekilde yapacak ve birbirlerinden etkilenmeden bunu başarılı bir şekilde yönetebilecek bir araca ihtiyacımız oluyor. Burada Docker devreye giriyor.

Docker’ın yapmış olduğu işlem her bir servisi aynı işletim sistemi üzerinde kendilerine ait bir dünyada çalışmasını sağlayarak kendilerine ait kütüphaneleri ve bağımlılıkları olmasını sağlıyor.

Böylece herhangi bir developer kendi uygulamasının çalışması için gereken Docker konfigürasyon dosyasını oluşturduktan sonra, bu servisin ayağa kalması/çalışması için;

docker run

demesi yetiyor. Bu sadece geliştirici için değil bu sürece dahil olan herkes için geçerli oluyor. Tek komut aynı environment (ortam).

Dikkatinizi çekmiştir şimdi de yukarıda ki görselde container dan bahsediyorum.

Docker bunu yaparken container yapısından yararlanıyor.

Peki Container Nedir?

Container;

Docker Daemon tarafından Linux çekirdeği içerisinde birbirinden izole olarak çalıştırılan process’lerin her birine verilen isimdir.

Kendilerine ait;

  • Prosesleri(Processes)
  • Servisleri(Services)
  • ağ(Network)

bulunur.

Aynı işletim sistemine veya VM (VirtualBox ) üzerinde çalışır.

İzole edilmiş ortamlardır.

Container teknolojisi ile Hypervisor teknolojisine göre sanallaştırma için gerekli disk alanından önemli bir tasarruf sağlanmaktadır.

VM (VirtualBox ) ‘e çok benzer fakat Container lar OS Kernel ‘i paylaşmaktadır. Container, kendilerine ait prosesleri, servisleri, networkleri bulunan tamamen izole edilmiş ortamlardır (environment). Tıpkı VM gibi fakat her bir VM kendisine ait bir OS barındırırken her bir Container OS kernel’i paylaşmaktadır.

Container’ların bir çok türü bulunmaktadır. Bunlardan bazıları;

  • LXC
  • LXD
  • LXCFS

docker bu container türlerinden LXC container türünü kullanmaktadır.

İşte bu container’ları yönetmek oldukça zor ve low level bir işlem olduğundan dolayı docker bize bu işleri kolaylaştırmak için high level birçok araç sunuyor. Böylece kullanıcılar container’ları istedikleri gibi kolaylıkla yönetebiliyor.

Peki nasıl oluşturulur?

Nasıl yapılacağını öğrenmek için ilk olarak Image kavramının ne oluğunu anlayalım.

Image Nedir?

  • İçerisinde bir çok farklı yapıyı barındıran yapılardır. (OS, Application, ve daha fazlası)
  • Template, plan, package
  • Akılda kalması için;
  • Form tabanlı uygulamaların (WinForms vs) projesi image olarak düşünülebilir
  • Peki bu image’ler nerede?
  • Docker Hub (Docker’un public ve private olarak bize sunduğu resmî repository hesabı)

Container Nedir?

  • Image’i çalıştırdığımızda elde ettiğimiz proses olarak düşünülebilir
  • Akılda kalması için;
  • Form tabanlı uygulamanın, çalıştırılmış hali olarak düşünülebilir
  • Proje > exe
  • Docker’ı bilgisayarımıza kurduk. Peki Docker ile container’ları nasıl kullanacağız? Bunun için ilk olarak ihtiyacımız container’ımızın base yani temelini oluşturacak bir image elde etmek. Peki bu image’ı nereden alacağız? Çok kolay şu şekilde;
docker run [image adı] 

Örneğin;

docker run ubuntu
docker run redis
docker run mongodb

….. farklı farklı instance’ları kendi ortamınıza rahatlıkla çekebilirsiniz.

NOT:

  • Docker Image sizin projeniz gibi düşünebilirsiniz. Projelerinizin dosyaları tüm ayarlar yani bir paket, template, plan gibi.
  • Docker Container ise bu template’in çalıştırılmış hali bir instance’ı gibi. Bir Docker Image’den birden fazla Docker Container çalıştırabilirsiniz.
  • Ayrıca siz de kendinize ait image dosyalarınızı üretebilir ve bunu Docker Hub Repository’e gönderebilirsiniz. Böylece Public ya da Private olarak diğer geliştiriciler bundan yararlanabilirler.

DOCKER ve VM Karşılaştırması

  • VM Hypervisor üzerinde her bir VM container’ını yönetir. Fakat bu her bir VM kendine ait bir işletim sistemine sahiptir.
  • Docker container’ları ise sadece bizim application dosyalarımız, kütüphaneler ve bağımlılıkları içerir. Sadece tek bir işletim sistemi olduğu için oldukça performanslı bir çözümdür.
  • VM içerisinde İşletim sistemi barındırdığı için doğal olarak Docker’a göre daha fazla alan kaplar.
  • Uygulamayı ayağa kaldırmak istediğinizde VM OS içerdiğinden ilk olarak OS’in açılmasını beklemek gerekir. Docker’da ise direk uygulamanın gereksinimleri doğrultusunda ayağa kalkar. Yani çok daha hızlı boot süresine sahiptir.
  • Sanal Makineler kendilerine ait OS’e sahip olduğu için ve bunlar arasındaki iletişim Hypervisor tarafından yapıldığı için doğal olarak bir sunucu üzerinde farklı işletim sistemlerine sahip VM’ler üretebilirsiniz. Fakat docker aynı OS üzerinde çalışan yapılar olduğu için bu mümkün değildir.
  • Docker daha düşük CPU ve RAM kullanır, VM ler daha yüksek CPU ve RAM’e ihtiyaç duyar.

Her ikisinin de avantaj ve dezavantajlar bulunmakta fakat DOCKER bu konuda daha önde diyebiliriz.

Şimdi artık gelelim docker komutlarına ;

DOCKER KOMUTLARI

Selam sanal komut terminalimizi açıyoruz kullandığınız işletim sistemine göre değişir ben linux üzerinde anlatıcam.

Bende kurulu olan docker ı mı kaldırdım size anlatmak için yeniden kuracağım.

1 .adım

https://docs.docker.com/engine/install/ubuntu/ Buradan linux makinemize uygun şekilde dökumantasyonda ki adımları takip ederek kurabiliriz.Docker ı kurduğunuzu varsayarak komutlarımıza başlayalım .

Kurulu olduğundan emin olmak için ;

docker version

yazıp terminalinizde çalıştırın.

pull:

docker pull [image adı]

Docker pull komutu ile Docker hub’dan bir imaj çekebilirsiniz.Örneğin;

docker pull redis
docker pull ubuntu
docker pull mongodb

Bu şekilde ihtiyacımız olan image ‘leri çekebiliriz.

run:

docker run [image adı]

run komutu bir image’ı çalıştırmayı sağlar.

Örneğin;

docker run ubuntu
docker run redis
docker run mysql

dediğimizde redis isimli container eğer bizim docker host’umuzda varsa çalıştırılır. Eğer yoksa Docker Hub Repository üzerinden bulunur indirilir ve çalıştırılır. Bir sonraki docker run redis komutuyla beraber docker host üzerinden çalışmaya başlar.

images:

docker run images

bize docker hosts üzerinde bulunan tüm image listesini detayları ile getirir.

ps:

docker ps

ps komutu çalışan tüm containerların listesini bilgileriyle beraber döker.

Eğer çalışan ya da çalışmayan tüm container’ların listesini görmek istersek. Bu durumda -a parametresini göndermemiz gerekir.

aynı işlemi

docker container lsdocker container ls -a

ile de görebiliriz.

bu bize çalışan ve daha önce çalışmış ama durmuş tüm container'ların listesini verecektir.

stop:

docker stop [containerName|containerID]

çalışan bir container’ı durdurmak için kullanılır containerName ya da containerID bilgisini vermemiz yeterlidir.

rm:

docker rm [containerName|containerID]

Eğer çalışmayan docker container’larının boşuna yer kaplamasını istemiyorsak;

docker rm [containerName|containerID]

kullanabiliriz. Bu durumda sildiğimiz container’ları docker ps -a yaptığımızda listede görmeyeceğiz!

Eğer sadece çalışan container larımızı silmek istersek

docker rm -f [containerName|containerID]

Aktif ve pasif olan tüm container’ları silmek için

docker container rm $(docker container ls -aq)

komutunu kullanabiliriz.

Peki bir image listesinden bir image silmek istersek ne yapabiliriz?

docker rmi [imageName|imageID]

image’i silecektir.

Docker ‘a ait temel komutlar bu şekildedir. Uygulama yaptıkça daha fazla komutları öğrenebiliriz. Komutları anlatırken buradan https://docs.docker.com/engine/reference/commandline/docker/ yararlandım sizlere da tavsiyem docker Cheat Sheet lerden yararlanabilirsiniz. Kolay gelsin :)

--

--

Sıla Kazan
Sıla Kazan

No responses yet