Yeni Başlayanlar İçin Docker Rehberi

Uğur Sakarya
7 min readJun 17, 2021

Not: Bu yazının orijinali, ingilizce olarak freecodecamp sitesinde yer almaktadır. Dilim döndüğünce Türkçe’ye çevirmeye çalıştım. İyi okumalar.

İster Devops alanında kariyerinize başlamayı düşünün, ya da çoktan bu alan içerisinde yer alın, Docker, bu alanda çalışan kişiler için en kritik becerilerden birisi ve eğer özgeçmişinizde Docker yer almıyorsa, eklemeyi düşünmenin vakti çoktan geldi.

Bu yazıda, Docker kavramını en basit hali ile açıklamaya çalışacağız.

Konuya direkt dalmadan önce, başlangıç rehberi olarak hangi konuların işleneceğini bir görelim.

  • Docker nedir?
  • Docker hangi problemi çözer?
  • Docker kullanmanın avantajları/dezavantajları
  • Docker’ın temel bileşenleri
  • Terminoloji
  • Docker Hub nedir?
  • Başlangıç için bazı temel Docker komutları

Haydi başlayalım, Docker nedir?

Basit haliyle Docker, uygulamaları oluşturmayı, yürütmeyi, yönetmeyi ve dağıtımını kolaylaştıran bir platform olarak karşımıza çıkıyor. Bunu da kurulu olduğu ve çalıştığı sistemin işletim sistemini sanallaştırarak yapar.

Docker ilk olarak 2013 yılında ortaya çıkmış ve GO dili ile geliştirilmiştir.

Şimdi, bizi Docker kullanmaya iten problemi ve Docker’ın bize sunmuş olduğu çözümü anlayalım

Problem

Diyelim ki; elinizde Python tabanlı üç tane uygulama var ve siz bu uygulamaları yalnızca tek bir sunucuda barındırmak istiyorsunuz. Bu sunucu fiziksel de olabilir, sanal da.

Bu uygulamaların her biri, birbirlerinden farklı Python versiyonu ve tabi buna bağlı olarak farklı kütüphaneler ile bağlılıklar (dependency) kullanıyor.

Şimdi sorun burada çıkıyor; çünkü aynı bilgisayarda Python’un farklı versiyonlarına sahip olamayacağımız için bu üç uygulamayı tek bir sunucuda kullanamıyoruz.

Çözüm

Öncelikle yukarıda bahsettiğimiz sorunu Docker olmadan ne şekilde çözebileceğimize bir bakalım. Aslında elimizde yalnızca iki seçenek var; bunlardan ilki üç ayrı fiziksel makineye sahip olmak. Diğeri ise; aynı anda üç tane sanal makineyi barındırıp, çalıştırabilecek kadar güçlü tek bir fiziksel makine.

Bu iki seçenek de bize farklı makinelere, ama sanal ama fiziksel, Python’un farklı versiyonlarını ve buna bağlı kütüphaneler ile bağlılıkları kurmamıza olanak veriyor.

Sonuç olarak yukarıda bahsettiğimiz iki seçenekten hangisini seçersek seçelim, tedarik ve bakım maliyetleri oldukça fazla olacaktır.

Şİmdi, Docker’ın bu problemi çözmek konusunda ne kadar verimli ve uygun maliyetli olabileceğine bakalım.

Bunu anlayabilmek için, öncelikle Docker’ın tam olarak nasıl çalıştığına bakmamız gerekiyor.

Kaynak: freecodecamp.org

Docker’ın yüklendiği ve çalıştığı makineye çoğunlukla Docker Host ya da kısaca Host denmekte.

Bu nedenle, siz sunucu üzerinde ne zaman bir uygulama deploy etmeye kalktığınızda, sunucu bir adet mantıksal varlık(logical entity) yaratır. Docker terminolojisinde buna, Konteyner(Container) ya da Docker Konteyner(Docker Container) diyoruz.

Bu Docker Konteyneri üzerinde kurulu veya çalışan herhangi bir işletim sistemi bulunmuyor. Fakat üzerinde barındığı ve çalıştığı sunucuda yer alan işletim sistemindeki network arayüzünün, dosya sisteminin sanal bir kopyasına sahip olabiliyor.

Böylelikle işletim sistemi, aslında üzerinde yer alan tüm konteynerler tarafından paylaşılabilir duruma geliyor.

