Docker Nedir? Docker Mimarisi Nelerden Oluşur? Docker Komutları Nelerdir? Docker Image Nedir ?Docker File Nedir?

SezerKahraman
8 min readJun 21, 2021

--

Docker, konteyner teknolojisini kullanarak uygulama geliştirmeyi ve çalıştırmayı kolaylaştıran açık kaynak kodlu bir platformdur. Uygulamalarınızı hızlıca derlemenizi, test etmenizi ve dağıtmanıza imkan sağlayan bir yazılım çözümüdür. Her konteyner alt katmanda ki işletim sistemine göre servisleri paylaştırmaktadır. Docker teknolojisi, geleneksel linux konteyner teknolojisini kullanan bir platform olsa da birbirinden tamamen farklıdır.Docker, Solomon Hykes tarafından konteyerların kullanımını kolaylaştırmak amacıyla kurulmuş bir firmadır.

Docker Mimarisi Nedir?

Docker Mimarisi

İstemci, dediğimiz Docker Client’ın yüklü olduğu ve hizmeti alan taraf olarak geçmektedir.

Sunucu tarafı ise Client tarafından gelen isteklerin dinlendiği tüm konteyner işlemlerinin yapılıp takip edildiği ana merkez olan Docker Engin’in koştuğu taraf olarak geçmektedir. Docker Host üzerinde Docker Daemon çalışmaktadır.

Docker Daemon: Client tarafından gelen image, container, network ve volume gibi işlemleri arka planda yönetmekle sorumludur.

Docker Host: Docker Host üzerinde Docker Daemon çalışmaktadır. Tüm docker işlemlerini Docker Daemon servisi gerçekleştirmekte ve takip etmektedir. Docker Daemon servisinin adı “Dockerd”.Docker Daemon servisi client üzerinden gelen api isteklerini dinlemekte ve yönetmektedir.

Docker Registry:

  • Docker Registry bir kayıt defteri aracıdır.
  • Docker içerisinde çalıştırılacak imagelar burada saklanmaktadır.
  • Image dosyalarını iso ve template dosyaları gibi düşünebiliriz.
  • Varsaayılan docker registry web adresi hub.docker.com
  • Docker Hub,docker tarafından hizmet veren herkesin kullanımına açık public kayıt defteridir.
  • Docker Image arama işlemlerini varsayılan olarak atanan docker hub web sitesi üzerinde gerçekleştirmektedir.

Docker Image:

  • Docker image konteyner oluştururken kullandığımız sadece okunabilir templatelerdir.Bunları uygulamaların hazırlanmış isoları gibi düşünebilirsiniz.
  • Imagelar,konteynerların yeteneklerini ve ihtiyaçlarını tanımlayan meta data verilerinide saklamaktadır.
  • Docker Imagelar, docker hub üzerinden veya kendinizin kurduğu kayıt defteri üzerinden çekilerek indirilmektedir.
  • Çoğu uygulamanın ve işletim sisteminin image oluşturulmuş ve docker hub web sitesi üzerinde kullanılabilir durumda beklemektedir.Kendi oluşturacağınız imageları hub ortamına aktararak kullanılmasını sağlayabilirsiniz.

Docker Container:

  • Konteynerlar, docker imagelardan oluşturulan uygulamalardır.
  • Konteynarlar, docker image’ın çalışan bir örneğidir.Uygulamayı çalıştırmak için gereken tüm paketi konteynerlar bünyesinde tutmaktadır.
  • Image bir şablondur ve konteynerlar bu şablonun çalışan bir kopyasıdır. Bir image’ın birden fazla kopyası yani konteynerı oluşturulabilir.

Docker Engine: Docker platformunun kalbidir. Tüm konteyner süreçlerinin yönetildiği Docker Daemonı dış dünyaya bağlayıp gelen istekleri dinleyen Rest API ve son kullanıcının girdi yaptığı Docker Client’tan oluşan ürüne verilen addır diyebiliriz.

