Software Development

Docker dla programistów, instalacja i budowanie pierwszego środowiska

Luty 15, 2016 3
Podziel się:

W poprzednim artykule pisałem o zaletach jakie niesie ze sobą konteneryzacja w porównaniu do klasycznej wirtualizacji systemów.

Zalety te są w pierwszej kolejności widoczne z punktu widzenia docelowych środowisk uruchomieniowych i cieszą przede wszystkim administratorów i menedżerów wydających pieniądze na środowiska 🙂 Teraz czas na korzyści dla programistów, a te najlepiej poznać przez praktykę, więc zabieramy się do pracy.

Instalacja

Instalacji samego Docker’a opisywać szczegółowo nie zamierzam, jest świetnie opisana na stronie https://docs.docker.com. Przypomnę tylko, że Docker jest narzędziem działającym natywnie tylko pod kontrolą GNU/Linux, a użytkownicy Windows i Mac mogą z niego korzystać dzięki wykorzystaniu VirtualBox. I właśnie dla tych użytkowników powstało odrębne narzędzie Docker Toolbox, które automatyzuje proces instalacji i konfiguracji Docker’a, VirtualBox’a i pozostałych narzędzi wymaganych do działania całości.

Użytkownicy Linux mogą wybrać instalację z pakietów swojej dystrybucji, lub wykorzystać polecenie

$ curl -sSL https://get.docker.com/ | sh

do automatycznej konfiguracji źródeł pakietów i instalacji. Druga metoda jest wygodniejsza i pozwala na instalację najnowszych wersji dostarczanych przez programistów Docker’a. Użytkownicy Linux’a muszą jeszcze ręcznie doinstalować narzędzie Docker Compose, które pozwala na lepszą kontrolę uruchamianych kontenerów.

Proces instalacji na czystej maszynie z Ubuntu przedstawiam na załączonym filmie:

Środowisko deweloperskie

Zbudujemy zatem środowisko deweloperskie dla naszej aplikacji. Na początek ograniczymy się do bazy danych, którą będzie PostgreSQL w najnowszej wersji. Oficjalny obraz kontenera z zainstalowaną bazą można znaleźć w publicznym repozytorium pod adresem https://hub.docker.com/_/postgres/. Jeśli wejdziemy pod ten adres to dowiemy się że jest kilka dostępnych wersji, najnowszą stabilną jest, w chwili pisania tego tekstu, 9.4.5 oznaczona również tagiem ‘latest’, co powoduje że jest wersją domyślnie używaną. Jeśli chcemy inną wersję musimy wyraźnie dopisać tag wskazanej wersji pobierając obraz kontenera. Obraz pobieramy poleceniem

$ docker pull postgres

a listę pobranych obrazów możemy sprawdzić poleceniem

$ docker images

Jeśli chcemy uruchomić kontener z bazą możemy zrobić to w tej chwili, ale musimy pamiętać o tym, że kontener każdorazowo jest uruchamiany z innym adresem IP, co może być mocno niewygodne. Jeśli nie chcemy każdorazowo zmieniać tego adresu w parametrach połączenia to możemy przekierować wskazany port kontenera na port naszej lokalnej maszyny. Całość wykonujemy poleceniem

$ docker run -d -p 5432:5432 postgres

Parametr -d odpowiada za uruchomienie w tle, -p 5432:5432 za przekierowanie portu, postgres to nazwa obrazu. Polecenie

$ docker ps

wyświetla wszystkie uruchomione kontenery.

Dotychczasowy postęp możemy obejrzeć na załączonym filmie:

Kontener w domyślnej konfiguracji już działa i się uruchamia, ale co 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 lini 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. Wtedy 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

Przykład działania widać na kolejnym filmie:

Tak więc mamy jak widać 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 ergonomi. Z pomocą przychodzi kolejne narzędzie: docker-compose, które umożliwia zdefiniowanie kontenera lub kilku kontenerów w jednym pliku docker-compose.yml i posługiwanie się nim w celu uruchomienia całego środowiska rozwojowego. Przykład pliku zawierającego konfiguracje odpowiadającą temu co do tej pory skonfigurowałem w wierszu poleceń:

db:
  image: postgres:9.4
  environment:
    - POSTGRES_PASSWORD=camunda
    - POSTGRES_USER=camunda
  ports:
    - "5432:5432"

Po krótce, db to identyfikator kontenera, image wskazuje oczekiwany obraz, environment definiuje zmienne środowiskowe, a ports definiuje mapowanie portów.

Idąc dalej, możemy dojść do wniosku, że w środowisku rozwojowym baza danych powinna być uruchamiana z zainstalowanym schematem dostarczonym z zewnątrz. 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 2 możliwości: pierwsza polega na zbudowaniu nowego obrazu zawierającego skrypty, druga wygodniejsza polega na zamontowaniu do uruchamianego kontenera plików lub katalogu ze skryptami.

W przykładzie posłużę się gotowymi skryptami dostarczanymi z dystrybucją Camunda BPM, a do zamontowania użyję następującego pliku docker-compose.yml zawierającego nową sekcję volumes:

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

Sekcja volumes definiuje wpisy w formacie [ścieżka źródłowa]:[ścieżka docelowa]. W przykładzie posługuję się projektem, w którym w katalogu src/sql znajdują się skrypty źródłowe.

Uruchomienie kontenera z bazą danych wymaga teraz użycia znacznie prostszego polecenia:

$ docker-compose up

Przykład na poniższym filmie:

Podsumowując, udało się stworzyć środowisko rozwojowe, uruchomić je z wiersza poleceń oraz w najbardziej zaawansowanej wersji opisać jego definicję w pliku docker-compose.yml i wykorzystywać w projekcie jako standardowy jego element. Plik docker-compose.yml może być wraz z projektem dodany do repozytorium kodu i posłużyć każdemu z deweloperów do odtworzenia identycznego środowiska.

Następnym razem opiszę sposób na dodanie drugiego kontenera z serwerem aplikacyjnym i powiąże go z kontenerem bazy danych.

5 / 5
Wojciech Paciorkowski
Autor: Wojciech Paciorkowski
Programista Java, architekt EAI, zwolennik open-source i współdzielenia się wiedzą. Fanatycznie zgłębia nowe technologie i dzieli się wrażeniami z kolegami. Prywatnie mąż, ojciec i fotograf amator. Aparat zarasta kurzem, rower gnije w garażu. Jedynie gitara czasem dostaje w kość. Relaksują go dobre książki, filmy i seriale zwłaszcza o tematyce sci-fi.

Imię i nazwisko (wymagane)

Adres email (wymagane)

Temat

Treść wiadomości

komentarze(3)

avatar'
Pola
10 maja 2017 Odpowiedz

Mądre słowa. No i w sumie temat dość na czasie.

http://e-neonet.com.pl/znak-ce-atex/

avatar'
Sebastian
23 września 2018 Odpowiedz

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.

avatar'
administrator sklepu
10 listopada 2018 Odpowiedz

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 www.top-maluszek.pl

Zostaw komentarz