Bu da her bir konteynerin aynı sunucu üzerinde olan diğer konteynerlerden izole olmasını sağlıyor. Böylelikle, aynı işletim sistemi gereksinimine sahip oldukları sürece, farklı uygulama gereksinimlerine ve bağımlılıklarına sahip birden çok konteyneri aynı sunucuda çalışabilmesi için mümkün.

Docker’ın, bahsetmiş olduğumuz problemin çözümünde bize nasıl faydalı olduğunu anlamak için Docker’ın avantajlarını ve dezavantajları hakkında yazacağımız bir sonraki bölüme bakmamız gerekmekte.

Kısaca Docker, üzerinde kurulu olduğu sunucunun donanım bileşenlerini sanallaştırmak yerine, aslında yalnızca işletim sistemini sanallaştırmaktadır.

Docker Kullanmanın Avantaj ve Dezavantajları

Docker’ın Avantajları

Docker kullanmanın avantajlarından bazıları:

  • Docker, aynı işletim sistemi gereksinimlerine sahip olmak kaydıyla, farklı gereksinimleri ve bağımlılıkları olan birden fazla uygulamayı aynı sunucu üzerinde barındırma imkanı verir.
  • Depoloma avantajı. Aynı sunucu üzerinde onlarca uygulama barınabilir çünkü Docker konteynerleri disk üzerinde çok az yer kaplamakta ve yine aynı şekilde çok az disk alanı tüketmekte.
  • Sağlamlık. Sunucu üzerinde yer alan Docker Konteyneri içerisinde herhangi bir işletim sistemi kurulu olmadığından dolayı, sanal makineye göre oldukça az bellek tüketimi vardır. Bu da önyüklemenin saniyeler içinde gerçekleşmesi sağlamaktadır. Bu, yükleme süresi dakikaları bulan sanal makineye göre oldukça ciddi bir avantaj.
  • Docker, gerekli donanım maliyetleri açısından da oldukça uygun maliyetlidir.

Docker’ın Dezavantajları

  • Farklı işletim sistemi gereksinimleri olan uygulamalar aynı sunucu üzerinde barındırılamaz. Örneğin, diyelim ki dört tane farklı uygulamamız var ve bu uygulamalardan üç tanesi için Linux temelli bir işletim sistemi gerekirken, kalan bir uygulama için ise Windows temelli bir işletim sistemi gerekmektedir. Bu tip bir senaryoda, Linux kullanan uygulamalar aynı sunucu üzerinde barındırılıp farklı konteylerlerde çalıştırılabilirken, Windows kullanan uygulamanın farklı bir sunucuya ihtiyacı vardır.

Temel Bileşenleri

Docker Engine, Docker’ın temel bileşenlerinden birisi ve görevi de Docker platformunun genel işleyişini yönetmektir.

Docker Engine, istemci-sunucu tabanlı bir uygulama olup üç adet ana bileşenden oluşmakta. Bunlar;

  1. Sunucu
  2. REST* API (Representational State Transfer)
  3. İstemci
kaynak: https://docs.docker.com

Sunucu, arka planda dockerd(Docker Deamon) olarak bilinen bir süreci çalıştırır. Dockerd, Docker imajlarının, konteynerlerinin, networkünün ve Volumes denen sunucunun fiziksel dosya sistemi ile docker konteynerinde yer alan sanal dosya sisteminin yaratılmasından ve yönetilmesinden sorumludur.

REST API, uygulamaya sunucu ile nasıl bir etkileşim içerisine gireceğinin, yapılması istenen işin talimatlarını verme görevini üstlenir.

İstemci ise, kullanıcıların Docker ile etkileşime geçmesini sağlayan bir komut istemi arayüzüdür.

Terminoloji

Docker ile ilgili terminolojiye hızlıca bir göz atmak gerekirse;

Docker Imajı ve Docker Konteyneri, Docker kullanırken günlük hayatta sık sık karşılaşacağınız temel iki bileşendir.

Basit ifade etmek gerekirse Docker Imajı, Docker üzerinde çalışacak olan uygulamanızın ve uygulamanızın kullanmış olduğu diğer altyapı elemanlarının bağımlılıklarını içeren bir şablondur.

Diğer taraftan, daha önce de söylediğimiz gibi, Docker Konteyneri ise mantıksal bir varlıktır(logical entity). Daha net ifade ile, docker imajının çalışan bir kopyasıdır.

Docker Hub Nedir?

Docker Hub, ihtiyacınıza uygun Docker İmajlarını bulabileceğimiz online repodur.

