Visual Studio 2017 RC ile Docker Entegrasyonu

64 dakikada yazıldı

11924 defa okundu

Düzenle

Visual Studio 2017 RC ile beraber local Docker development yapabilmek için kolaylıklar geldi desem sanırım şaşırmazsınız. Her ne kadar işler kolaylaşmaya başlasa da hala birkaç şeye dikkat etmek gerekiyor. Eğer siz de bir VM yaratıp Docker testleri yapmayı planlıyorsanız aşağıda paylaşacaklarım işinize yarayabilir.

Hyper-V ve Nested Virtualization

Visual Studio 2017 RC Go-Live lisansına sahip olsa da, yani Microsoft "Bu ürünle canlıya gidecek uygulamalara geliştirebilirsiniz." dese de ben bildiğimden şaşmam ve RTM dışında hiçbir şeyi bilgisayarıma kurmam :) O nedenle benim için ilk iş her zaman bir VM yaratmak oluyor. Size de bir VM üzerinden ilerlemenizi tavsiye ederim. Tabi bu noktada şöyle bir sıkıntı var. Docker for Windows container yaratırken bir Linux VM oluşturup onu kullanıyor. (Windows Containers desteği ben bu makaleyi yazarken betadaydı.) Tüm bunlar için Docker Hyper-V'den faydalanıyor. Tabi bu durumda biz zaten VM içerisinde olduğumuz için VM içinde VM gibi bir durumla karşı karşıya kalıyoruz. Hyper-V ile yarattığımız VM'in içinde bir Hyper-V daha olacak ve orada da Linux çalışacak. Bunları yapabilmeniz için;

Hyper-V tarafındaki konfigürasyonu değiştirmek isterseniz Hyper-V içerisinde makineye sağ tıklayarak upgrade / yükseltme yapabilirsiniz.

Hyper-V'de VM Configuration'unun yükseltmek.

İşlemci desteği konusuna gelince, VT-x yoksa zaten sisteme Hyper-V yükleyemezsiniz. Bu arada, unutmadan, BIOS'da Virtualization kapalı olabilir :) Uzun süredir VM kullanmadıysanız bir bakmakta fayda var. EPT ise Windows 8 ile beraber gelen Second Level Address Translation (SLAT)'ın Intel'cesi :) Intel EPT (Extended Page Tables), AMD içinse RVI (Rapid Virtualization Indexing) veya NPT (Nested Page Tables). Bu özelliğin işlemcinizde olup olmadığını CoreInfo ile coreinfo.exe -v diyerek kontrol edebilirsiniz.

Ben bu makaleyi yazarken makinemde 14393 vardı. VM içerisindeki işletim sistemi de yine Windows 10 Pro ve 14393'dü.

Tüm bu detaylardan sonra Nested Virtualization'ı açmak için elinizdeki VM'in adı ile beraber aşağıda komutu konsoldan çalıştırmanız yeterli olacaktır.

    Set-VMProcessor -VMName <VMADI> -ExposeVirtualizationExtensions $true

Docker yüklerken

Bu noktada sanal makinen içinde olduğunuzu ve Visual Studio 2017 RC'yi de yüklemiş olduğunuzu varsayıyorum. Eğer hala Docker for Windows yüklemediyseniz onu da hemen buradan edinebilirsiniz. Ben bu makaleyi yazarken 1.12.3 Stable sürümü kuruluydu. Yükleme işleminden hemen sonra sağ alt system tray'de Docker logosunu bulabilirsiniz. Komut satırına gidip docker --version derseniz makinede kurulu olan sürümü görebilirsiniz.

Kurulum sonrası yapmayı unutmamanız gereken bir şey var. Linux üzerindeki Container'ların ayrı bir nested VM'de çalıştığını unutmayalım. Bu VM içerisindeki Container'lar ile Visual Studio 2017 RC'nin çalıştığı ortam arasındaki iletişim için Shared Drive olarak C'yi eklemeniz gerekecek.

