Docker część VII: Docker-compose

Wiemy już, jak posługiwać się kontenerami dockerowymi, wiemy także, jak tworzyć pliki Dockerfile, które pozwalają nam w łatwy sposób opakować naszą aplikację w kontener i wystawić na świat. Co jednak w przypadku, gdy nasz system składa się z kilku mniejszych aplikacji opakowanych w kontenery? Jak zarządzać takim systemem? Z pomocą przychodzi nam właśnie docker-compose.

Czym jest docker-compose? Jest to narzędzie, które pozwala na tworzenie systemów złożonych z kilku kontenerów. Najłatwiej będzie nam to wytłumaczyć na przykładzie, więc zaczynajmy ;>

Nasz przykładowy system składa się z dwóch aplikacji: prostego web-api oraz serwisu. Web-api przyjmuje dane, które wysyła na Service-busa. Wiadomości są następnie pobierane przez serwis oraz wysyłane do bazy danych mongodb. Tak więc nasz przykładowy plik docker-compose będzie wyglądał tak:
Screen Shot 2018-05-18 at 22.42.39
Cóż się w nim dzieje? Nic prostszego:
Version – decyduje o wersji docker-compose, ja używam wersji 3.
Services – wszystko, co jest po tej sekcji to po prostu serwisy, czyli nasze obrazy dockerowe
Calen-api – nazwa naszego serwisu
Image – obraz, którego użyjemy
networks – w zależności od miejsca użycia określa: sieci, do których dany kontener będzie podpięty lub, jak ma to miejsce niżej, sieci, które mają zostać stworzone. Sieci definiuje się, aby nasze kontenery mogły się widzieć. Alternatywnie możemy podać w podsekcji links, do którego kontenera mamy się łączyć.
Ports – służy do tego samego, co flaga -p w docker build – mapuje port kontenera na port naszego localhosta. Nawet jeżeli nie zmapujemy tego portu na localhosta, nasze serwisy będą mogły się komunikować między sobą, lecz my nie będziemy mieli do nich dostępu.
Driver – określa rodzaj sieci, którą tworzymy.
Podsumowując:
Screen Shot 2018-05-18 at 22.49.34

Podany wyżej przykład to już gotowa aplikacja do wdrożenia na produkcje. Jednak jeśli chcemy uruchomić naszą aplikację tylko lokalnie, nie będziemy za każdym razem budować oraz tagować naszych obrazów. Dodatkowo, po co stawiać bazę danych lokalnie, skoro możemy użyć do tego dockera? :>
Pokazany przeze mnie plik docker-compose w wersji dla naszego lokalnego środowiska wygląda tak:
Screen Shot 2018-05-18 at 22.53.23
Co się zmieniło? Po pierwsze, do naszej sieci zostały dodane mongo oraz rabbit – baza danych oraz service bus, które również są kontenerami, dostały własne nazwy, ich porty zostały zmapowane oraz zostały podpięte do naszej sieci.
Po drugie, w naszych serwisach image został zastąpiony przez build – poprzez podanie w tej sekcji ścieżki, w której znajduje się plik Dockerfile, docker-compose sam znajdzie ten plik, zbuduje obraz oraz na podstawie obrazu postawi kontener. Proste i przyjemne w obsłudze ;>

Aby uruchomić naszego docker-compose uruchamiamy komendę

docker-compose up -d --build

Flaga -d oznacza, że nasze kontenery uruchomią się w tle, natomiast –build zbuduje obrazy zanim uruchomi kontenery. Jeśli budowanie się powiedzie, naszym oczom ukaże się taki widok:
Screen Shot 2018-05-18 at 23.01.45
Jeśli chcemy teraz zatrzymać nasz serwis, wykonujemy komendę

docker-compose down

która zatrzyma oraz usunie nasze kontenery. Uwaga, nie usunie ona naszych obrazów, to musimy zrobić sami, lub dodać flagę “–rmi all”, która usunie wszystkie obrazy, których używamy ;>

To tyle, jeśli chodzi o docker-compose. Cały kod, oraz pliki, które tutaj zademonstrowałem znajdują się tutaj. Zapraszam do zadawania pytań i do następnego ;>

Advertisements

3 Replies to “Docker część VII: Docker-compose”

  1. Dzięki za ciekawy artykuł. Pozbądź się tylko dziecięcej maniery nadużywania emotikon “:>” i “;>” – bo chyba nie wyrażasz w ten sposób złośliwości wobec czytelnika?

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s