Şimdi ise Konteyner mimarisinin ortaya çıkmasında önemli olan 2 teknolojiden bahsetmek istiyorum.

1-)Namespace: Konteynerların görebileceği alanların kısıtlandığı yerdir. Kısaca, sanallaştırma teknolojisi kullanmadan konteyner ile işletim sistem kaynaklarını izole hale getiren teknoloji linux işletim sistemi kernelında(çekirdeğinde)bulunan NAMESPACE teknolojisidir.

6 tane Namespace bulunur

1-)Pid: Çalışan işlemleri (process) birbirinden izole hale getirir.

2-)Network: Network interface ve routing tableları birbirinden bağımsız hale getirir.

3-)Mount: Dosya sistemlerini mount pointleri birbirinden izole hale getirir.

4-)Ipc: İşlemleri farklı Interprocess Communication ile izole hale getirir

5-)Uts: İşlemleri host ve domain name olarak izole hale getirir.

6-)User: Kullanıcı Id’leri birbirinden izole hale getirir.

2-Control Groups: Oluşturulan processlerin veya grupların ne kadar kaynak tüketeceğini belirlemeye yarayan teknolojidir.Konteynır kullanımını ve donanım kaynaklarını kısıtlar.

Özetle, Control Grouplarla konteynerların donanım kaynaklarını limitlerken, Namespace teknolojisi sayesinde ise konteynerların sistem üzerinde görebileceği alanları kısıtlamaktayız.

Control Group+Namespace+Image=Docker Container

Şimdi ise Docker Komutlarını İnceleyelim.

Docker Komutları:

Şimdi sizlere örnek bir docker komutu verip onun üzerinden açıklamaya çalışacağım.

  • docker container run python :latest

Bu bizim örnek bir docker komutumuz olsun aşağıda bu komutların ne işe yaradığını anlatmaya çalışacağım.

docker:İşletim sistemine Docker programı kullanacağımızı söylüyoruz.

container:Docker programı içerisinde Konteyner işlemi yapacağımızı söylüyoruz.

run:Yeni konteyner oluştur create ve start komutlarını birlikte çalıştırır.

python:Python programlama dili image’ını kullan

latest:Buraya bir sürüm vermek gerekir eğer sürümü vermezsek en son güncel sürümünü otomatik getirir.

  • docker container run - -name proje1 python:2

Burada ise oluştuduğumuz konteynera - -name parametresi ile isim verdik ve latest yerine 2 yazarak python’ın 2.sürümünü kullanmak istediğimizi söyledik.

  • docker container ls -a

Bu komutu oluşturduğumuz konteynerları listelemek için kullanırız.

Şimdi ise Konteyner Başlatma/Duraklatma/Silme/Listeleme komutlarını inceleyeceğiz.

  • docker container stop proje1

Yukardaki komutu çalışan bir konteynerı (bunun ismi proje1 konteynerı olsun) durdurmak istediğimiz zaman kullanırız

  • docker container start proje1

Bu komut ile önceden oluşturduğumuz hali hazırda mevcut bulunan konteynerı ayağa kaldırıp çalıştırmak için kullanırız.

  • docker container restart proje1

Bu komutu konteynerı baştan başlatmak için kullanırız

  • docker container pause proje1

Bu komutu ise çalışan bir konteynerı durdurmak için kullanırız

  • docker container unpause proje1

Bu komutu ise yukarda durdurduğumuz konteynerı tekrar harekete geçirmek için kullanırız

  • docker container rm proje1

Bu komutu ise konteyner çalışmıyorken o konteynerı silebilmek için kullanırız fakat burda şöyle bir durum söz konusu eğer biz çalışan bir konteynerı silmek istiyorsak docker container rm - -force proje1 ile silmemiz gerekiyor.

  • docker container ls — — all (-a)

Bu komutla ise çalışan veya durmuş tüm konteynerlar listelenir.

  • docker container ls — — quiet (-q)

Bu komutu sadece konteyner Id’lerini listelemek istediğimiz zaman kullanırız.

  • docker container rename <eskiad> <yeniad>

