Categories
Rehber Yazılım

Docker ile Sanal Ortam Oluşturun: Docker Nedir?

Docker, basit bir şekilde süper hızlı “sanal ortam” oluşturma teknolojisidir. Bu basitliğin ardında büyük olaylar bizi beklediği için sade bir giriş yapalım istedim. Hemen başlayalım.

dockeryazılım programının logosu

Sanallaştırma

Bir bilgisayar/sunucu içerisinde bulunan işletim sisteminin üzerinde sanal makine başlatılır.

Başlatılacak olan her sanal makine ana bilgisayarımızın fiziksel özelliklerinin bir kısmı ile beslenmeye başlar.

Her sanal makine içerisinde gerekli olan işletim sistemi bulunur. Bu sebeple makine dosyaları oldukça çok fazla yük içerir.

Makine sayısı arttıkça, fiziksel makinenin özellikleri hızla sanal makineler tarafından tüketilir.

Oluşturulan makinelerin fiziksel bilgisayardan alınacak kaynakların esnek yapıda seçilmemesi proje gereksinimlerinin değişiminde büyük sıkıntılar ortaya çıkarır.

Bu sebeplerle sanal makineler çeviklik açısından başa bela bir hale gelirler.

Konteynerleştirme

Bu terim yazılım dünyası için aslında yeni değildir. Docker sayesinde bu teknoloji son kullanıcının kullanımına çok kolay bir şekilde sunulmuştur.

Bu teknolojide amaç fiziksel makinemizin çekirdeğini direkt kullanmak.

Yeni işletim sistemlerinin tüm gereksinimleri yerine amaçlanan sistem belirlenir ve halihazırda asıl çekirdek üzerine bu sistem kurulumu gerçekleştirilir.

Bu sayede işlem ve yer maliyeti düşük, kolay taşınabilir makineler oluşturulur.

Docker

Docker‘ın sitesinden sisteminize uygun kurulumu ile ilgili detaylı bilgiyi alabilirsiniz.

Docker’ın sanallaştırmanın yanı sıra neler sunduğunu işleyişlerinden yola çıkarak anlatmaya çalıştık ancak yapabileceklerimizin çok daha fazlası bizleri bekliyor.

Şimdi Docker’ın “Image” kısmını ele alalım.

Konteynerlerin içerisinde çalışacak düşük kapasiteli yüksek erişebilirlik sağlayan sistem görüntüleri. Bu görüntüler nginx den mysql e her türlü paketi bulundurabilir.

Bu paketleri kendi işleriniz için özel olarak oluşturabilir, şirket içi ya da topluluk için özel geliştirmeler yapabilirsiniz.

Bu sayede oluşturduğunuz görüntüyü insanlar projelerinde kullanabilir.

Düşük dosya boyutları sayesinde dakikalar içerisinde uğraştırıcı bir çok ortamın kurulumu kolayca sağlanır.

Sistemimizde olan görüntüleri aşağıdaki şekilde görebiliriz. Şuan sistemimizde herhangi bir görüntü yok.

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

Deneme amaçlı bir mysql görüntüsü çalıştıralım. Docker görüntünün olmadığını gördüğü zaman önce görüntüyü alacak, kurulumunu yapıp hizmetimize sunacaktır.

