Wprowadzenie

Docker jest platformą przeznaczoną dla programistów i administratorów pozwalającą na rozwijanie, wdrażanie i uruchamianie aplikacji w oparciu o kontenery. Użycie kontenerów do wdrażania aplikacji nazywamy konteneryzacją. Sama idea kontenerów nie jest nowa – jednakże ich wykorzystanie do łatwego wdrażania aplikacji już tak.

Konteneryzacja jest coraz popularniejsza ponieważ podejście to wyróżnia:

  • Elastyczność: nawet najbardziej złożone aplikacje można konteneryzować;
  • Lekkość: kontenery wykorzystują i dzielą wspólne jądro systemu operacyjnego;
  • Wymienność: wdrażanie aktualizacji i ulepszeń odbywa się w locie;
  • Przenośność: kontenery mogą być budowane lokalnie, wdrażane w chmurze i wykorzystywane z dowolnego miejsca;
  • Skalowanie: kopie kontenerów mogą być dodawana i dystrybuowane automatycznie;
  • Możliwość układania w stos: zaczynamy od zupełnej podstawy a następnie dokładamy kolejne usługi, tj. zaczynamy od podstawowego obrazu .NET Core sdk, w kolejnym kroku dodajemy naszą aplikację a następnie dodajemy obsługę bazy danych, etc.
Docker - konteneryzacja

Obrazy i kontenery

Kontener jest uruchomionym obrazem. Obraz jest tzw. ‘pakietem wykonywalnym’, który zawiera wszystko co niezbędne do uruchomienia aplikacji, tj. kod, środowisko wykonawcze, biblioteki, zmienne środowiskowe oraz pliki konfiguracyjne.

Kontener jest działającą instancją obrazu, tj. obrazem ze stanem lub procesem użytkownika. Jeżeli chcesz zobaczyć listę działających kontenerów możesz posłużyć się poleceniem: docker ps

Kontenery i maszyny wirtualne

Kontener natywnie działa na systemie Linux i współdzieli jądro systemu operacyjnego z innymi kontenerami. Działa dyskretnie – nie pobiera więcej pamięci niż jakikolwiek inny plik wykonywalny – to zapewnia mu lekkość.

Z kolei maszyna wirtualna (VM) uruchamia pełnowymiarowy system operacyjny z wirtualnym dostępem do zasobów hosta za pomocą hiperwizora (jest to narzędzie niezbędne do prowadzenia procesu wirtualizacji, np. Microsoft Hyper-V czy VirtualBox). Generalnie, maszyny wirtualne zapewniają środowisko z większą ilością zasobów niż potrzebuje większość aplikacji. Docker: infrastruktura

Przygotowanie środowiska

W pierwszej kolejności musimy zainstalować obsługiwaną wersję Docker Community Edition (CE) lub Enterprise Edition (EE) na wspieranej platformie.

Jeżeli jeteście użytkownikami Windowsa 7 lub Windowsa 8 musicie zainstalować Docker Toolbox

Po poprawnym zainstalowaniu aplikacji i pierwszym uruchomieniu zobaczycie poniższy ekran: Docker: początek W tym momencie dojdzie do pobrania niezbędnych plików, np. Boot2Docker (jest to minimalistyczna dystrybucja Linux’a, której jedynym celem jest uruchamianie kontenerów) oraz automatycznej konfiguracji.

Jeżeli wszystko przebiegnie pomyślnie zobaczycie ekran podsumowania: Docker: instalacja

Możemy teraz sprawdzić szczegóły dotyczące naszej instalacji. W tym celu posłużymy się poleceniem:
docker version Docker: wersja

Przetestowanie instalacji

Poprawność instalacji możemy sprawdzić uruchamiając podstawowy obraz Docker’a, tj. hello-world
Posłużymy się poleceniem: docker run hello-world Docker: hello world W Waszym przypadku również powinien pojawić się komunikat: “This message shows that your installation appears to be working correctly". Oznacza to, ni mniej ni więcej, że jesteśmy gotowi do pracy.

Sprawdźmy jeszcze dla pewności jakie obrazy zostały pobrane na nasz komputer:
docker image ls Docker: lista obrazów

Ostatnim krokiem w przetestowaniu naszej instalacji będzie wyświetlenie listy wszystkich kontenerów. W tym celu posłużymy się poleceniem:
docker container ls -all
Możecie zauważyć, że dodałem opcję -all - wyświetla nam wszystkie kontenery, nawet te obecnie nie działające. Kontener (utworzony przez obraz), którym posługujemy się w tym przypadku, tj. hello-world, kończy swoją pracę po wyświetleniu komunikatu. Możecie to zobaczyć na poniższym zrzucie ekranu: Docker: lista kontenerów

Podsumowanie

Na tym etapie jesteśmy już gotowi do przygotowania obrazu z naszą aplikacją testową utworzoną w technologii .NET Core. Jest to częścią kolejnego artykułu dotyczącego konteneryzacji: .NET Core – Docker: pierwsza aplikacja

Zanim jednak przejdziemy dalej chciałbym pokazać i zwrócić uwagę na jeszcze jedną rzecz. Rozpoczynając swoją przygodę z Docker’em możecie bardzo szybko znacznie zredukować swoje miejsce na dysku twardym. Poszczególne obrazy, zależnie od wersji, mogą zajmować nawet kilka GB. Co istotne, wywołanie tych poleceń na internecie mobilnym, może również bardzo szybko zredukować Wasz transfer do 0. Dlatego pokaże polecenia pobierania i kasowania obrazów tak, aby być świadomym ich wielkości (zarówno z perspektywy transferu danych jak i miejsca zajmowanego na dysku twardym).

Pierwsze z poleceń to pull. Jeżeli dany obraz nie istnieje na dysku twardym dojdzie do jego pobrania, z ogólnodostępnej i darmowej biblioteki Docker Hub. My zajmujemy się przygotowaniem aplikacji w oparciu o technologię .NET Core dlatego potrzebujemy odpowiedniego obrazu:
docker pull microsoft/dotnet:sdk
Możecie zobaczyć proces pobierania obrazu: Docker: pull Po zakończeniu pobierania warto wyświetlić listę wszystkich obrazów tak, aby mieć pewność, że pobieranie przebiegło pomyślnie:
docker image ls Sprawdźcie teraz kolumnę SIZE. Nasz testowy obraz hello-word zajmuje 1.84kB, podczas gdy, tzw. software development kit już 1.73GB. Wystarczy pobrać kilka przykładowych obrazów i bardzo szybko przekroczymy kilka GB przestrzeni na naszym dysku (i transferu).

Ja pobrałem jeszcze jeden obraz:
docker pull microsoft/dotnet:runtime, który zajmuje znacznie mniej przestrzeni: Obraz ten zawiera tylko zależności niezbędne do uruchomienia naszej aplikacji – o tym jednak w osobnym artykule.

Ostatni paragraf w tym, nieco przydługim, podsumowaniu. Docker dostarcza jedno polecenie, które wyczyści następujące zasoby: zatrzymane kontenery, wszystkie skonfigurowane sieci, które nie są używane oraz obrazy, które nie są używane przez inne obrazy (mówimy tutaj o kolejnych warstwach dodawanych do obrazu bazowego i połączeniach pomiędzy nimi):
docker system prune
Jeżeli jednak chcecie dodatkowo usunać wszystkie nieużywane wolumeny oraz obrazy nie powiązane z kontenerami należy dodać flagę -a do naszego polecenia:
docker system prune -a

Nic jednak nie stoi na przeszkodzie w usunięciu pojedynczego kontenera:
docker rm id_lub_nazwa_kontenera

Czy też pojedynczego obrazu:
docker rmi nazwa_obrazu