W dzisiejszej części tłumaczenia serii materiałów o Dockerze porozmawiamy o pracy z danymi. W szczególności o woluminach Dockera. W tych materiałach stale porównywaliśmy mechanizmy programowania Dockera z różnymi jadalnymi analogiami. Nie odejdziemy tutaj od tej tradycji. Niech dane w Dockerze będą przyprawami. Na świecie jest wiele przypraw, a Docker ma wiele sposobów pracy z danymi.
Informujemy, że niniejszy materiał został przygotowany przy użyciu silnika Docker w wersji 18.09.1 oraz wersji API 1.39.
Dane w Dockerze mogą być przechowywane tymczasowo lub na stałe. Zacznijmy od danych tymczasowych.
Tymczasowe przechowywanie danych
Istnieją dwa sposoby zarządzania danymi tymczasowymi w kontenerach Docker.
Domyślnie pliki utworzone przez aplikację uruchomioną w kontenerze są przechowywane w zapisywalnej warstwie kontenera. Aby ten mechanizm działał, nie trzeba nic specjalnego konfigurować. Okazuje się tanio i wesoło. Aplikacja musi po prostu zapisać dane i kontynuować swoje działania. Jednak gdy kontener przestanie istnieć, dane zapisane w tak prosty sposób również znikną.
Tymczasowe przechowywanie plików w Dockerze to kolejne rozwiązanie, które sprawdza się w przypadkach, gdzie potrzebny jest wyższy poziom wydajności, niż jest to możliwe przy zastosowaniu standardowego mechanizmu tymczasowego przechowywania danych. Jeśli nie potrzebujesz, aby Twoje dane były przechowywane dłużej niż istnieje kontener, możesz połączyć się z kontenerem tmpfs – tymczasowym magazynem informacji korzystającym z pamięci RAM hosta. Przyspieszy to wykonywanie operacji zapisu i odczytu danych.
Często zdarza się, że dane trzeba przechowywać nawet po tym, jak kontener przestanie istnieć. Aby to zrobić, potrzebujemy trwałych mechanizmów przechowywania danych.
Trwałe przechowywanie danych
Istnieją dwa sposoby wydłużenia okresu istnienia danych w stosunku do okresu istnienia kontenera. Jednym ze sposobów jest zastosowanie technologii mocowania wiążącego. Dzięki takiemu podejściu możesz zamontować do kontenera np. prawdziwy folder. Procesy spoza Dockera również będą mogły pracować z danymi przechowywanymi w takim folderze. Właśnie tak Popatrz Technologia mocowania i mocowania tmpfs.
Montowanie tmpfs i mocowanie wiązania
Wadą stosowania technologii bind mount jest to, że jej użycie komplikuje tworzenie kopii zapasowych danych, migrację danych i udostępnianie danych pomiędzy kilkoma kontenerami. Znacznie lepiej jest używać woluminów Dockera do trwałego przechowywania danych.
Okno dokowane woluminów
Wolumin to system plików znajdujący się na komputerze hosta poza kontenerami. Woluminy są tworzone i zarządzane przez Docker. Oto główne właściwości woluminów Dockera:
Są środkiem trwałego przechowywania informacji.
Są niezależne i oddzielone od kontenerów.
Można je współdzielić między różnymi kontenerami.
Umożliwiają zorganizowanie sprawnego odczytu i zapisu danych.
Woluminy można umieszczać w zasobach zdalnego dostawcy chmury.
Można je zaszyfrować.
Można im nadać imiona.
Kontener może zorganizować wstępne wypełnienie woluminu danymi.
Są wygodne do testowania.
Jak widać woluminy Dockera mają niesamowite właściwości. Porozmawiajmy o tym, jak je stworzyć.
Tworzenie woluminów
Woluminy można tworzyć za pomocą żądań Dockera lub API.
Oto instrukcja w pliku Dockerfile, która umożliwia utworzenie woluminu podczas uruchamiania kontenera.
VOLUME /my_volume
Stosując podobną instrukcję, Docker po utworzeniu kontenera utworzy wolumin zawierający dane, które już istnieją we wskazanej lokalizacji. Należy pamiętać, że jeśli utworzysz wolumin przy użyciu pliku Dockerfile, nie zwalnia to z konieczności określenia punktu podłączenia woluminu.
Możesz także tworzyć woluminy w pliku Dockerfile przy użyciu formatu JSON.
Ponadto woluminy można tworzyć za pomocą narzędzi wiersza poleceń, gdy kontener jest uruchomiony.
Praca z woluminami z wiersza poleceń
▍Tworzenie wolumenu
Możesz utworzyć samodzielny wolumin za pomocą następującego polecenia:
docker volume create —-name my_volume
▍Znajdź informacje o woluminach
Aby wyświetlić listę woluminów Dockera, użyj następującego polecenia:
docker volume ls
Możesz eksplorować konkretny wolumin w ten sposób:
docker volume inspect my_volume
▍Usuwanie woluminu
Możesz usunąć wolumin w następujący sposób:
docker volume rm my_volume
Aby usunąć wszystkie woluminy, które nie są używane przez kontenery, możesz skorzystać z następującego polecenia:
docker volume prune
Przed usunięciem woluminów Docker poprosi Cię o potwierdzenie tej operacji.
Jeśli wolumin jest powiązany z kontenerem, nie można go usunąć, dopóki odpowiedni kontener nie zostanie usunięty. Jednocześnie, nawet jeśli kontener zostanie usunięty, Docker nie zawsze to rozumie. Jeśli tak się stanie, możesz użyć następującego polecenia:
docker system prune
Został zaprojektowany do czyszczenia zasobów Dockera. Po wykonaniu tego polecenia powinno być możliwe usunięcie woluminów, których status był wcześniej nieprawidłowy.
Flagi --mount i --volume
Aby pracować z woluminami, po wywołaniu polecenia docker, często będziesz musiał używać flag. Na przykład, aby utworzyć wolumin podczas tworzenia kontenera, możesz użyć tej konstrukcji:
docker container run --mount source=my_volume, target=/container/path/for/volume my_image
W starożytności (do 2017 roku) flaga była popularna --volume. Początkowo ta flaga (można jej również używać w formie skróconej, wtedy wygląda -v) był używany w przypadku samodzielnych kontenerów i flagi --mount - w środowisku Docker Swarm. Jednak od wersji Docker 17.06 flaga --mount można wykorzystać w dowolnym scenariuszu.
Należy zauważyć, że podczas korzystania z flagi --mount zwiększa się ilość dodatkowych danych, które należy podać w poleceniu, ale z kilku powodów lepiej jest użyć tej konkretnej flagi, a nie --volume. Flaga --mount to jedyny mechanizm, który pozwala na pracę z usługami lub określanie opcji sterownika woluminu. Ponadto z tą flagą łatwiej się pracuje.
W istniejących przykładach poleceń manipulacji danymi Dockera można zobaczyć wiele przykładów użycia flagi -v. Próbując dostosować te polecenia do własnych potrzeb, należy pamiętać, że flags --mount и --volume używać różnych formatów parametrów. Oznacza to, że nie można po prostu wymienić -v na --mount i zdobądź pracujący zespół.
Główna różnica między --mount и --volume tak jest podczas używania flagi --volume wszystkie parametry są gromadzone razem w jednym polu i podczas używania --mount parametry są rozdzielone.
Podczas pracy z --mount parametry są reprezentowane jako pary klucz-wartość, czyli tak to wygląda key=value. Pary te oddziela się przecinkami. Oto często używane opcje --mount:
type — rodzaj mocowania. Wartość odpowiedniego klucza może wynosić związania, Tom lub tmpfs. Mówimy tu o wolumenach, czyli interesuje nas wartość volume.
source - źródło montażu. W przypadku woluminów nazwanych jest to nazwa woluminu. W przypadku woluminów nienazwanych ten klucz nie jest określony. Można to skrócić do src.
destination - ścieżka, do której plik lub folder jest montowany w kontenerze. Klucz ten można skrócić do dst lub target.
readonly - montuje zamierzony wolumin tylko do czytania. Użycie tego klucza jest opcjonalne i nie jest do niego przypisana żadna wartość.
Oto przykład użycia --mount z wieloma opcjami:
docker run --mount type=volume,source=volume_name,destination=/path/in/container,readonly my_image
Wyniki
Oto kilka przydatnych poleceń, których możesz użyć podczas pracy z woluminami Dockera:
docker volume create
docker volume ls
docker volume inspect
docker volume rm
docker volume prune
Oto lista często używanych opcji --mount, stosowane w poleceniu formularza docker run --mount my_options my_image:
type=volume
source=volume_name
destination=/path/in/container
readonly
Teraz, gdy zakończyliśmy tę serię dotyczącą Dockera, czas powiedzieć kilka słów o tym, gdzie mogą dalej podążać uczniowie Dockera. tutaj jest świetny, dobry artykuł o Dockerze. tutaj jest książka o Dockerze (kupując tę książkę, staraj się uzyskać jej najnowsze wydanie). tutaj jest kolejna książka dla tych, którzy uważają, że praktyka to najlepszy sposób na naukę technologii.
Drodzy Czytelnicy! Jakie materiały dotyczące Dockera poleciłbyś początkującym do nauki?