O Dockerze więcej dowiedzieć się musisz…

Witaj!

Początkowo planowałem napisać trochę więcej o kodzie, który wygenerowaliśmy w poprzednim wpisie oraz o uruchomieniu aplikacji. Okazało się jednak, że najwygodniej wystartować serwer przy pomocy Dockera, dlatego dzisiaj zapraszam na krótki wstęp do tej technologii. 🙂 Obiecuję, że na koniec wpisu uruchomimy Moocyourlife!

Czym jest Docker?

Jest to narzędzie do wirtualizacji pozwalające uruchamiać procesy w odizolowanych od siebie kontenerach.

Wyobraźmy sobie, że tworzymy jakąś aplikację, niech będzie webową, która korzysta z Javy 8, jakiegoś serwera bazy danych i dajmy na to Elasticsearcha do wyszukiwania. Całe środowisko deweloperskie mamy postawione lokalnie i jak to często mówią „u nas działa”.

Chcemy jednak uruchomić nasz projekt na serwerze. I to często zaczynają się schody. Bo po pierwsze, musimy tę Javę i bazy danych na tym serwerze ręcznie instalować, co może być czasochłonne. Co więcej, może się okazać, że są tam już inne wersje tych narzędzi (np Java w wersji 7), które są niezbędne do działania innych procesów na tej maszynie, i natrafiamy na konflikty zależności. W takiej sytuacji zapowiadają się godziny trudnej walki z cyfrowym wrogiem…

Z pomocą przychodzi oczywiście Docker. Pozwala on zdefiniować obraz, w którym określamy co ma być na nim zainstalowane. Np. system operacyjny Ubuntu, Java 8 oraz nasza aplikacja. Następnie taki obraz jest uruchamiany przez Dockera i voila! Mamy automatycznie zainstalowane i wyizolowane środowisko. Podsumujmy zatem najważniejsze korzyści jakie daje nam Docker:

  • Łatwy deployment aplikacji – Uruchomienie obrazu jest bardzo proste, a Docker sam zainstaluje nam wszystkie wymagane narzędzia i biblioteki.
  • Izolacja procesów – Dzięki wirtualizacji kontenery Dockerowe są od siebie niezależne i nie mamy problemów z konfliktem między zależnościami.
  • Przenośność – Tak samo łatwo uruchomimy obraz na naszej lokalnej maszynie jak i na serwerze. Oba uruchomione kontenery będą identyczne.

Docker lifecycle

Cały proces zaczyna się od plików o nazwie Dockerfile, w których definiujemy szczegóły Dockerowego obrazu. Tam znajdują się między innymi takie informacje jak:

  • obraz, który będzie podstawą do budowy naszego
  • polecenia, które mają zostać wykonane pod uruchomieniu kontenera
  • pliki, które należy wkopiować do kontenera

W przypadku Moocyourlife, Dockerfile znajduje się w katalogu „src/main/docker”. Warto zerknąć do tego pliku. Jest tam napisane, że w naszym środowisku chcemy mieć Javę 8 oraz zdeployowaną aplikację „app.war”.

Obrazy przechowywane są w rejestrze. Zarówno naszym lokalnym, jak i publicznym np. DockerHub. Dzięki temu możemy skorzystać z gotowych rozwiązań napisanych przez innych użytkowników Dockera,

Na podstawie obrazu tworzona jest jego instancja, czyli kontener z naszym wirtualnym środowiskiem. Można go dowolnie uruchamiać, zatrzymywać i restartować.

Cały ten proces ten świetnie ilustruje poniższy schemat:

Instalujemy Dockera

Dostępne są dwie wersje: Enterprise Edition oraz Community Edition. My chcemy tę drugą. Otwieramy zatem terminal i kolejno wpisujemy:

$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

Teraz dodajemy odpowiednie repozytorium. Zauważ, że trzeba podać odpowiednią wersję Ubuntu. W tym przypadku jest to „xenial”, czyli wersja na której oparty jest mój Linux Mint. Jeżeli używasz czystego Ubuntu możesz zamiast konkretnej nazwy wstawić $(lsb_release -cs).

$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
xenial \
stable"

I następnie instalujemy:

