blog.it-business.pl

Hostowanie aplikacji web .Net Core w kontenerach Docker na Windows

Ten artykuł opisuje jak hostować aplikację web .NET Core na platformie Docker na Windows.

Dlaczego warto zająć się tematem kontenerów? Pozwalają oszczędzać zasoby, ułatwiają wdrażanie aplikacji i testowanie ich kolejnych wersji. Mogą zastąpić hosting i maszyny wirtualne. Przykład: Aplikację .NET Core możemy hostować na wirtualnej maszynie Windows Server, który wymaga minimum kilkunastu GB przestrzeni dyskowej, kilku GB pamięci RAM i sporych zasobów procesora. Kontener, w którym uruchomimy naszą aplikację będzie miał rozmiar nie większy niż 300 MB i zużyje dużo mniejszą ilość mocy obliczeniowej.

Jaka jest fachowa definicja kontenera możesz przeczytać w sieci. Choć wiele osób się ze mną nie zgodzi ja w prostych słowach zdefiniuję kontener jako maleńką maszynę wirtualną, która posiada wszystkie biblioteki niezbędne do uruchomienia naszej aplikacji. Oczywiście korzysta z zasobów fizycznego serwera, ale potrzebuje ich nieporównywalnie mniej. O kontenerze myśl raczej jak o odizolowanym procesie w systemie.

W tym artykule wykorzystam kontenery platformy Docker. Jako środowisko testowe posłuży nam Desktop Docker dla Windows. W oddzielnym artykule opisuję jak tę samą aplikacją hostować na kontenerach Docker na AWS.

Instalacja Dockera

1. Zarejestruj się na stronie hub.docker.com, a następnie pobierz Docker Desktop dla Windows z tej strony: https://www.docker.com/products/docker-desktop

2. Zainstaluj Dockera. Docker utworzy w Windows wirtualną maszynę w Hyper-V. Dlatego Desktop Docker wymaga wersji Windows, która posiada rolę Hyper-V, np. Windows 10 Professional.

Jeśli instalacja przebiegnie poprawnie, na pasku zadań w Windows pojawi się ikona Dockera w statusie “Docker Desktop is running”.

Kliknięcie na ikonę rozwinie menu Dockera.

3. Z menu Dockera wybieramy “Settings”. Dokonamy jednej zmiany, która będzie potrzebna przy publikowaniu aplikacji do kontenera. Udostępnimy dysk C: kontenerom Dockera.

Po wybraniu dysku i wciśnięciu przycisku “Apply” być może zostaniesz poproszony o podanie użytkownika i hasła do Windows.

4. Możemy teraz wydać kilka poleceń “docker” w oknie wiersza poleceń Windows, aby sprawdzić czy docker działa.

 

Tworzenie aplikacji .NET Core w Visual Studio 2019

5. Utworzymy aplikację web .Net Core w Visual Studio 2019, a następnie uruchomimy ją w kontenerze Docker. Tworzymy nowy projekt i z szablonów wybieramy Aplikację internetową platformy ASP.NET Core.

Podajemy podstawowe parametry projektu i klikamy przycisk “Utwórz”.

6. W kolejnym oknie podajemy wersję .NET Core, w której będziemy tworzyć aplikację oraz ustawiamy 2 ważne parametry:

a)
Konfiguruj dla protokołu HTTPS – wyłączamy, aby nie komplikować początkowych kroków z Dockerem.

b) Włącz obsługę platformy Docker – oczywiście włączamy.

Klikamy “Utwórz”.

7. Po otworzeniu się projektu zobaczymy opcję debugowania aplikacji na platformie Docker. Uruchamiamy debugowanie, aby zobaczyć jak aplikacja zostanie uruchomiona w kontenerze.

Pierwsze uruchomienie potrwa trochę dłużej, bo Docker musi ściągnąć wszystkie potrzebne biblioteki do utworzenia obrazu naszej aplikacji.

W efekcie aplikacja powinna się poprawnie skompilować i otworzyć w przeglądarce.

8. Zobaczmy jak nasza aplikacja wygląda od strony platformy Docker i kontenera. W wierszu poleceń Windows wydamy 2 komendy: “docker images” i “docker ps”.

Jak widzimy kompilator visual studio utworzył obraz naszej aplikacji (docker images) i ściągnął do systemu plików Docker. Id tego obrazu to 128187c1ec4e. Rozmiar 261 MB.

Następnie obraz aplikacji został uruchomiony w kontenerze (docker ps) z id: fa61f84ce8f5.

Możemy również zauważyć że port 80 na którym nasłuchuje kontener został zmapowany na port 10778 hosta.

Do tej pory wszystko zrobił za nas kompilator Visual Studio. Teraz zobaczymy jak samodzielnie opublikować aplikację na platformę Docker.

Tworzenie lokalnego rejestru obrazów

Na naszej lokalnej platformie Docker utworzymy rejestr obrazów, w którym opublikujemy obrazy naszej aplikacji. Następnie uruchomimy te obrazy w kontenerach.

9. Aby uruchomić lokalny rejestr obrazów Docker, według instrukcji jaką można znaleźć w dokumentacji powinniśmy wydać w wierszu poleceń komendę:

$ docker run -d -p 5000:5000 –restart=always –name rejestrL registry:2

