
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

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

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

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

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

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

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

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;

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

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

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

Sürüm olarak rtm seçelim.

Uygulamamızın kullandığı port değerini 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.

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

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;

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

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;