Docker Hub, aynı zamanda kendi imajlarımızı da bu hub üzerinde saklamamızı ve dağıtmamıza izin vermekte. İhtiyaçlarımıza göre bu imajları kişisel ya da halka açık bir yapabilir durumdayız.

Bazı Docker Komutları

docker create -> Bu komut, bize yeni bir konteyner yaratma imkanı verir

Söz dizilimi aşağıdaki gibidir:

docker create [options] IMAGE [commands] [arguments]

Not: Köşeli parantez içerisinde yer alan her şey opsiyoneldir. Belirtmeseniz de olur.

Bazı örnekleri:

$ docker create fedora02576e880a2ccbb4ce5c51032ea3b3bb8316e5b626861fc87d28627c810af03

Yukarıdaki komut, en son versiyon Fedora imajını kullanarak bir konteyner yaratmasını sağladı ve yaratıldıktan sonra konteynerin ID’sini bize söyledi.

Konteyneri yaratmadan önce, Fedora imajının resmi en son versiyonunun Docker sunucumuzda olup olmadığını kontrol edecek, eğer yoksa Docker Hub üzerinden indirecektir. Eğer Fedora imajının son versiyonu halihazırda Docker sunucusunda mevcut ise direkt olarak bu imajı kullanacak ve konteyneri yaratacaktır.

İkinci bir örnek yapalım ve opsiyonel olan bazı komutları da kullanalım.

$ docker create -t -i ubuntu bash30986b73dc0022dbba81648d9e35e6e866b4356f026e75660460c3474f1ca005

Yukarıdaki örneğimizde, create komutumuz Ubuntu imajını kullanarak bir imaj yaratıyor.

Opsiyonel olarak belirttiğimiz -t ve -i ise, kullanıcının konteyner ile etkileşimde kalabilmesi için bir terminal yaratmasını belirtir.

docker ps -> Docker Sunucu üzerinde çalışan bütün konteynerleri görmemizi sağlayan komuttur.

$ docker psCONTAINER ID IMAGE  COMMAND CREATED        STATUS            PORTS NAMES30986b73dc00 ubuntu "bash"  45 minutes ago Up About a minute                 elated_franklin

Bu komut yalnızca çalışan konteynerleri gösterir. Eğer sunucuda yer alan çalışan ya da çalışmayan tüm konteynerleri görmek istersek “docker ps -a” yazmamız yeterlidir.

$ docker ps -aCONTAINER ID IMAGE  COMMAND     CREATED           STATUS       PORTS NAMES30986b73dc00 ubuntu “bash”      About an hour ago Up 29 minutes elated_franklin02576e880a2c fedora “/bin/bash” About an hour ago Created hungry_sinoussi

CONTAINER ID: Alfanümerik karakterler içeren ve her konteynere özel olan bir dize.

IMAGE: Konteyner yaratılırken kullanılan imajı adı.

COMMAND: Konteyner başlatıldığında çalıştırılması gereken, uygulamaya özgü komut/lar.

CREATED: Yaratıldığı zamanı gösterir.

STATUS: Konteynerin mevcut durumunu gösterir.

PORTS: Konteyner için maplenen portu gösterirThis displays any port mappings defined for the container.

NAMES: Konteynerlerin, ID’si haricinde bir de isimleri vardır. Bu isimleri Docker kendisi otomatik de atayabilir, biz kendimizde verebiliriz. Bunun için — — name eklemesini yapıp vermek istediğiniz adı yazmanız yeterli olmaktadır.

docker start/stop/restart-> Bu komutlar (ayrı ayrı) da durmuş olan konteynerleri çalıştırmak, durdurmak ve yeniden başlatmak için kullanılır.

$ docker start [options] CONTAINER ID/NAME [CONTAINER ID/NAME…]
$ docker stop [options] CONTAINER ID/NAME [CONTAINER ID/NAME…]
$ docker restart [options] CONTAINER ID/NAME [CONTAINER ID/NAME…]

Bir konteyneri iki şekilde başlatıp, durdurabiliriz. Bunlardan ilki, sahip olduğu ID’nin ilk bir kaç karakterini yazarak, ikincisi ise vermiş olduğumuz isim ile.

Örneğin;

$ docker start 30986
$ docker stop 30986
$ docker restart 30986

Yukardaki örnekte Docker, ID’si 30986 ile başlayan konteyneri başlatıp durdurduktan sonra yeniden başlatacaktır.

$ docker start elated_franklin
$ docker stop elated_franklin
$ docker restart elated_franklin

