Docker Nedir?
Docker, herhangi bir
ortamda uygulamaları kolay bir şekilde yaratmak, derlemek, çalıştırmak ve
deploy etmek için kullanılan bir container teknolojisidir. Container
teknolojisi ile, uygulamanın ihtiyaç duyduğu bütün kütüphaneler ile tek bir
paket haline getirilerek sunulur. Docker container’ı çalıştırılması gereken
kodları, çalışma ortamını, sistem araçları ve kütüphaneleri tek bir dosya sistemi
üzerinde bir araya getiririr. Böylece ortamından bağımsız olarak yazılım her
yerde çalışabilir. Container’ların sanal makinelere göre farkı daha lightweight
olmaları ve farklı bir mimari yaklaşım sergileyerek daha taşınabilir ve verimli
olmalarıdır. Sanal makineler, uygulamayı, uygulamayla ilgili kütüphaneleri ve
bütün işletim sistemini barındırırlarken, container’lar, uygulamayı ve uygulamanın
bütün bağımlı olduğu kütüphaneleri taşırlar, kernel ve işletim sistemini
paylaşarak, birbirinden bağımsız olarak çalışırlar.
Resimde de göreceğiniz
üzere Docker Engine, container’larımız derleyip çalıştırmamızı sağlayan
lightweight bir container runtimedır.
Docker ile çalışmaya
başlamadan önce işletim sistemimize göre, Docker For Windows, Docker For Linux
veya Docker For Mac yükleyebiliriz.
Docker For Windows,
Windows 10 bilgisayarlarda çalışan native bir Windows uygulamasıdır. Sanallaştırma
için Hyper- V kullanır. Hem windows hem de Linux üzerinde container’lar çalışmamıza
olanak sağlar (https://docs.docker.com/engine/getstarted/step_one/#/docker-for-windows).
Docker’ı makinemize yükledikten sonra, bir command-line ve powershell
yardımıyla docker komutlarını çalıştırmaya başlayabiliriz.
Docker Image ve Container Kavramları Hakkında
Docker Engine bize
docker image yaratmak ve Docker container’larını çalıştırmak için bir ortam
sunar. Docker komutlarını kullanarak docker image’larımızı oluşturur ve bu
image’ları container’lar olarak çalıştırırız.
Docker Image container’ların temelini
oluşturur. Bir image, dosya sistemi ve çalışma zamanında kullanılacak olan
parametrelerden oluşmaktadır. Bir docker image (birazdan da ayrıntılı olarak
inceleyeceğiz) her biri birbirinin üstüne koyulmuş olan katmanlı bir yapıdaki
dosya sistemlerinden oluşur. Docker image’ları çalışan bir konumda olmadıkları
için hiç bir zaman değişmezler.
Docker Container Docker image’ının
çalışan halidir. Bir docker image’ını çalıştırdığımız zaman, bir Docker
container oluşur.
Burada bir de Docker Hub’dan bahsetmek istiyorum. Image’ların katmanlı
olarak başka image’lardan oluştuğundan bahsetmiştik. Bizler de kendi image
dosyalarımızı yaratırken, başka image dosyalarına ihtiyaç duymaktayız. Docker
Hub, docker image’larının tutulduğu merkezileştireleştirilmiş bir yerdir.
Docker Hub’dan ihtiyacımız olan image’ı indirip çalıştırabilir. Veya biz de
kendi image dosyalarımızı yükleyebiliriz. (https://hub.docker.com/)
Bir image’ı çalıştırmak
istediğimiz zaman, docker image’ı önce yerel sistemde arar, orada bulamazsa
docker hub’ından indirmeye çalışır.
DockerFile ve Yapısı
DockerFile Docker image oluştururken,
ihtiyaç duyulan komutları içeren bir text dosyasıdır. Dockerfile okunup, bu
dosyadaki komutlar otomatik olarak sırasıyla çalıştırılarak docker image
oluşturulur.
Basit bir haliyle
dockerfile aşağıdaki gibi bir yapıdadır.
FROM oluşturulacak Docker Image
dosyasının hangi image dosyasını temel alarak oluşturulacağını gösterir.
WORKDIR bu komuttan sonra gelecek olan
RUN,CMD, COPY ve ENTRYPOINT komutları içinde kullanılan container’da kullanılan
çalışma dizinini gösterir.
COPY kaynak hedef yeni dosyaları
kaynak olarak belirtilen yerden alarak, dosya sistemi üzerinde hedef olarak
gösterilen yere kopyalar.
EXPOSE Container’ın çalışma zamanında
hangi portları dinlediğini gösterir.
ENTRYPOINT container’ı çalıştırılabilir
bir dosya olarak yapılandırmanızı sağlar.
Bir ASP.Net Core Uygulamasını Docker Üzerinde Çalıştırma
Docker For Windows’u
kurduktan sonra, Docker’ın Docker host işletim sistemini kendini kurduğunu
görebiliriz. Hyper V Manager’a baktığımızda, Linux host’unu görebiliyoruz.
Docker For windows’u
açıp buradan container’larımızı tutması için diskimizi paylaşmamız gerekiyor.
Şimdi bir ASP.Net Core
uygulaması açıp Linux üzerinde host edelim.
Öncelikle boş bir
ASP.Net Core uygulaması açıp, bunu publish edelim. Daha sonra publish ettiğimiz
klasore giderek içerisinde bir DockerFile oluşturacağız. TestNetCoreApplication
adıyla açtığım projeye ait docker dosyası aşağıdaki gibidir.
Microsoft/aspnetcore
image’ı, publish edilmiş ASP.Net Core uygulamalarını çalıştırmamızı sağlayan
image’dir. İmage dosyalarının katmanlı bir yapıda oluştuğundan bahsetmiştik. Bu
image dosyası da temel olarak microsoft/netcore image dosyasını almaktadır.
Docker image’ımızı
oluşturmakta kullanacağımız DockerFile ve publish ettiğimiz ASP.Net Core
dosyaları hazır olduğuna göre artık docker image’ımızı çalıştırma aşamasına
geçebiliriz.
PowerShell veya command
prompt açıp publish ettiğimiz
klasorumuze gidiyoruz.
Docker build komutunu
kullanarak docker image dosyamızı oluşturacağız. Burada options olarak oluşturacağımız
image’ın ismini vermemiz şu an için yeterli olacaktır. Image ismini tamamen
küçük harf ile kabul etmektedir. Path, image’ı oluşturacağımız dizini veya
alacağımız url ‘i göstermektedir. Biz zaten publish klasoru içinde olduğumuz
için path olarak şu anki dizini göstermek amacıyla “.” vereceğiz.
docker build [OPTIONS] PATH |
URL | -
docker build –t testnetcoreapp .
Resimde de görüldüğü
üzere dockerfile’da verdiğimiz komutlar sırasıyla işletilmeye başlanmıştır.
Öncelikle microsoft/aspnetcore image’ı docker hub üzerinden çekilmiştir. Bizim
publish dosyalarımız yeni image’imizin içerisine kopyalanarak yeni image
dosyamız başarılı bir şekilde yaratılmıştır.
İmage dosyalarını
docker images komutuyla listeleyebiliriz. Listelediğimiz zaman oluşan image
dosyamızı da burada görebiliriz.
Şimdi sıra bu dosyayı
çalıştırma kısmına geldi. Docker run komutunu kullanarak image dosyamızı
çalışan bir container haline dönüştüreceğiz.
Dockerfile’da container’ın 80 portunu dinlediğini belirtmiştik. Bu portu
bizim 8080 portumuzundan sunarak image dosyamıza verdiğimiz isim ile
çalıştırıyoruz.
$ docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
docker run -p 8080:80 testnetcoreapp
Browser üzerinden
localhost:8080 portuna girerek uygulamamızı görebiliriz.
Referanslar :
Özlem KARAGEDİK YESÜGAY
Yorumlar
Yorum Gönder