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...

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 ...

Material Design Nedir?

Material Design nedir, ne işe yarar, işimizi nasıl kolaylaştıracak? Şekil 1 - Material Design UI Örneği Material Design, Google tarafından geliştirilen bir tasarım dilidir. 2014’te I/O konferansında Android 5.0 Lollipop ile beraber duyurulmuştur. Temel olarak, kullanıcılara daha kararlı bir arayüz sağlayabilmeyi amaçlıyor. Yeni gelen bu tasarım standartları ile Android uygulamalarındaki uyuşmazlık, tutarsızlık, dokümantasyon eksikliği gibi konulara bir çözüm getirilmiş oldu. Böylece kullanıcılar, daha tahmin edilebilir bir ortamda oldukları için uygulamalar arası geçişlerde zorlanmayacak,  bir uygulamanın nasıl çalıştığını daha çabuk kavrayabilecek ve daha kolay alışabilecekler. Özellikle farklı ekran boyutlarında uygulama geliştirenlerin yaşadıkları problemleri ortadan kaldıracak ve farklı ekran boyutlarını uyumlu hale getiren akıllı arayüz geliştiricilerinin işini bir hayli kolaylaştıracak. Şekil 2 - Işık ve Gölgelendirme Çalışmaları Materi...