Bu örnekte ise, elated_franklin ismini verdiğimiz konteyneri başlatıp, durdurup, sonra yeniden başlatacaktır.

docker run -> Bu komutumuz, ilk önce konteyneri yaratıp sonrasında da bu konteyneri çalıştırmaya yarar. Docker create ve docker start komutlarının ayrı ayrı yaptıkları işi tek başına yapar.

Söz dizilimi aşağıdaki gibidir:

docker run [options] IMAGE [commands] [arguments]

Docker create komutu ile benzer bir yapıya sahiptir. Aşağıda bazı örnekler yer almakta.

$ docker run ubuntu30fa018c72682d78cf168626b5e6138bb3b3ae23015c5ec4bbcc2a088e67520

Yukarıdaki örnekte, Docker konteynerinı Ubuntu imajı ile yaratıp sonrasında çalıştıracaktır. Fakat sonrasında hemen, durduracaktır ve bize de konteynerle herhangi bir etkileşim imkanı vermeyecektir.

Bunun için yukarıdaki komutumuza ek olarak -it opsiyonunu belirtirsek, konteyner ile etkileşime girebiliriz. Örnek olarak:

$ docker run -it ubunturoot@e4e633428474:/#

Konteynerden çıkabilmek için “exit” komutunu kullanmamız gerekir.

docker rm -> Konteyneri silmek için kullanıyoruz.

Söz dizilimi aşağıdaki gibidir:

docker rm [options] CONTAINER ID/NAME [CONTAINER ID/NAME...]

Bu komutu kullandığımız bir örnek:

$ docker rm 30fa elated_franklin

Yukarıdaki örnekte, Docker’a tek komutta iki tane konteyneri silmesini söylüyoruz. Birinci konteyner, Konteyner ID’nin ilk dört karakteri ile tanımlanırken, ikinci konteyneri ise vermiş olduğumuz isimle çağırıyoruz.

Yazmakta fayda var, bir konteyneri silmek istediğinizde öncelikle ilgili konteyneri durdurmanız gerekmekte.

docker images -> Bu komut Docker sunucumuzda yer alan imajların listesini verir.

$ docker imagesREPOSITORY  TAG      IMAGE          CREATED        SIZEmysql       latest   7bb2586065cd   38 hours ago   477MBhttpd       latest   5eace252f2f2   38 hours ago   132MBubuntu      16.04    9361ce633ff1   2 weeks ago    118MBubuntu      trusty   390582d83ead   2 weeks ago    188MBfedora      latest   d09302f77cfc   2 weeks ago    275MBubuntu      latest   94e814e2efa8   2 weeks ago    88.9MB

REPOSITORY: Imajın adını belirtir.

TAG: Her imaj, bir etiket ile ilişkilidir ve etiket de temel olarak imajın versiyonu hakkında bize bilgi verir.

IMAGE ID: Alfanumerik karakterler içeren tekil yapıdaki ID.

CREATED: Yaratılma zamanını gösterir.

SIZE: İmajın büyüklüğünü gösterir.

docker rmi -> Bu komutu, bir imajı silmek istediğimizde kullanırız.

Söz dizilimi aşağıdaki gibidir:

docker rmi [options] IMAGE NAME/ID [IMAGE NAME/ID...]

Bazı örnekler:

docker rmi mysql

Yukarıdaki komut mysql imajını docker sunucusundan siler.

docker rmi httpd fedora

Yukarıdaki komut httpd ve fedora imajlarını docker sunucusundan siler.

docker rmi 94e81

Yukarıdaki komut ise 94e81 ID’si ile başlayan imajı siler.

docker rmi ubuntu:trusty

Son örneğimizde ise ubuntu imajının trusty olarak etiketlenmiş versiyonu siliniyor. İmajın kendisi hala yerinde.

Şimdiye kadar gördüğümüz komutlar, bu platformun temel komutlarındandı. Öğrenilecek ve keşfedilecek daha bir şey mevcut.

Toplarlayacak olursak eğer, Docker sunmuş olduğu özellikler dahilinde bugün olduğu kadar, gelecekte de oldukça popüler olacaktır. Ayrıca, Docker becerisine sahip olmak bugün olduğu kadar gelecekte de DevOps alanını düşünenler için anahtar yeteneklerden birisi olması oldukça muhtemeldir.

Buraya kadar gelmişseniz eğer; okuyup zaman ayırdığınız için teşekkürler.

--

--