W dzisiejszej części tłumaczenia serii materiałów o Dockerze porozmawiamy o pracy z danymi. A dokładniej – o wolumenach Docker. W tych materiałach nieustannie porównywaliśmy mechanizmy oprogramowania Docker do różnych jadalnych analogii. Nie odchodźmy od tej tradycji także tutaj. Dane w Dockerze możemy porównać do przypraw. Na świecie istnieje wiele rodzajów przypraw, a w Dockerze – wiele sposobów pracy z danymi.
→
→
→
→
→
→
Proszę zwrócić uwagę, że ten materiał został przygotowany z użyciem silnika Docker w wersji 18.09.1 oraz API w wersji .
Dane w Dockerze mogą być przechowywane tymczasowo lub na stałe. Zacznijmy od danych tymczasowych.
Tymczasowe przechowywanie danych
W kontenerach Docker organizacja pracy z danymi tymczasowymi może odbywać się na dwa sposoby.
Domyślnie pliki tworzone przez aplikację działającą w kontenerze są przechowywane w warstwie kontenera, która obsługuje zapis. Aby ten mechanizm działał, nie trzeba nic specjalnie konfigurować. Jest to tanie i skuteczne. Aplikacja wystarczy, że zapisze dane i kontynuuje swoją działalność. Jednak po tym, jak kontener przestanie istnieć, znikną również dane zapisane w ten prosty sposób.
Do przechowywania tymczasowych plików w Dockerze można skorzystać również z innego rozwiązania, odpowiedniego w przypadkach, gdy wymagana jest wyższa wydajność niż ta, którą osiąga się przy użyciu standardowego mechanizmu tymczasowego przechowywania danych. Jeśli nie potrzebujesz, aby Twoje dane były przechowywane dłużej, niż trwa kontener, możesz podłączyć do kontenera tmpfs – tymczasowe przechowywanie danych, które korzysta z pamięci RAM hosta. To przyspieszy operacje zapisu i odczytu danych.
Często zdarza się, że dane muszą być przechowywane także po tym, jak kontener przestanie istnieć. W tym celu przydadzą się nam mechanizmy trwałego przechowywania danych.
Stałe przechowywanie danych
Istnieją dwa sposoby, które pozwalają na wydłużenie okresu życia danych poza czas życia kontenera. Jednym ze sposobów jest wykorzystanie technologii bind mount. W tym podejściu do kontenera można zamontować na przykład istniejący folder. Procesy znajdujące się poza Dockerem będą mogły pracować z danymi przechowywanymi w tym folderze. Oto jak montowanie tmpfs i technologia bind mount.