Docker'a C'ye ulaşma izni veriyoruz.

"Shared Drives" kısmına ulaşmak için system tray'deki Docker ikonun sağ tıklayıp "Settings" kısmına geçebilirsiniz.

Docker ve Visual Studio 2017 RC

Bu noktadan sonrası artık çok kolay. Visual Studio içerisindeki yeni bir .NET Core projesi yaratırken artık "Enable Container (Docker) Support" diyerek gerekli Docker-Compose.yml ve Dockerfile'ların yaratılmasını sağlayabiliyorsunuz.

Docker'a C'ye ulaşma izni veriyoruz.

Aşağıdaki ekran görüntüsünde "Docker" da çalıştırma özelliğinin doğrudan Debug menüsünün yerini aldığını görebilirsiniz. Ayrıca "Solution Explorer" içerisinde de gerekli Docker Artifactlarını görebiliyoruz.

Docker artık Visual Studio'da Native

Dockerfile'ın içine baktığımızda aspnetcore imajından türediğini, 80 portunun dinlendiğini, source parametresi aldığını fakat gelmezse de PublishOutPut klasöründeki dosyaları container'ın dosya sistemine kopyalandığını ve dotnet ile bizim assemblynin ayağa kaldırıldığını görebiliyoruz.

[Dockerfile]

    FROM microsoft/aspnetcore:1.0.1
    ARG source
    WORKDIR /app
    EXPOSE 80
    COPY ${source:-bin/Release/PublishOutput} .
    ENTRYPOINT ["dotnet", "WebApplication2.dll"]

Docker-compose dosyası ise aslında service description olarak kabul edilebilir. Burada Dockerfile'a bir pointer var. Ayrıca DockerFile içerisinde kullanılan Source parametresi de buradan gönderiliyor. Bu DockerCompose dosyasında Build bilgisi bulunduğu için söz konusu Docker Image local olarak oluşturulacak.

[Docker-compose.yml]

version: '2'
    services:
    webapplication2:
        image: user/webapplication2
        build:
        context: .
        dockerfile: Dockerfile
        args:
            source: ${DOCKER_BUILD_SOURCE}

Son olarak Docker-Compose.ci.build ise adından da anlaşılacağı üzere CI işlemlerinden sorumlu.

[Docker-compose.ci.build.yml]

version: '2'
services:
  ci-build:
    image: microsoft/aspnetcore-build:1.0.2-msbuild-preview
    volumes:
      - .:/src
    working_dir: /src
    command: /bin/bash -c "dotnet restore && dotnet publish -c Release -o ./bin/Release/PublishOutput"

Burada enteresan olan aslında tüm build işlemini yapacak olan kodun da ayrı bir Linux Container'ında çalışıyor olması. Yukarıdaki dosya aslında aynı anda bir container definition ve farkındaysanız "microsoft/aspnetcore-build:1.0.2-msbuild-preview" adında bir image'den yola çıkıyor. Bu Docker Compose dosyasında Build bölümü yok, sadece Image repository ve tag var. O nedenle bu image indirilecek. Sonrasında container içerisinde dotnet restore ve publish komutları çalıştırılıyor.

Yeni projenizi Visual Studio içerisinden çalıştırdığınızda her zamanki gibi tarayıcıda sitenizi görecekseniz. Fakat arkada gerçekleşenler eski ASP.NET'e göre aslında çok farklı. Birincisi Hyper-V üzerinde bir Linux'ümüz var ve tüm kod orada çalışıyor. İkincisi ise tüm bunlar tabi ki bir Container üzerinde.

Linux container'ımız hayatta ve .NET Core uygulamamız çalışır durumda.

İstediğiniz zaman konsola gidip hızlı bir "docker ps" ile sistemdeki containerları listeleyebilirsiniz.

İşte hızlı bir şekilde VM içerisinde Visual Studio 2017 RC ile Docker test ortamı yaratmış olduk. Bundan sonrası size kalmış.

Görüşmek üzere.