Nie jest to nic innego jak uruchomienie w kontenerze obrazu aplikacji (serwisu) “registry” udostępnianego przez społeczność Dockera.

Parametr

  • -d uruchamia instancję w tle,
  • -p przekierowuje port kontenera na port hosta. W tym przypadku port 5000 kontenera, na którym nasłuchuje rejestr będzie widoczny z poziomu hosta również pod numerem 5000,
  • –restart=always informuje demona Dockera, że ma zawsze restartować (próbować uruchamiać) kontener jeśli tylko ten istnieje. Oznacza to że rejestr będzie startował automatycznie nawet po restarcie całego środowiska Dockera, chyba że usuniemy kontener,
  • –name rejestrL uruchomi rejestr w kontenerze o nazwie “rejestrL”,
  • registry:2, nazwa obrazu (i nazwa tagu po dwukropku), który będziemy uruchamiać.

Wydajmy to polecenie i zobaczmy wynik:

Docker nie posiada lokalnie obrazu aplikacji “registry” więc ściąga ją z publicznego rejestru. Pobiera tzw. warstwy czyli obrazy pośrednie konieczne do uruchomienia obrazu “registry”. Po ukończeniu pobierania obraz zostaje uruchomiony:

Nasz lokalny rejestr działa.

10. W starszych wersjach Dockera można było używać url rejestru w postaci “localhost:5000” lub “127.0.0.1:5000”. W aktualnych wersjach przy próbie publikacji obrazu pod takim adresem rejestru pojawi się błąd. Konieczne jest podanie url w postaci nazwy rozwiązywalnej przez DNS. Aby zmienić url naszego hosta na akceptowalny przez Docker wykorzystamy plik znajdujący się w C:\Windows\System32\drivers\etc\hosts. Dla tych, którzy nie pamiętają co to za plik odsyłam do googla. W pliku dodajemy wpis i zapisujemy:

Efekt:

Mamy wszystko gotowe do opublikowania aplikacji w lokalnym rejestrze obrazów.

Publikowanie aplikacji w lokalnym rejestrze Docker

11. W Visual Studio klikamy prawym przyciskiem na nazwę projektu i wybieramy “Opublikuj”.

12. W kreatorze profili publikowania aplikacji wybieramy “Rejestr kontenerów” i po prawej opcję “Niestandartowy”. Klikamy “Utwórz profil”.

13. W kolejnym okienku podajemy adres url naszego rejestru. Tutaj “rejestr.m:5000” i klikamy “Zapisz”:

14. Profil zostaje utworzony. Przed publikacją zmieniamy tag (znacznik) obrazu na “v1”, co będzie oznaczało wersję 1 naszej aplikacji. Następnie klikamy “Publikuj”.

15. Po zakończonej poprawnie kompilacji obraz utworzony przez Visual Studio zostanie przesłany do rejestru Dockera. Otworzy się okienko pokazane jak poniżej, w którym wyświetli się informacja o przesyłanych warstwach.

16. Wydajemy polecenie “docker images”, aby zobaczyć czy nasz obraz jest widoczny w Docker. Jak widać w systemie jest dostępny obraz naszej aplikacji z tagiem “v1” i jego kopia z tagiem “latest”. Tag latest jest przypisywany najnowszemu obrazowi aplikacji. ID obrazu v1 i latest jest identyczne.

17. Zmodyfikuję w aplikacji plik Index.cshtml i zmienię nagłówek na “Aplikacja M wersja 2.0“. Następnie ponownie opublikuję aplikację w Docker, ale zmienię tag obrazu na v2.

18. Po opublikowaniu aplikacji jest dostępny obraz z tagim v2. Zauważ że teraz kopia obrazu latest ma ID identyczne z obrazem v2, czyli ostatnim.

 

Uruchamianie obrazu aplikacji w kontenerze Docker

19. Aby uruchomić naszą aplikację (obraz) w kontenerze Dockera wykorzystamy znane nam już polecenie “docker run”.

$ docker run -d -p 5081:80 –name apMv1 aplikacjam

Parametr

  • -d uruchamia instancję w tle,
  • -p przekierowuje port kontenera na port hosta. W tym przypadku port 80 kontenera, na którym nasłuchuje aplikacja będzie widoczny z poziomu hosta pod numerem 5081,
  • –name uruchomi rejestr w kontenerze o nazwie “apMv1”,
  • “aplikacjam” to nazwa obrazu, który będziemy uruchamiać.

Obraz został uruchomiony w kontenerze. Otwieramy url http://localhost:5081 w przeglądarce, aby sprawdzić czy działa. Jak widzimy została uruchomiona wersja 2.0 aplikacji, czyli ostatni, najnowszy obraz.

20. Teraz chcielibyśmy w osobnym kontenerze uruchomić aplikację w wersji 1.0. W tym celu wydajemy polecenie

$ docker run -d -p 5082:80 –name apMv2 rejestr.m:5000/aplikacjam:v1

Mamy teraz uruchomione dwa kontenery, z dwiema wersjami obrazu. Jedna wersja aplikacji jest dostępna na porcie 5081, a druga na porcie 5082:

 

Firma Docker udostępnia publiczny i prywatny rejestr obrazów aplikacji. Po rejestracji na https://hub.docker.com mamy możliwość utworzenia za darmo jednego rejestru prywatnego i kilku rejestrów publicznych.

 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *