Ana içeriğe atla

Docker Temel Kavramlar ve Bir ASP.Net Core Uygulamasını Docker Üzerinde Çalıştırma

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

Bu blogdaki popüler yayınlar

UML ve Modelleme – Bölüm 4 (Class (Sınıf) Diyagramları)

Bir önceki makalemizde UML modellemede kullanılan ilk diyagram olan Use Case diyagramını incelemiştik. Bu makalemizde nesne tabanlı programlamada kullanılan sınıflar ve sınıfların arasındaki ilişkileri modelleyebileceğimiz diyagramlar olan Class(Sınıf) diyagramlarını inceleyeceğiz. UML’de sınıflar, nesne tabanlı programlama mantığı ile tasarlanmıştır. Sınıf diyagramının amacı bir model içerisinde sınıfların tasvir edilmesidir. Nesne tabanlı uygulamada, sınıfların kendi özellikleri (üye değişkenler), işlevleri (üye fonksiyonlar) ve diğer sınıflarla ilişkileri bulunmaktadır. UML’de sınıf diyagramlarının genel gösterimi aşağıdaki gibidir. Şekil 1. Class Diyagram Şekil1’de görüldüğü üzere bir dikdörtgeni 3 parçaya bölüyoruz. En üst bölüm sınıf adını, orta kısım özellik listesini (üye değişkenler) ve en son kısım, işlev listesini (üye fonksiyonlar) göstermektedir. Çoğu diyagramlarda alt iki bölüm çıkarılır. Genelde tüm özellik ve işlevler gösterilmemektedir. Ama

Yazılım Maliyet Tahmineleme Tecrübeleri

Yazılım mühendisliğinde maliyet hesabı her zaman problem olmuştur. "Bu iş kaç Adam/Gün tutar?" sorusuyla sıkça karşılaşıyoruz. Adam/gün veya Adam/ay ölçütleri bir kaynağın/kişinin belirtilen zaman dilimindeki iş gücü anlamına gelir. Tabi bu noktada yine kafa karışıklıkları başlar. 6 A/G'lik bir işi hızlandıralım diye 2 kişi ile yapmaya çalışsak ve kaynak/kod, modül, altyapı, insan vb. her bir şeyi bir kenara bıraksak, matematiksel basit formülle 6/2=3 A/G'de biter? Gerçek hayat böyle değil, öncelikle bunu anlamamız lazım. Hep şu örnek verilir; "Aynı bebeği 2 kadın birlikte daha kısa sürede doğurur mu?" Eğer bunun cevabı "Evet" ise (veya bir gün böyle bir durum ortaya çıkarsa), yazımı değiştirmem gerekecek:) Mevzu gerçekten derin...Maliyet hesabı; bulunduğunuz firmanın yazılım süreçlerini hangi methodlarla uyguladığına, ilgili işin o dönemdeki aciliyetine, (şirket yönetiminin baskısına:)) vb. bir çok duruma bağlı olabilir. Örneğin; bizim firmada e

UML ve Modelleme – Bölüm 3 (Use Case Diyagramlar)

Önceki iki makalemizde ( 1 , 2 ) UML’e genel olarak değinip ve modellemede kullanacağımız dokuz diyagram hakkında bilgiler vermiştik. Bu makalemizde Use Case diyagramından detaylı bahsedeceğiz. Öncelikle, genel Use case diyagramının tanımını hatırlayalım. “Bir kullanıcı ve bir sistem arasındaki etkileşimi anlatan senaryo topluluğudur.” Ivar Jacobson Senaryo tanımı için der ki: “Aktörle sistem arasında gerçekleştirilen, sonucunda aktöre farkedilir getirisi/ faydası oluşan etkileşimli diyalogdur. ” UML Use Case Diyagramları  sistemin işlevselliğini açıklamak amacıyla kullanılır. Sistemin birbirinden ayrı özelliklerinin detaylarını göstermekten ziyade, Use Case Diyagramlar, tüm mevcut işlevselliği göstermek için kullanılabilir. Buradaki en önemli noktalardan biri,   Use Case Diyagramlar temelde sequence diyagram ve akış diyagramlarından farklıdır. Use Case diyagramlar dört ana elemandan oluşmaktadır. Aktörler , Sistem (Proje kapsamını belirtir) , Use Caseler ve bunlar ara