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:
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 😊.
Bartek 2021-11-11 06:11
Bardzo fajny wpis, widziałem ostatnio podobne artykuły i ten się wyróżnia na tle innych oraz jest wart uwagi. Konkretnie objaśniony temat. Bardzo przyjemnie się go czyta. Czekam na takich więcej :)