Unable to find image 'mysql:latest' locally
latest: Pulling from library/mysql
a076a628af6f: Pull complete                                                                                                                                                 f6c208f3f991: Pull complete                                                                                                                                                 88a9455a9165: Pull complete                                                                                                                                                 406c9b8427c6: Pull complete                                                                                                                                                 7c88599c0b25: Pull complete                                                                                                                                                 25b5c6debdaf: Pull complete                                                                                                                                                 43a5816f1617: Pull complete                                                                                                                                                 69dd1fbf9190: Pull complete                                                                                                                                                 5346a60dcee8: Pull complete                                                                                                                                                 ef28da371fc9: Pull complete                                                                                                                                                 fd04d935b852: Pull complete                                                                                                                                                 050c49742ea2: Pull complete                                                                                                                                                 Digest: sha256:--
Status: Downloaded newer image for mysql:latest
[Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.22-1debian10 started.
[Note] [Entrypoint]: Switching to dedicated user 'mysql'
[Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.22-1debian10 started.
[ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
        You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

Aynı komutu tekrar çalıştıralım.

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               latest              d4c3cafb11d5        25 hours ago        545MB

Artık görüntü yerel makinemizde hazır. İstediğimiz zaman bu görüntü ile yeni bir konteyner oluşturup birden fazla mysql sunucusu elde edebiliriz.

Peki Docker bu görüntüyü nereden aldı? Tabiki de kendi “image” havuzu Docker Hub’dan (docker farklı kaynaklardan da görüntü alabilir).

Bu sistem içerisinden işinize yarayan herhangi bir görüntüyü yerelinize almak için aşağıdaki komutu kullanabilirsiniz.

docker pull blabla

Etiketler bir çok depo(repository) alanında olduğu gibi Docker görüntülerinde de versiyonlama için kullanılır. Yapısı bu şekildedir;

<görüntü-adı>:<etiket>

Yukarıdaki mysql örneğimizi ele aldığımızda depodan çekilecek olan görüntü mysql görüntünün versiyon adı ise latest dır. Eğer mysql in farklı bir sürümünü yüklemek istiyorsak aşağıdaki gibi bir komut kullanmalıyız.

docker pull mysql:5.7.32

Docker Hub içerisinde herhangi bir görüntü deposuna girdiğimizde “Description”, “Reviews” ve “Tags” şeklinde 3 farklı tab görürüz.

Tags” tab i içerisine girdiğimizde ilgili deponun oluşturulmuş tüm versiyonlarını görebilir nasıl erişebileceğimize dair bilgileri edinebiliriz.

Docker çalışma sistemi ve belkemiği konteyner sistemidir.

Konteynerler çok hızlı bir şekilde ayağa kaldırılıp kullanıma hazır hale getirilir.

Bir uygulama için birden fazla uygulama/veri tabanı konteynerleri oluşturulup aynı anda çalışması ve yükü eşit bir şekilde paylaşacak şekilde yapılandırılmaları mümkündür.

Hatta bu sistemleri ek uğraş gerektirmeden otomatik olarak yapan sistemlerde geliştirilmiştir.

Bir görüntü seçilip docker run komutu kullanıldığında otomatik olarak konteyner oluşturulmaya başlanır. Yine mysql örneği ile gösterelim;

$ docker run --name mysqltest -e MYSQL_ROOT_PASSWORD=docker-test -d mysql:latest

Şimdi biraz inceleyelim ilk yaptığımız run komutundan farklı parametreler var.

— name mysqltest  konteyner adımız

-e MYSQL_ROOT_PASSWORD konteyner a gömmek istediğimiz ortam değişkeni

-d bağımsız(detached) modda konteyner başlar, komut girildikten sonra komut istemine geri döneriz, docker arkada oluşturma işlemine başlar, bizi engellemez.

mysql:latest kurmasını istediğimiz görüntünün adı

Docker konteynerlerini aşağıdaki komut ile listeyebiliriz;

$ docker container ls
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
2fa80a5b07c6        mysql:latest        "docker-entrypoint.s…"   26 minutes ago      Up 26 minutes       3306/tcp, 33060/tcp   mysqltest

Oluşturduğumuz konteyner ın özelliklerini ve durumunu görüntüleyebiliyoruz. Konteyner ı durdurmak için aşağıdaki komut kullanılabilir.

$ docker container stop 2fa80a5b07c6

stop ibaresinden sonraki alan konternerimizin id si. İstersek ismi ile de aynı işlemi gerçekleştirebiliriz.

Şimdi ise konteyner silmek için aşağıdaki komutu kullanalım

$ docker container rm mysqltest

Bu şekilde Docker da konteyner oluşturma durdurma ve silme işlemlerinin nasıl yapıldığını incelemiş olduk.

Bu dosyalar var olan görüntüleri özelleştirerek projemize özel yeni görüntüler elde etmemizi sağlıyor. İçerisine gireceğimiz komutlar ile Docker’ın konteyner oluşturma aşamasında ne tür adımlar izleyeceğini belirliyoruz. Docker vereceğimiz tüm işleri bizim yerimize istediğimiz kadar konteyner içerisinde yapıyor. Şimdi bir tane oluşturalım;

FROM node:14.15.4                                                                                                                                                           RUN mkdir /nodetest                                                                                                                                                         WORKDIR /nodetest                                                                                                                                                           ADD . /nodetest                                                                                                                                                             CMD node index.js

FROM oluşturulacak konteynerin kullanacağı görünütüyü belirtir.

RUN konteynerin çalıştıracağı komut burada bir klasör oluşturduk.

WORKDIR konteynerin komutlarımızı nerede çalıştıracağını belirttik.

ADD konteynerin içerisine aktarılacak fiziksel makinemizdeki dizini gösterdik Dockerfile ın bulunduğu dizindeki herşey konteyner içerisinde bulunan nodetest klasörüne kopyalanacak.

CMD konteynerin işlemlerden sonra çalıştırmasını istediğimiz ilk ve asıl işlem.

Dockerfile ımızın yanına bir index.js açıyor ve içerisini aşağıdaki şekilde dolduruyoruz;

const https = require('https')                                                                                                                                              let req = https.request({ hostname: 'webhook.site', path: '/1d7a8108-ecfe-413d-a210-156a0fe3ad96', port: 443, method: 'GET' }, () => {});
req.end();

Webhook.site üzerinden bir webhook oluşturuyoruz ve istek atıyoruz.

Şimdi oluşturduğumuz Dockerfile üzerinden bir görüntü oluşturmak için aşağıdaki komutu kullanalım:

$ docker build ./
Sending build context to Docker daemon  3.072kB
Step 1/5 : FROM node:14.15.4
 ---> 995ff80c793e
Step 2/5 : RUN mkdir /nodetest
 ---> Running in 37739a546f10
Removing intermediate container 37739a546f10
 ---> f5f56db2746d
Step 3/5 : WORKDIR /nodetest
 ---> Running in ae357849a077
Removing intermediate container ae357849a077
 ---> ae2f76d3ad04
Step 4/5 : ADD . /nodetest
 ---> 58b31c30cbcf
Step 5/5 : CMD node index.js
 ---> Running in 5bd9c578f13c
Removing intermediate container 5bd9c578f13c
 ---> e540f9d9eea3
Successfully built e540f9d9eea3

Bulunduğumuz dizini göstererek “e540f9d9eea3” idsine sahip bir görüntü oluşturduk hemen bunu inceleyelim:

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              e540f9d9eea3        24 seconds ago      942MB
node                14.15.4             995ff80c793e        27 hours ago        942MB
mysql               latest              d4c3cafb11d5        28 hours ago        545MB

İlk sırada bizim oluşturduğumuz görüntü geldi. Artık konteynerimizi başlatabiliriz.

$ docker run e540f9d9eea3

Bu komut ile konteyner başladığı anda Webhook.site adresinde istek hemen karşımıza geliyor.

Node konternerimiz ayağa kalktı tüm ortam yüklendi, index.js dosyamız alındı ve sonrasında talimatlarımıza göre çalıştırıldı.

Image for post

Image for post

İşlem başarıyla tamamlandı. Artık bu görüntü ile istediğiniz her şeyi yapabilirsiniz.

Yazımızda “Docker Nedir?”, “Hangi Teknolojiyi Kullanır?”, “Konteynerleştime(Containerization) Nedir?”, “Docker Image Nedir Nasıl Çalışır?”, “Docker Konyetner Nasıl Çalışır?”, “Dockerfile Nedir ve Nasıl Çalışır?” ve “Docker Image Nasıl Oluşturulur?” gibi pek çok soruya değinmeye ve cevap vermeye çalıştık.

 

Sonuna kadar okuduğunuz için teşekkür ederim. Umarım sizler için faydalı bir yazı olmuştur ve aklınızda soru işaretlerini bir nebze olsun azaltmıştır.

Leave a Reply

Your email address will not be published. Required fields are marked *