Poprzedni artykuł opisuje zalety, jakie niesie za sobą konteneryzacja, w porównaniu do klasycznej wirtualizacji systemów.
W pierwszej kolejności zalety te są istotne z punktu widzenia docelowych środowisk uruchomieniowych i cieszą administratorów oraz menedżerów zarządzających finansami projektów. Jednak w codziennej pracy programistów konteneryzacja również przynosi liczne korzyści, z którymi najlepiej zapoznać się w praktyce 😊
Budowa środowiska deweloperskiego
Aby zapoznać się z samym procesem instalacji Dockera, polecam przejrzeć dokumentację, w której ten temat został wyczerpany.
Zbudujemy zatem środowisko deweloperskie dla naszej aplikacji. Na początku ograniczymy się do bazy danych, którą będzie PostgreSQL. Oficjalny obraz kontenera z zainstalowaną bazą można znaleźć w publicznym repozytorium.
Z repozytorium dowiemy się, że jest kilka dostępnych wersji. Najnowsza, stabilna wersja, jest oznaczona tagiem „latest”, dzięki czemu staje się wersją domyślnie używaną. Jeśli chcemy skorzystać z innej, musimy dopisać tag wybranej wersji, pobierając obraz kontenera.
Obraz pobieramy poleceniem:
$ docker pull postgres:latest
a listę pobranych obrazów możemy sprawdzić poleceniem:
$ docker images
Jeśli chcemy uruchomić kontener z bazą, możemy to zrobić od razu, ale musimy pamiętać o tym, że kontener jest uruchamiany każdorazowo z innym adresem IP. Może to być dość niewygodne. Jeśli nie chcemy za każdym razem zmieniać tego adresu, w parametrach połączenia możemy przekierować wskazany port kontenera na port naszej lokalnej maszyny.
Całość wykonujemy poleceniem:
$ docker run -e POSTGRES_PASSWORD=password -d -p 5432:5432 --name psqldb postgres
Oznaczenia paramerów
Kolejne parametry oznaczają:
- -e – ustawianie zmiennej środowiskowej POSTGRES_PASSWORD,
- -d – uruchomienie w tle,
- -p 5432:5432 – przekierowanie portu (port host-a:port kontener-a),
- –name – nazwę kontenera,
- postgres – to nazwa obrazu.
Poniższe polecenie wyświetla wszystkie uruchomione kontenery:
$ docker ps
Zmiana ustawień
Kontener działa już w domyślnej konfiguracji. Pojawia się pytanie, co zrobić w przypadku, gdybyśmy chcieli zmienić pewne ustawienia.
Według dokumentacji jest to możliwe z użyciem zmiennych środowiskowych ustawianych w trakcie uruchamiania kontenera. Przełącznik -e w linii poleceń może posłużyć do ustawienia zmiennej środowiskowej i możemy go użyć wielokrotnie.
Załóżmy, że chcemy uruchomić kontener postgresql z użytkownikiem i bazą danych o nazwie „camunda” oraz identycznym hasłem do bazy. Wówczas pełne polecenie będzie wyglądać następująco:
$ docker run -d -e POSTGRES_PASSWORD=camunda -e POSTGRES_USER=camunda -p 5432:5432 --name psqldb postgres:9.4
Docker Compose
Mamy więc możliwość uruchomienia skonfigurowanego kontenera, przekazując wszystkie parametry w wierszu poleceń. Łatwo jednak dojść do wniosku, że pisanie pełnego polecenia nie jest szczytem ergonomii.
Z pomocą przychodzi kolejne narzędzie – Docker Compose (jego proces instalacyjny znajdziecie tutaj). Umożliwia deklaratywne zdefiniowanie kontenera lub kilku kontenerów w jednym pliku docker-compose.yml i posługiwanie się nim w celu uruchomienia całego środowiska rozwojowego.
Poniżej przykład pliku, zawierający konfigurację odpowiadającą temu, co do tej pory skonfigurowałem w wierszu poleceń (nazwa: docker-compose.yml):
db:
image: postgres:9.4
environment:
- POSTGRES_PASSWORD=camunda
- POSTGRES_USER=camunda
ports:
- "5432:5432"
Oznaczenia parametrów
Pokrótce:
- db – identyfikator kontenera,
- image – wskazuje oczekiwany obraz,
- environment – definiuje zmienne środowiskowe,
- ports – definiuje mapowanie portów.
Uruchamianie kontenerów
Uruchomienie kontenera z bazą danych wymaga teraz użycia znacznie prostszego polecenia:
$ docker-compose up -d
Oznaczenia:
- up – oznacza uruchomienie zdefiniowanych kontenerów,
- parametr -d – uruchamia w tle.
Idąc dalej, możemy dojść do wniosku, że w środowisku rozwojowym baza danych powinna być uruchamiana z zainstalowanym schematem dostarczonym z zewnątrz.
Dodanie skryptów SQL
Oficjalny kontener PostgreSQL pozwala na dodanie w odpowiednim miejscu skryptów SQL, które zostaną wykonane podczas pierwszego startu kontenera.
Aby je dostarczyć do kontenera mamy dwie możliwości:
1. pierwsza polega na zbudowaniu nowego obrazu zawierającego skrypty,
2. druga, wygodniejsza, polega na zamontowaniu do uruchamianego kontenera plików lub katalogu ze skryptami.
W poniższym przykładzie sekcja volumes definiuje wpisy w formacie [ścieżka źródłowa]:[ścieżka docelowa]. Podane ścieżki są tylko przykładem, w jaki można zrealizować montowanie plików do kontenera:
db:
image: postgres:9.4
environment:
- POSTGRES_PASSWORD=camunda
- POSTGRES_USER=camunda
ports:
- "5432:5432"
volumes:
- ./src/sql/postgres_engine_7.3.0.sql:/docker-entrypoint-initdb.d/postgres_engine_7.3.0.sql
- ./src/sql/postgres_identity_7.3.0.sql:/docker-entrypoint-initdb.d/postgres_identity_7.3.0.sql
Kilka słów podsumowania
Plik docker-compose.yml może zostać dodany do repozytorium kodu wraz z projektem i posłużyć każdemu z programistów do odtworzenia identycznego środowiska, jak to, które uruchomiliśmy.
W następnym artykule opiszę sposób na dodanie drugiego kontenera z serwerem aplikacyjnym i powiążę go z kontenerem bazy danych.
***
Mądre słowa. No i w sumie temat dość na czasie.
http://e-neonet.com.pl/znak-ce-atex/
Po polsku jednak więcej się rozumie, tak wnioskuję w sytuacji gdzie jest tylko kilkoro wyobrażeń i domysłów na temat czegoś (tj. dockera), no i próbujemy przeczytać coś zwięzłego co zawrze esencję tematu, aby wstępnie stanąć na nogi w tym temacie. Dzięki za art.
Można spytać w jaki sposób osadziłeś video z asciinemy? Tam normalnie jest osadzenie generowanego PNG będącego linkiem do serwisu asciinema.org.
Właśnie testuję to środowisko, jeszcze kilka lat temu nikomu się o tym nie śniło, a tu wirtualizacja wprowadza wiele nowości i świeżości. to najprawdopodobniej będzie hit tego wieku 🙂 pozdrawiam administrotor http://www.top-maluszek.pl