Jeżeli jesteś przyzwyczajony do tworzenia aplikacji przy wykorzystaniu Dockera, a zastanawiasz się jak zacząć przygodę z .NET i aplikacjami webowymi lub konsolowymi, to ten wpis jest dla ciebie.

Od dłuższego czasu zastanawiałem się, jaki język - obok wykorzystywanego przeze mnie na co dzień PHP - sobie po latach odświeżyć. Wybór padł na język C# i platformę .NET. Ostatnio pisałem w tym języku aplikacje lata temu (na studiach), a do tego celu instalowałem na swoim komputerze całe środowisko wraz z Visual Studio. Tym razem chciałem podejść bardziej minimalistycznie - mam już Dockera, którego wykorzystuję w innych projektach - i chciałbym móc tworzyć i uruchamiać aplikacje bez potrzeby zaśmiecania sobie systemu całym tym kombajnem od Microsoftu (kto instalował sobie Visual Studio z wszystkimi dodatkami jak leci ten wie, że potrafi zajmować tyle co dobra gra Triple-A 😂).

Do napisania tego wpisu zachęciło mnie także to, że - szukając sposobu na uruchomienie .NET w Dockerze - znalazłem sporo materiałów w Internecie. Jednak większość okazała się zbyt przekombinowana - przynajmniej na początek.

Środowisko dla aplikacji konsolowej

Tworząc środowisko będziemy opierać się na obrazie Dockerowym udostępnionym przez Microsoft w ich własnym repozytorium obrazów:

mcr.microsoft.com/dotnet/sdk:5.0

Najpierw będziemy potrzebować przykładowego projektu wraz z plikiem csproj. W tym celu można wykorzystać narzędzie dotnet cli dostarczane w powyższym obrazie:

docker run -v "${PWD}/:/app" -w "/app" mcr.microsoft.com/dotnet/sdk:5.0 dotnet new console

Jeżeli powyższego obrazu nie miałeś w systemie, to zostanie on najpierw pobrany. Następnie zostanie przygotowany projekt i umieszczony w bieżącym katalogu.

Teraz stworzymy plik obrazu, który będzie w trakcie budowania tworzył aplikację. Dlatego w tym przypadku każda modyfikacja kodu źródłowego będzie wymagała przebudowy obrazu. W pliku o nazwie Dockerfile wstawiam następującą treść:

FROM mcr.microsoft.com/dotnet/sdk:5.0

WORKDIR /app

COPY . /app

RUN dotnet build

ENTRYPOINT ["dotnet", "run", "--no-build"]

Teraz wystarczy zbudować obraz:

docker build --tag="demo" .

Oraz uruchomić aplikację:

docker run -it demo

Jeżeli zrobisz teraz jakieś zmiany, to wystarczy znowu przebudować obraz i uruchomić kontener. To wszystko! 😀

Środowisko dla aplikacji webowej

Dla aplikacji webowej zastosujemy trochę inne podejście - zakładam, że będziemy chcieli zarządzać kontenerem za pomocą docker compose, a zmiany w kodzie testować bez przebudowywania całej aplikacji.

W tym celu (podobnie jak wcześniej), będę potrzebował przykładowego projektu. Korzystam z tego samego obrazu co wcześniej, ale używam innego szablonu:

docker run -v "${PWD}/:/app" -w "/app" mcr.microsoft.com/dotnet/sdk:5.0 dotnet new web

Z powstałych plików usuwamy katalog Properties - nie będzie nam w tym momencie potrzebny, a konfigurację portów skonfigurujemy gdzie indziej.

Teraz stworzę nowy plik docker-compose.yaml z konfiguracją:

version: '3'
services: 
    web:
        image: mcr.microsoft.com/dotnet/sdk:5.0
        entrypoint: "dotnet watch run"
        working_dir: /app
        environment: 
            DOTNET_USE_POLLING_FILE_WATCHER: "true"
            BUILD_CONFIGURATION: Debug
            ASPNETCORE_ENVIRONMENT: Development
            ASPNETCORE_URLS: https://0.0.0.0:443;http://0.0.0.0:80
        volumes: 
            - ".:/app/src"
            - "./app.csproj:/app/app.csproj"
        ports: 
            - "80:80"
            - "443:443"

Jako entrypoint używamy watch'a, dzięki czemu nie będziemy musieli przebudowywać i restartować całego serwera. Zmienna środowiskowa ASPNETCORE_ENVIRONMENT pozwoli nam na zarządzanie wersją środowiska.

Teraz wystarczy uruchomić kontener za pomocą polecenia:

docker compose up -d

I wejść pod adres:

http://localhost

Jeżeli będziesz chciał wykonać zmianę, to po zmodyfikowaniu pliku źródłowego i poczekaniu kilku sekund, zmiany zostaną zaaplikowane na działającą instancję aplikacji.

Kilka słów na koniec

Jak widać, konfiguracja środowiska na potrzeby tworzenia aplikacji w .NET nie musi być skomplikowana. Oczywiście, jeżeli będziemy chcieli zagłębić się mocniej, to będziemy musieli wykonać więcej zmian w konfiguracji. Ale na potrzeby "szybkiego startu" z projektem do nauki, można z powodzeniem zacząć od tej prostej propozycji.

Jeżeli powyższa instrukcja ci się przydała, to daj znać w komentarzu 😊.