$ sudo apt-get update
$ sudo apt-get install docker-ce

I to wszystko! Docker został zainstalowany.
Zweryfikujmy proces instalacji wpisując:

$ docker version
Client:
Version: 17.03.0-ce
API version: 1.26
Go version: go1.7.5
Git commit: 3a232c8
Built: Tue Feb 28 08:01:32 2017
OS/Arch: linux/amd64

Server:
Version: 17.03.0-ce
API version: 1.26 (minimum version 1.12)
Go version: go1.7.5
Git commit: 3a232c8
Built: Tue Feb 28 08:01:32 2017
OS/Arch: linux/amd64
Experimental: false

Jeśli wszystko się powiodło, możemy wykonać polecenie, które pokaże nam jakie obrazy znajdują się w naszym lokalnym rejestrze:

$ docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 48b5124b2768 2 months ago 1.84 kB

Widzimy jeden obraz o nazwie „hello-world”. Na podstawie niego możemy uruchomić kontener, wpisując:

$ docker run hello-world

Jeżeli zostaliśmy powitani napisem „Hello from Docker!” to znaczy, że wszystko się udało!
Listę aktywnych kontenerów (uruchomionych lub nie) zobaczymy wpisując:

$ docker ps -a

Skomponujmy wszystko w całość

Ostatnim istotnym elementem jest Docker Compose, który pozwala na uruchamianie wielu obrazów jednocześnie. Dzięki temu, możemy na przykład w jednym kontenerze odpalić bazę danych, a w innym naszą aplikacje. Nie ma znaczenia, czy oba uruchomimy na jednej maszynie, czy każdy na osobnej.

Instalujemy Docker Compose

Instalacja jest prosta:

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.11.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

I to tyle! Weryfikujemy instalację wpisując:

$ docker-compose version

docker-compose version 1.11.2, build dfed245
docker-py version: 2.1.0
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t 3 May 2016

Docker Compose jest konfigurowany przy pomocy plików z rozszerzeniem „.yml”. W aplikacji Moocyourlife takie pliki znajdziemy w katalogu „src/main/docker”. Przykładowo plik „postgres.yml” uruchamia dokładnie jeden kontener, w którym jest serwer bazy danych PostrgeSQL. Obraz pobierany jest z DockerHuba.

Ale z kolei plik „app.yml” uruchamia nie tylko kontener z Postgresem, ale również drugi – z naszą aplikacją.

Uruchamiamy Moocyourlife w Dockerze

Nadszedł wreszcie czas na uruchomienie wszystkiego i sprawdzenie czy działa. 🙂 Musimy zbudować obraz aplikacji:

$ ./gradlew bootRepackage -Pprod buildDocker

Może to zająć kilka minut…

Po zakończeniu operacji zweryfikujmy czy obraz jest w rejestrze:

$ docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
moocyourlife latest ec48325959a1 6 seconds ago 135 MB
openjdk 8-jre-alpine c017141bdaa8 10 days ago 81.4 MB
hello-world latest 48b5124b2768 2 months ago 1.84 kB

Widzimy pobrany z DockerHuba obraz „openjdk” oraz nasz „moocyourlife”. Nie pozostaje nic innego jak uruchomić aplikację:

docker-compose -f src/main/docker/app.yml up

Ponieważ plik „app.yml” wymagana obrazu z bazą danych PostrgeSQL, zostanie on dociągnięty z DockerHuba i następnie wystartowany w kontenerze.

Po uruchomieniu całej aplikacji otwieramy ulubioną przeglądarkę i wpisujemy adres „localhost:8080”. Powinniśmy zobaczyć ekran powitalny:

Jeśli wszystko się powiodło, to gratuluję! Oficjalnie zostałeś Java Hipsterem! 🙂

Mam nadzieję, że udało mi się przybliżyć Ci choć trochę ideę środowiska Dockerowego. Warto jeszcze zgłębić ten temat, gdyż jest on w ostatnim czasie bardzo popularny. Zachęcam też do zadawania pytań w komentarzach! 🙂

Tymczasem, do zobaczenia i…

NIECH KOD BĘDZIE Z TOBĄ!

Dodaj komentarz

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