Bu komutla konteynera daha önce verdiğimiz ismi değiştirebiliriz örnek olarak docker container rename proje1 proje_yeni

  • docker container prune

Bu komutu çalışmayan durmuş tüm konteynerları silmek için kullanırız

Yukarıda container oluşturmayı ve oluşturduğumuz konteynerlar üzerinde hangi parametrelerle hangi işlemleri yapabiliriz bunları örneklerle anlatmaya çalıştım şimdi ise gelin beraber Docker yardımıyla Linux Nginx Web Server ayağa kaldıralım.

  • docker container run — — publish 8080:80 nginx

Yukarıda yazdığım docker komutunda daha önce öğrenmediğimiz bir parametre kullandım bu parametre — — publish parametresi şimdi sizler merak ediyorsunuz bu parametre ne işe yarıyor diye bu sorunun cevabını hemen sizlerle paylaşmak istiyorum. — — publish parametresi ile bir yayın yapacağımızı belirtiyoruz 8080:80 ise yayın yapılacak port adresini belirttiğimiz kısım oluyor nginx ise web hizmeti yapan imagemız.

  • docker container — — publish (-p) nginx

Komutu bu şekilde çalıştırdığımızda web sayfası yayın yapmaya başlayacaktır tarayıcımızı açıp 8080 portuna gittiğimizde sayfamıza gidiyor olacağız fakat şöyle bir sorun olacak.

Direkt konsol üzerinde servis sonlanana kadar yani manuel şekilde kapatana kadar çalışacak ve komut satırının kullanmamıza yayın boyu izin verilmeyecek ve biz bunu istemiyoruz hem yayın yapmak hem de o sırada komut satırını kullanmak istiyoruz yani arka planda yayın yapmasını istiyoruz peki bunu nasıl gerçekleştireceğiz.Çok basit eğer bu komutun arka planda yayın yapmasını istiyorsak

  • docker container — — publish 8080:80 — — detach(-d) nginx

komutunu kullanıyoruz.

— — publish(-p):Belirlenen port üzerinden yayın yapmamızı sağlıyor.

— — detach(-d):Yayını arka planda kullanmamızı sağlıyor.

Sizlerle beraber öğrendiğimiz docker komutları ile kısa bir örnek üzerinden bir Linux Web Server ayağa kaldırdık şimdi ise kaldığımız yerden Docker komutlarını incelemeye devam edelim.

  • docker container run — — interactive centos

Yukarda bir centos konteynerı oluşturduk buradaki — — interactive komutu ise Konteyner işletim sistemine yani Centos’un terminaline bağlanmamızı sağlıyor.

  • docker container run — — interactive — — tty centos

Burada ise — — interactive ile konteyner terminaline bağlandığımızı biliyoruz peki sizce — — tty parametresi ile ne yapıyoruz? Ben hemen söyliyim — — interactive ile bağlandığımız konteyner terminaline erişim sağlıyoruz yani terminali kullanmamızı sağlıyor.

  • docker container run — — rm -it python:3

Burada — — rm parametresi şu işe yarıyor konteynerdan çıkış yapıldığında konteynerı sil, -it ise interactive ve tty parametrelerinin kısaltması.

Şimdi ise sizlerle beraber Konteyner Dosya Kopyalama İşlemlerine biraz bakalım.

O zaman size bir soru sizce Konteyner Data Transferi Nasıl Yapılır?

Konteynerla dosya aktarmanın 3 farklı yolu vardır. Bunları şimdi sizlerle beraber inceleyelim.

1-)Docker Container cp: Host’tan Konteyner’a veri kopyalama

  • docker container cp <host dosya yolu> <konteyner hedef yolu>

Yukarıdaki komut ile bilgisayarımızdan konteynerımızın içine verileri kopyalama işlemeni gerçekleştirebiliriz. Konteyner hedef yolu ile host dosya yolunun yerini değiştirdiğimizde ise konteynerımızdan bilgisayarımıza veri kopyalayabiliriz.

2-)Mount Volume: Aslında bu kısmı Volume bölümünde daha detaylı şekilde inceleyeceğiz fakat şimdi sizlere akıllarınızda bir şeyler oluşması açısından kısa bir şekilde değineceğim.

  • docker container — — volume depo:/tmp/ centos

Burada :’dan önceki kısım bizim bilgisayarımızdaki yani hostumuzdaki dosya yolunu sonraki kısım ise konteyner pathini yani dosya yolunu ifade etmektedir.Örneğimizde host üzerindeki depo klasörü konteyner içerisindeki tmp pathine bağlanmıştır.

3-)Download Internet: Container içerisinde wget[indirilecek dosya Url’si ] dosyaları internet üzerinden konteynerımıza indirme işlemini sağlar.

Şimdi ise Konteyner’da Arka Planda Neler Olduğuna Nasıl Bakıcaz Birazda Onları İnceleyelim

  • docker container inspect web

Yukarda yazdığımız komutta web bizim önceden oluşturduğumuz bir konteynerın ismi olsun inspect komutu sayesinde bu konteynerın detaylarına bakabiliyoruz.

  • docker container port web

Bu komut sayesinde web konteynerımızda yayın yapan portları görebiliyoruz

  • docker container log web

Bu komut ile konteyner üzerinde üretilen logları görüntüleyebiliyoruz.

  • docker container top web

Konteyner üzerindeki işlemleri görüntüleyebiliyoruz.

  • docker container stats web

Konteyner kaynak kullanımını görüntüleyebiliyoruz.

Docker Image Nedir? Özellikleri ve Image Komutları Nelerdir?

Docker Image,birden çok katmandan oluşan ve Docker konteynerda işlem yapmak için oluşturulmuş dosyalardır.

Özellikleri;

  • Konteyner oluşturmak için salt okunur şablonlardır.
  • Bir manifest ve farklı obje dosyaları oluşur.
  • Konteyner silinmeden imagelar silinemez.
  • Dockerfile kullanılarak oluşturulurlar.
  • Birden çok katmandan oluşur ve her katman önceki katmanın uzantısıdır.
  • Her image dosyası kod,runtime,ortam değişkenleri,file system ve kütüphanelerden oluşur.

Docker Image Komutları:

  • docker image ls

Bu komut lokaldeki imajlarını listeler

  • docker image rm centos

Bu komut belirtilen imaj dosyalarını silmeye yarar

  • docker image inspect centos

Bu komut image detaylarına bakmak için kullanılır

  • docker image pull <indirmek istediğiniz image ismi>

Bu komut ile docker.hub kayıt defteri üzerinden belirtilen image’ın indirilmesini sağlar.

  • docker image push

Bu komut ise lokalden docker.hub’a image gönderilmesini sağlar. Peki nereye gönderileceği nasıl bilinecek. Bunun için docker.hub hesabımıza giriş yapmalıyız. Docker login komutunu kullandıktan sonra sistem kullanıcı adı ve şifre isteyecek ve giriş yaptıktan sonra tekrar docker image push komutunu kullanmamız gerekecek.

Peki üzerinde çalıştığımız bir konteyner’ı nasıl imaj haline getirebiliriz?

  • docker container commit <konteyner ismi> <imaj ismi>

Yukardaki komut sayesinde üzerinde çalıştığımız konteyner’ı imaj haline getirip docker.hub’a yükleyebiliriz.

Docker File Nedir?

Docker file, belli bir image görüntüsü oluşturmak için var olan tüm katmanların madde madde açıklandığı ve tüm işlemlerin detaylıca belirtildiği text dosyalarıdır.

Dockerfile dosyalarını yemek tarifi verilen içeriklere benzetebiliriz. Yemek tarifi verilirken yapılacak işleri sırasıyla yazıp sonrasında ise bir başkası o sıraya uygun şekilde tarifi hazırlayıp yemeğini yapabilir. Dockerfile dosyasında’da buna benzer bir tarif söz konusu hadi gelin biraz daha detaya inelim.

Docker File Dosya İçeriğini İnceliyoruz

from python:2.7 ->1.katman

RUN mkdir-p/app ->2.katman

WORKDIR /app ->3.katman

COPY ./requirements.txt/app ->4.katman

RUN pip install-r requirements.txt ->5.katman

COPY ./app ->6.katman

CMD [“python”, “main.py”]

Yukarıda gördüğünüz bir dockerfile dosyası ve içeriklerinde katman katman ayrılmış tarifler var peki bu tarifler ne anlatmak istiyor hadi şimdide biraz bunlardan söz edelim.

  • From: Hangi image dosyasını referans alınacağını belirtir. Yukarıdaki örnekte python:2.7 image referans alınması istenmiş hub.docker üzerinden bu sürümü aratıp locale inmesini sağlar.

Yani Dockerfile dosyasını oluştururken ilk satırda FROM komutunu yazacağız öncelikle hangi image üzerinde işlem yapacağız bunu belirleyip böylece bu image üzerine yeni katmanlar ekleyerek ortaya bizim imajımız çıkacaktır.

  • RUN: İmage içerisinde komut çalıştırmak için kullanılır.

RUN mkdir -p/app ->Her bir RUN komutu yeni katman anlamına gelmektedir buda image boyutunu arttırmaktadır bu sebeple image üzerine yeni bir paket yüklemesi yapılacaksa tek bir komut içerisinde &&(ve) işareti kullanılarak yapılmalıdır. Böylece katman sayısı azalacağı için dosya boyutuda azalacaktır.

  • ADD: İmage içerisine dışarıdan ve internet üzerinden data kopyalaması yapmak için kullanılır.

ADD <kaynak dosya> <hedef dosya> ADD info.txt data/proje

  • COPY: İmage içerisine dışarıdan data kopyalanmasını sağlar.

COPY <kaynak dosya> <hedef dosya>

Sizce ADD komutu ve COPY komutu arasındaki fark nedir?

COPY komutu ile ADD komutu arasındaki fark COPY komutu sadece host üzerinden dosya kopyalanmasını yaparken ADD komutu ise internet üzerinden dosyaların kopyalanmasını sağlar.

  • VOLUME: Konteyner içerisine depolama alanı eklemek için kullanılır.
  • EXPOSE: Normalde bir konteyner oluşturulduğunda konteynerların TCP ve UDP portları üzerinden birbirleriyle haberleşmeye izin verilmemektedir. Aynı ağdaki konteynerlar arka planda expose edilen portlar üzerinden birbirleriyle veya dış dünya ile haberleşebilir.
  • LABEL: Image sahibi veya farklı meta data detayı eklemek için kullanılır.

LABEL version= “2.7” veya LABEL Sezer Kahraman <infosezer>

Yani image dosyası kim tarafından yazıldı veya image’da hangi versiyon kullandığı gibi ek bilgileri vermek istediğinizde bu katmanı kullanabilirsiniz.

  • ENV: Konteyner için ortam değişkenleri tanımlamakta kullanılmaktadır.

ENV <key> <value>

ENV sifre 1234

  • CMD: Konteyner oluşturulduğunda belirtilen uygulamayı çalıştırmak için kullanılır.

CMD [“python”, “main.py”]

Dockerfile dosyası yazarken sadece bir adet CMD komutu kullanılmalıdır.

  • ENTRYPOINT: Konteyner oluşturulduğunda varsayılan parametreleri tanımlamak ve çalıştırmak için kullanılır.

ENTRYPOINT <path>

CMD komutu ile birlikte çalıştırılabilir.

ENTRYPOINT [“python”]

CMD[“main.py”]

Bu yazımda sizlere Docker hakkında bildiklerimin bir kısmını en yalın ve sade şekilde anlatmaya çalıştım umarım sizde okurken keyif almışsınızdır bir başka yazımda görüşmek üzere…

Kaynaklar:

Kaynaklar:https://www.udemy.com/MuratAksu

https://stackoverflow.com

www.medium.com

--

--