Docker’da bir Asp.Net uygulaması, Hata Ayıklama

Önceki makalelerle birlikte Docker konseptlerine ve kullanımına aşina olduğunuzu umuyorum. Bu makalemde konuyu bir adım öteye götürerek Docker container’ı içerisindeki Asp.Net Core uygulamanızı nasıl debug edebileceğinizi sizinle paylaşacağım.

Sürecin tüm adımlarını görebilmeniz için makalemde sıfırdan başlayacağım.  Daha önceki makalelerimi takip edenlerinizin de baştan sona okumasında fayda var; çünkü Docker imajımızı bu defa farklı bir yöntemle üreteceğiz. Geliştirme ortamı olarak pek çok .Net geliştiricisinin alışkın olduğu Windows ve Visual Studio’dan biraz uzaklaşalım, Mac OS ortamında çalışacağım. Bu ortamdaki en önemli yardımcılarım Visual Studio Code ve bir grup komut satırı aracı olacak. Dolayısıyla öncelikle Visual Studio Code, Docker for Mac ve .Net Core kurulumlarınızı gerçekleştirmiş olduğunuza emin olmalısınız. Debug işlemleri için Visual Studio Code C# eklentisine de ihtiyacınız olacak. Yüklemek için Visual Studio Code komut paletinde aşağıdaki komutu yazmanız yeterli;

ext install C#

Eğer Visual Studio Code C# eklentisini daha önceden kurduysanız sürümünün 1.2 üzeri olduğuna emin olun. En iyi son sürüme güncellemeniz tabi ki…

.Net Core RC sürümleri bilgisayarınızda kurulu ise RTM sürümünü kurmadan önce bu script yardımıyla kaldırdığınıza emin olun.

Oluşturacağımız Docker dosyalarını düzenlemekte yardımcı olması için Visual Studio için Docker desteği eklentisini kurmalısınız;

ext install vscode-docker

"ext install vscode-docker" komutu ile Visual Studio Code komut paletinden eklentiyi yükleyebilirsiniz

Makalemin devamında kritik yerlerde kullanacağımız ve hayatımızı kolaylaştıracak olan diğer bir araçta Yeoman olacak. Modern web uygulamaları için platform bağımsız şablon desteği almamızı sağlan bu açık kaynak kodlu proje için öncelikle Node.js’i bilgisayarımıza kurmalıyız. Bu kurulum sonrasında aşağıdaki komutu kullanarak Node paket yöneticisi yardımıyla Yeoman’ı sistemimize kurabiliriz;

npm install -g yo bower grunt-cli gulp

Dikkat ederseniz Yeoman kurulumu (yo) dışında bower, grunt ve gulp gibi ihtiyacımız olan diğer kurulumları da aynı komut satırında gerçekleştirdik.

Bir sonraki adımımız Yeoman’da ASP.Net Core uygulaması oluşturabilmek için gerekli olan generator-aspnet paketimizi kurmakta;

npm install -g generator-aspnet

Projemiz için bir klasör oluşturarak içerisine gidelim;

mkdir enteprisecoding-docker-sample
cd enteprisecoding-docker-sample/

Yeoman yardımıyla bir ASP.Net Core projesi oluşturalım;

yo aspnet

Terminal penceresinden "yo aspnet" komutu ile Yeoman Asp.Net şablonunu kullanabilirsiniz

Uygulama türü olarak  Web Application Basic [without Membership and Authorization] seçelim ve enter ile devam edelim.

Kullanmak istediğiniz arayüz framework'ünü seçiniz

Arayüz için tercih ettiğimiz framework’ü seçelim.

Uygulamanıza bir isim verin

Uygulamamıza bir isim verelim (örneğin; EnterprisecodingDockerApp)

Yeoman bizim için bir Asp.Net Core projesi oluşturacaktır

