Aplikacje rozproszone, kontenery, wszystko teraz jest takie stateless. Czy to może być problem? W jaki sposób uniknąć rozrastania kontenerów ze względu na składowane dane? Oczywiście, jak to w większości informatycznych spraw, nie ma tylko jednej poprawnej odpowiedzi. W dzisiejszym artykule chciałbym wam przedstawić jak za pomocą Docker Volume możemy składować dane nie w kontenerze, tylko na maszynie na której został uruchomiony.
Co to jest docker volume
Jest to mechanizm wykorzystywany w obrazach na docker hub-ie takich baz jak PostgreSQL czy MySql. Ba, nawet w Dockerfile MongoDB możemy znaleźć linię, w której wywołują komendę "Volume". Tylko nachodzi pewnie was jedno pytanie - po co w ogóle ten zabieg?
To trochę jak z kakałkiem. Pozwala nam na mapowanie katalogów pomiędzy kontenerem, a maszyną. na której jest uruchomiony Docker. Ok, nie ma to wiele wspólnego z kakałkiem, acz sam proces jest niezwykle przydatny. Pozwala otrzymać miejsce na dane, które nie zostaną skasowane w przypadku zatrzymania pracy kontenera. Więc jak możecie się domyślać, oprogramowania bazodanowe intensywnie korzystają z tego rozwiązania. Stąd jego działanie przedstawię na przykładzie bazy MySql.
MySql dla przykładu
Aby uruchomić bazę musimy wpisać w konsoli komendę:
$ docker container run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true mysql
Ważnym elementem jest nadanie nazwy temu kontenerowi. Ułatwi to późniejszą pracę.
Docker posiada też swoje API do sprawdzania konfiguracji uruchomionego kontenera. Wykorzystując komendę:
$ docker container inspect mysql
zwraca klucz w json-ie.
Co w nim ciekawego? "Mounts", bo tak się nazywa wcześniej wspomniany klucz, przechowuje informacje o wszystkich podmapowanych katalogach. Z ważniejszych informacji otrzymujemy dwie ścieżki: "Source" i "Destination". Przekazują nam informacje lokalizacji danych na maszynie i wewnątrz kontenera. Dodatkowymi ważnymi propertisami tego obiektu są nazwa i typ. Jak widać nazwa nie jest zbyt czytelna dla zwykłego śmiertelnika, ale możemy to zmienić... ba, chcąc zachować trwałość - musimy.
Nazwany volume
Przyglądając się bliżej zachowaniu kontenera, można zaobserwować w standardowej konfiguracji doczepianie volume pod ścieżkę 'var/lib/mysql'. Wykonywana jest wtedy komenda
$ docker container run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true -v /var/lib/mysql mysql
Warto zauważyć fragment z wykorzystaniem flagi "-v", zgodnie z dokumentacją odpowiada za
-v, --volume list Bind mount a volume
No dobra, mamy stworzony volume, ale co dalej? Przecież nazwy w stylu "5a10d1f19db87f1adeae2af6e02c3c7944935e4f2229df186462c655bd7b8bb1" raczej nikt nie zapamięta. Chwała posiadającym taką umiejętność - zapraszam do mensy. Dla całej reszty pozostaje mistyczna umiejętność zwana notowaniem. Wiecie, po prostu trzeba gdzieś ją zapisać.... Nie no żarcik taki :) Docker pozwala nam na nadanie nazwy dla volume. Wystarczy uzupełnić parametr -v w sposób "nazwa:ścieżka". Dla przykładu dla naszej bazy MySql komenda będzie wyglądała tak:
$ docker container run -d --name mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true -v mysql-data:/var/lib/mysql mysql
Po uruchomieniu możemy zobaczyć, za pomocą komendy "docker container inspect mysql", że w kluczu Mounts volume (podpiętym do kontenera) otrzymał nazwę zdefiniowaną w poleceniu.
A co się stanie , jeśli ubijemy kontener mysql-a i postawimy na nowo podając mu już istniejący volume?
Jak widać na powyższym filmiku kontener podpiął się pod już istniejące dane. Dokładnie o to nam chodziło :)
Api dockera do zarządzania volume-m
Jak w większości przypadków, tak i teraz, docker dostarcza do volume-ów swoje API. Jedną z podstawowych komend jaką możemy wykorzystać jest wypisanie wszystkich obecnie posiadanych volume-ów.
$ docker volume ls
Sama taka lista zbyt dużo nam nie mówi, więc możemy wykorzystać komendę:
$ docker volume inspect \{nazwa\}
do wyświetlenia większej ilości informacji.
Kasowanie nie używanych volume-ów
Ostatnim elementem związanym z docker volume, jaki chciałbym wam pokazać w tym artykule to czyszczenie nieużywanych zasobów. Jednak nim do tego przejdziemy zapraszam do krótkiej historyjki mającej służyć jako przestroga.
Jeszcze do niedawna, kiedy nie do końca rozumiałem idei stojącej za volume-ami, używałem docker-a do szybkiego zapoznania się z technologiami. Raz postawiłem bazę MySql, innego razu MongoDB, czy nawet kolejkę wiadomości RabbitMQ - siedząc nad tym godzinami trochę się nazbierało. Co te technologie mają ze sobą wspólnego? Każda z nich wykorzystuje mechanizm volume do przechowywania danych. Gdy po raz pierwszy, po bodajże półtora roku używania docker-a, uruchomiłem komendę "docker volume prune" zwolniło mi się bodajże z 20GB miejsca na dysku :) Tak więc nie zapominajcie o sprzątaniu swojego komputera raz na jakiś czas.
Jak już wspomniałem, do usuwania nie używanych volume-ów służy komenda: docker volume prune. Wywołując ją zostaniemy ostrzeżeni o usunięciu danych i poproszeni o potwierdzenie operacji.
Na koniec docker wypiszę nam na konsoli ile udało się zwolnić miejsca na dysku i jakie volume-y zostały skasowane.
Podsumowanie
W tym artykule przybliżyłem wam co nieco idę docker volume. Oczywiście przechowywanie danych jest jednym z wielu zastosowań. Możliwe jest chociażby podmapowanie katalogu projektowego pod volume, pozwalajace stworzyć bardzo fajne środowisko developerskie bez potrzeby instalowania całego mandżuru na naszym komputerze. Jeżeli chcielibyście, abym w nadchodzących artykułach opisał jak coś takiego skonfigurować, to dajcie znać w komentarzach lub przez zakładkę Kontkat.
Do Następnego!
Cześć!