Montowanie tmpfs i bind mount
Wady korzystania z technologii bind mount polegają na tym, że jej użycie komplikuje tworzenie kopii zapasowych, migrację danych oraz współdzielenie danych pomiędzy różnymi kontenerami. O wiele lepiej do trwałego przechowywania danych jest używać wolumenów Docker.
Wolumeny Docker
Wolumen to system plików, który znajduje się na hoście poza kontenerami. Wolumeny są tworzone i zarządzane przez Docker. Oto główne właściwości wolumenów Docker:
- Są to środki do trwałego przechowywania informacji.
- Są samodzielne i oddzielone od kontenerów.
- Mogą być współdzielone przez różne kontenery.
- Umożliwiają efektywne odczytywanie i zapisywanie danych.
- Wolumeny można umieszczać na zasobach zdalnego dostawcy chmurowego.
- Mogą być szyfrowane.
- Można im nadawać nazwy.
- Kontener może zorganizować wcześniejsze wypełnienie wolumenu danymi.
- Są wygodne do testowania.
Jak widać, wolumeny Docker mają znakomite właściwości. Porozmawiajmy o tym, jak je tworzyć.
Tworzenie wolumenów
Wolumeny można tworzyć za pomocą narzędzi Docker lub za pomocą zapytań do API.
Oto instrukcja w Dockerfile, która pozwala na utworzenie wolumenu przy uruchamianiu kontenera.
VOLUME /my_volumeKorzystając z takiej instrukcji Docker, po utworzeniu kontenera utworzy wolumen, zawierający dane już znajdujące się w wskazanym miejscu. Zauważ, że jeśli tworzysz wolumen używając Dockerfile, to nie zwalnia cię z konieczności wskazania punktu montowania wolumenu.
Wolumeny w Dockerfile można tworzyć również w formacie JSON.
Ponadto, wolumeny można tworzyć za pomocą poleceń w wierszu poleceń podczas działania kontenera.
Praca z wolumenami z linii poleceń
▍Tworzenie wolumenu
Samodzielny wolumen można utworzyć następującym poleceniem:
docker volume create --name my_volume▍Sprawdzanie informacji o wolumenach
Aby wyświetlić listę woluminów Docker, użyj następującej komendy:
docker volume lsAby zbadać konkretny wolumin, możesz to zrobić w następujący sposób:
docker volume inspect my_volume▍Usuwanie woluminu
Wolumin można usunąć w ten sposób:
docker volume rm my_volumeAby usunąć wszystkie woluminy, które nie są używane przez kontenery, można użyć następującej komendy:
docker volume prunePrzed usunięciem woluminów Docker poprosi cię o potwierdzenie wykonania tej operacji.
Jeśli wolumin jest powiązany z jakimkolwiek kontenerem, takiego woluminu nie można usunąć, dopóki nie zostanie usunięty odpowiedni kontener. Nawet jeśli kontener został usunięty, Docker nie zawsze to rozumie. Jeśli tak się zdarzy, możesz skorzystać z następującej komendy:
docker system pruneJest ona przeznaczona do czyszczenia zasobów Docker. Po wykonaniu tej komendy powinieneś mieć możliwość usunięcia woluminów, których status do tej pory był określany nieprawidłowo.
Flagi —mount i —volume
Aby pracować z woluminami, przy wywoływaniu komendy docker, często będziesz musiał korzystać z flag. Na przykład, aby stworzyć wolumin podczas tworzenia kontenera, możesz użyć takiej konstrukcji:
docker container run --mount source=my_volume, target=\/container\/path\/for\/volume my_image W dawnych czasach (przed 2017 rokiem) popularny był flaga --volume. Początkowo ta flaga (można ją również używać w skróconej formie, wtedy wygląda jako -v) była używana dla samodzielnych kontenerów, a flaga --mount — w środowisku Docker Swarm. Jednak od Docker 17.06 flaga --mount może być używana w dowolnych scenariuszach.
Należy zauważyć, że przy używaniu flagi --mount zwiększa się objętość dodatkowych danych, które należy podać w komendzie, ale z kilku powodów lepiej jest używać właśnie tej flagi, a nie --volume. Flaga --mount — to jedyny mechanizm, który pozwala pracować z usługami lub określać parametry sterownika woluminu. Ponadto, praca z tą flagą jest prostsza.
W istniejących przykładach komend, skierowanych na pracę z danymi w Dockerze, możesz napotkać wiele przykładów użycia flagi -v. Próbując dostosować te komendy do siebie, pamiętaj, że flagi --mount i --volume stosują różne formaty parametrów. To znaczy, że nie można po prostu zamienić -v na --mount i uzyskać działającej komendy.
Główna różnica między --mount i --volume polega na tym, że przy używaniu flagi --volume wszystkie parametry zbierają się razem, w jednym polu, a przy używaniu --mount parametry są oddzielone.
Podczas pracy z --mount parametry przedstawione są jako pary klucz-wartość, a mianowicie wygląda to tak klucz=wartość. Te pary oddziela się przecinkami. Oto często używane parametry --mount:
type— typ montowania. Wartością dla odpowiedniego klucza mogą być , lub . Mówimy tutaj o wolumenach, to znaczy — interesuje nas wartośćvolume.source— źródło montowania. Dla nazwanych wolumenów to jest — nazwa wolumenu. Dla nienaowanych wolumenów ten klucz nie jest podawany. Może być skrócony dosrc.destination— ścieżka, pod którą plik lub folder jest montowany w kontenerze. Ten klucz może być skrócony dodstlubtarget.readonly— montuje wolumen, który jest przeznaczony . Użycie tego klucza nie jest obowiązkowe, nie przypisuje się mu wartości.
Oto przykład użycia --mount z wieloma parametrami:
docker run --mount type=volume,source=volume_name,destination=\/path\/in\/container,readonly my_imagePodsumowanie
Oto przydatne komendy, które można wykorzystać podczas pracy z wolumenami Docker:
docker volume createdocker volume lsdocker volume inspectdocker volume rmdocker volume prune
Oto lista często używanych parametrów dla --mount, stosowanych w poleceniu typu docker run --mount my_options my_image:
type=volumesource=volume_namedestination=\/path\/in\/containerreadonly
Teraz, kiedy zakończyliśmy tę serię materiałów o Dockerze, nadszedł czas, aby powiedzieć kilka słów o tym, dokąd mogą się udać ci, którzy uczą się Dockera. duży dobry artykuł o Dockerze. książka o Dockerze (kupując tę książkę, postaraj się zdobyć najnowsze jej wydanie). jeszcze jedna książka, która będzie odpowiednia dla tych, którzy uważają, że praktyka to najlepszy sposób na naukę technologii.
Drodzy Czytelnicy! Jakie materiały o Dockerze poleciłbyś do nauki dla nowicjuszy?
Źródło: habr.com