Yeoman Asp.Net generator bizim için proje dosyalarını oluşturacaktır. Projemizin bağımlılıklarını yükleme için az önce oluşturulan EnterprisecodingDockerApp klasörüne giderek aşağıdaki komutu kullanabilirsiniz;

 
cd EnterprisecodingDockerApp/
dotnet restore

Ardından projemizi aşağıdaki komutla çalıştırabiliriz;

dotnet run

Terminal penceresinde "dotnet run" komutu ile projenizi çalıştırabilirsiniz

Tarayıcıdan http://localhost:5000 adresini ziyaret ederek uygulamamızın çalıştığını teyit edebiliriz;

Uygulamanın çalışması ardından web tarayıcısından uygulamanızı kullanabilirsiniz

Komut satırına geri dönerek kntrl + c tuşu yardımıyla uygulamamızı durduralım.

Projemizi Visual Studio Code içerisinde ilk defa açtığımızda gerekli bileşenlerin eklenmesi gerektiği hatırlatılarak izin vermemiz istenecektir. Yes diyerek izin verelim;

Visual Studio Code'u ihtiyaç duyduğu dosyaları eklemek için "Yes" seçeneğini seçin

Projemiz Visual Studio Code içerisinde aşağıdaki şekilde görülecektir;

Projemiz Visual Studio Code içerisinde

Sırada Docker imajı oluşturmak için gerekli hazırlıklarda. Bunun için Yeoman’ın generate-docker eklentisini kullanabilirsiniz. Eklenti aşağıda komut yardımıyla komut satırından kurulabilir;

npm -g install generator-docker

Bu kurulum ardından projemizin bulunduğu dizin aşağıdaki komut yardımıyla Docker için gerekli scriptlerin ve yapılandırmanın tamamlanmasını sağlayabiliriz;

yo docker

Programlama dili olarak .Net Core'u seçmelisiniz

Yeoman bize projemizde kullandığımız dili soracaktır. .Net Core seçeneği ile devam ediyoruz.

Sürüm olarak .Net Core RTM sürümünü seçmelisiniz

Sürüm olarak rtm seçelim.

Uygulamanın kullandığı port değerini giriniz

Uygulamamızın kullandığı port değerini girelim.

Docker imajı için tercih ettiğimiz adı girelim

Docker imajı için tercih ettiğimiz adı girelim.

Diğer sorulara da yanıtlarımızı vermemiz ardından proje klasörümüzde Docker imajı oluşturmak için gerekli dosyalar oluşacaktır.

Visual Studio Code içerisinde oluşan dosyaları görebilirsiniz

Gördüğünüz gibi Yeoman bizim için ihtiyacımız olan Dockerfile dosyasını oluşturdu. Dikkat edecek olursanız, docker imajımız dotnet 1.0.0-core imajından türemekte. Yine projemizin çalışması için gerekli olan komutlar ENTRYPOINT olarak tanımlanmış durumda.

Yeoman tarafından oluşturulan bir diğer dosya olan dockerTask.sh dosyası ise Docker imajı oluşturmak ve çalıştırmak için gerekli komutları barındırmakta.

Komut satırından projenin bulunduğu klasörde aşağıdaki komutu çalıştırarak Docker imajımızı oluşturabiliriz;

./dockerTask.sh build

Ardından aşağıdaki komut ile Docker imajımız için bir container oluşturularak çalıştırılmasını sağlayabiliriz;

./dockerTask.sh compose

Yukarıdaki komutlara benzer şekilde, composeForDebug ve startDebugging gibi parametrelerle debug imajı hazırlayabilir, hata ayıklama oturumu başlatabilirsiniz.

Bu makeleyi hazırladığım sırada henüz Yeoman Docker şablonu %100 kusursuz değildi. Hazırlanan Docker imajı Asp.Net uygulamasını host ederken varsayılan adres üzerinden karşılamakta. Bunun anlamı, Docker container’ı içerisindeki uygulamanın sadece localhost’a gelen taleplere yanıt vermesidir. Dolayısıyla da container dışından hiç bir şekilde erişilemeyecektir. Bu sebeple Dockerfile içerisinde ASPNETCORE_URLS ortam değişkenini tanımlayarak Asp.Net Core dinleyeceği url’leyi söylemelisiniz. Bunun için Dockerfile ve Dockerfile.debug dosyalarında aşağıdaki satırı bulun;

EXPOSE 5000

ve bu satırın hemen üzerine aşağıdaki şekilde bir girdi ekleyin;

ENV ASPNETCORE_URLS http://*:5000

Eğer yo docker komutunda farklı bir port belirttiyseniz, yukarıdaki 5000 değerini kendi portunuz ile değiştirmelisiniz. Bu şekilde, uygulamamıza gelen tüm talepleri karşılamasını söylüyoruz.

Makalemin yayınlanması öncesinde yukarıdaki probleme dair kendi repository’mde bir güncelleme hazırlayarak pull request oluşturmuştum. Geçen sürede, bu pull request generator-docker repository’sine merge edildi ve v0.0.34 sürüm koduyla bugfix’i içeren yeni bir sürüm yayınlandı. Dolayısıyla, v0.0.34 ve üzeri bir sürümü kullanıyorsanız yukarıda bahsettiğim problemi yaşamayacaksınız.

Bu değişikliklerin ardından aşağıdaki komutları çalıştırdığınızda uygulamamız için bir docker imajı oluşturulacak ve container başlatılarak web tarayıcısında uygulamamız açılacaktır;

./dockerTask.sh build
./dockerTask.sh compose

Script tarafından oluşturulan imajımıza dair çalışan container kitematic'te görülebilir

Aşağıdaki komut yardımıyla çalışan container’ı durdurarak Docker’da uygulamanızı temizleyebilirsiniz;

./dockerTask.sh clean

Yeoman Docker şablonu, Visual Studio Code içerisinden Docker Container’ında çalışan projenizde debug oturumu başlatmak için gerekli yapılandırmayı dockerTask.sh içerisinde barındırmakta. 

Yeoman Docker şablonunun hayatımızı kolaylaştırmak için yaptığı bir başka değişiklik ise launch.json dosyasında yer almakta. Visual Studio Code’dan çıkmadan bir Docker container’ında hata ayıklama oturumu başlatmamızı sağlayan bu değişikliği Debug segmesine seçerek görebilirsiniz;

Visual Studio Code - Debug segmesinde docker debug girdisini bulabilirsiniz

.Net Core Docker Launch (web) seçeneği ön koşul olarak da composeForDebug barındırdığı için debug için uygun Docker imajı arkaplanda bizim için oluşturulacaktır.

Sıra geldi uygulamamızı Docker container’ı içerisinde çalıştırarak Visual Studio Code üzerinde data ayıklamaya. Bunun için standart hata ayıklama işlemlerinde yaptığınız gibi herhangi bir kod satırına break point koyun;

Uygulamanız Docker Container'ı içerisinde çalışırken de debug edebilirsiniz

Ardından debug segmesine geçerek bir hata ayıklama oturumu başlatın. Visual Studio Code, docker scriptlerini çalıştırarak debug için bir imaj oluşturacak ve bir container ayağa kaldıracaktır. Ardından da container içerisinde bir debug server çalıştıracaktır. Container’ın çalışması ardından Visual Studio Code, container’a uzaktan hata ayıklama oturumu açarak bağlanacak, web tarayıcısında uygulamamızı başlatacaktır. Koyduğumuz break point ilgili kod satırına gelindiğinde uygulamayı bekletecek ve normal bir hata ayıklama deneyimi yaşamamızı sağlayacaktır;

Visual Studio Code, Docker Container'ı içerisinde çalışan uygulamanıza bağlanarak debug edebilir

Fatih Boy

Ankara'da yaşayan Fatih, bir kamu kurumunda danışman olarak çalışmaktadır. ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook - Google+

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir