Przechowywanie danych w Dockerze. Co musisz o tym wiedzieć?

Wstęp

Domyślnie dane przechowywane są w ostatniej warstwie kontenera tzw. “warstwie zapisywalnej” (ang. writable). Oznacza to, że jeżeli nie powiemy Dockerowi, aby użył innej metody, nasze dane będą dostępne tak długo, jak długo działał będzie kontener.

Co zatem, gdy chcemy aby nasze dane były trwałe inaczej “persystentne” ?

Mamy dwie opcje, które mają zastosowanie niezależnie od systemu operacyjnego Docker hosta.

Którą zatem wybrać?

Zanim przejdziemy do szczegółów, zerknij proszę na poniższy obrazek.

Volume

W pełni tworzone i zarządzane przez Dockera. Każdy nowy volume jest przechowywany na dysku hosta. Oznacza to, że w przypadku zabicia kontenera, nasze dane nie zostaną naruszone. Wartym zaznaczenia jest fakt, że dane volume’ów są całkowicie odizolowane od systemu hosta, ponieważ zarządza nimi Docker.

Raz utworzony volume, może być użyty przez wiele kontenerów równocześnie. Jak to zrobić? Używając Docker CLI, poleceniem docker volume create  bądź też, możemy go zdefiniować podczas tworzenia docker-compose.yml (przykład tutaj)

Zaleca się, by tworzyć “nazwane” volumeny. Jeżeli nie podamy nazwy, docker utworzy ją za nas automatycznie.

Nawet jeśli volume nie jest używany przez żaden kontener, nie jest on automatycznie usuwany. Chcąc go usunąć należy użyć komendy docker volume rm. Aby pozbyć się wszystkich nieużywaych volume’ów użyj komendy – docker volume prune. Należy jednak uważać z tą komendą, by przypadkiem nie wyczyścić sobie ważnych dla nas danych.

Czy masz już swój egzemplarz mojego najnowszego poradnika
“10 Najlepszych Praktyk Tworzenia Dockerfile”?


Bind Mounts

Bind mounts to kolejna metoda na przechowywanie danych na dysku hosta. Różnica między bind mounts a volume jest dość znacząca. W przeciwieństwie do volume, plik lub katalog na dysku hosta jest podmontowany do kontenera. Jest to fizyczny plik lub katalog identyfikujący się pełną ścieżką na dysku hosta.

Ogólnie rzecz biorąc, bind mounts są czymś, co warto rozważyć. Należy jednak pamiętać, że Docker nie ma nad nimi władzy. Nie możesz zarządzać nimi z poziomu Docker CLI.

Druga kwestia, o której trzeba mieć świadomość, to że wykonując jakieś akcje wewnątrz kontenera, mamy możliwość zarządzania katalogami i plikami na dysku hosta. Włączając w to tworzenie, modyfikację i usuwanie(!) ważnych plików lub katalogów. Należy zatem naprawdę mocno się zastanowić zanim wybierzemy któreś z rozwiązań i dobierać rozwiązanie do problemu, a nie odwrotnie.


Inne rodzaje przechowywania danych

Docker posiada również inne rodzaje storage’y. Nie są one przeznaczone do trwałego przechowywania danych, lecz warto wiedzieć, że takowe istnieją.


Tmpfs Mounts

Dostępne tylko na wersji Docker for Linux. Kolokwialnie mówiąc, jest to tymczasowa przechowywalnia danych. Gdy kontener zostaje zatrzymany, tmpfs mount zostaje usunięty, razem z danymi które przechowywał.

Jaka jest róznica pomiędzy domyślnym zapisywaniem danych przez Dockera do warstwy zapisywalnej a tmpfs mounts?

Otóż używając tmpfs mounts, dane nie są przechowywane ani na hoście, ani w kontenerze. Może to być przydatne ze względów bezpieczeństwa, gdy twoja aplikacja potrzebuje zapisywać dużą ilość danych tymczasowych.


Named pipes

Zaprojektowane i przeznaczone tylko dla Docker for Windows. Może być wykorzystany do komunikacji pomiędzy aplikacją wewnątrz kontenera z Docker Engine API.


Podsumowanie

To tyle na dzisiaj. Mam nadzieję, że ten artykuł przyniósł Ci, chociaż trochę wartości. Jeżeli Ci się spodobał, będę niezmiernie wdzięczny, jeśli podzielisz się nim w social media!

Do usłyszenia 🙂


.

Leave a Comment

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *