Powrót do bloga

Udostępnianie danych między kontenerami Docker

Udostępnianie danych między kontenerami Docker

Wprowadzenie

Docker to platforma kontenerowa, która stanowi lekkie, zwirtualizowane, przenośne, zdefiniowane programowo i standaryzowane środowisko, pozwalające na uruchamianie oprogramowania w izolacji od innych programów działających na fizycznej maszynie hosta. Docker jest kluczowym elementem aspektu ciągłego rozwoju i integracji (Continuous Development and Integration) w inżynierii oprogramowania. Zapewniając spójne środowisko uruchomieniowe, Docker gwarantuje, że oprogramowanie zachowuje się tak samo, niezależnie od fizycznej maszyny hosta, na której jest wdrożone. Aby uzyskać szczegółowy przegląd ekosystemu Docker, zapoznaj się z tym artykułem.

Choć kontenery Docker są samowystarczalne, czasami muszą współdzielić dostęp do danych lub zapisywać dane na dysku po zatrzymaniu kontenera. Dane te mogą mieć postać baz danych, plików dziennika (logów) lub danych generowanych przez użytkowników. Takich danych nie da się uwzględnić w pliku konfiguracyjnym obrazu Docker, ale muszą być one dostępne, aby aplikacja działała zgodnie z oczekiwaniami. Współdzielenie i utrwalanie danych w kontenerach Docker jest obsługiwane przez Docker Volumes. Docker Volumes mogą być tworzone podczas tworzenia kontenera lub tworzone później i dołączane do kontenerów. W tym samouczku omówimy cztery różne sposoby współdzielenia danych między kontenerami.

Wymagania wstępne

Pamiętaj, że choć pracujemy na systemie Ubuntu 20.04, instrukcje i polecenia dla Dockera będą działać na każdym innym systemie operacyjnym z zainstalowanym Dockerem i użytkownikiem sudo dodanym do grupy docker, jak wyjaśniono w powyższych wymaganiach wstępnych.

Krok 1: Tworzenie niezależnych wolumenów Docker

Zaczniemy od utworzenia niezależnych wolumenów, które nie są powiązane z żadnym kontenerem Docker. Służy do tego polecenie docker volume create wprowadzone w wersji Docker 1.9. Wprowadź następujące polecenie, aby utworzyć wolumen o nazwie Step1DataVolume :

Powinieneś zobaczyć następujący wynik wskazujący, że tworzenie wolumenu zakończyło się sukcesem:

Docker Volume Create

Nowy, niezależny wolumen możemy teraz wykorzystać, tworząc przykładowy kontener z oficjalnego obrazu Ubuntu. Wprowadź następujące polecenie, aby utworzyć kontener i podłączyć wolumen:

W tym poleceniu flaga --rm automatycznie usunie kontener po jego zakończeniu. Flaga -v służy do określenia i zamontowania wolumenu. Flaga -v przyjmuje nazwę wolumenu, dwukropek oraz ścieżkę bezwzględną wewnątrz kontenera, w której wolumen ma się pojawić. Pamiętaj, że podczas uruchamiania polecenia, jeśli określone katalogi w ścieżce nie istnieją, zostaną utworzone. Jeśli już istnieją, zamontowany wolumen ukryje istniejącą zawartość. W przypadku flagi -ti, litera -t daje dostęp do terminala, a -i pozwala nam na interakcję z kontenerem za pośrednictwem terminala.

Będąc wewnątrz kontenera, uruchom następujące polecenie, aby zapisać dane do wolumenu:

Wpisz exit i naciśnij enter, aby wyjść z kontenera. Jak wyjaśniono, kontener jest automatycznie usuwany po wyjściu dzięki fladze --rm, jednak wolumen nadal będzie dostępny.

Aby zweryfikować, czy wolumen nadal istnieje, możesz użyć polecenia docker volume inspect:

Powinieneś zobaczyć następujący wynik:

Docker Volume Inspect

Następnie utwórzmy nowy kontener. Najpierw podłączmy wolumen i sprawdźmy, czy mamy dostęp do tekstu utworzonego w poprzednim kontenerze. Wprowadź następujące polecenie, aby utworzyć i uruchomić kontener przy użyciu ubuntu obraz:

Wewnątrz kontenera uruchom następujące polecenie, aby zweryfikować, czy StepOne.txt plik istnieje:

Powinieneś zobaczyć podobny wynik:

Docker Volume Content 1

Następnie wpisz exit i naciśnij enter aby wyjść z kontenera. W tym kroku dowiedziałeś się, jak obsługiwać trwałość danych przy użyciu niezależnych wolumenów Docker oraz jak podłączać wolumeny do kontenerów.

Krok 2: Tworzenie wolumenu Docker, który zachowuje dane po usunięciu kontenera

W tym kroku użyjemy jednego polecenia, aby utworzyć wolumen w tym samym czasie, w którym tworzymy kontener. Następnie usuniemy kontener i podłączymy wolumen do nowego kontenera. Polecenie jest podobne do tego użytego w Kroku 1, jednak dodajemy jedną flagę --name, aby określić nazwę dla kontenera:

Będąc wewnątrz kontenera, wprowadź następujące polecenie, aby zapisać dane w wolumenie i zweryfikować, czy dane tam są:

Poniżej znajduje się wynik tych trzech poleceń:

Persistent Docker Volume

Następnie wyjdź z kontenera. Po ponownym uruchomieniu kontenera za pomocą następującego polecenia, wolumen zostanie podłączony automatycznie:

Wewnątrz kontenera zweryfikuj, czy wolumen jest zamontowany, sprawdzając istnienie pliku StepTwo.txt za pomocą polecenia:

Oto wynik:

Docker Volume After Restart

Możesz teraz wyjść z kontenera. Docker uniemożliwia usunięcie wolumenu, do którego odwołuje się inny kontener. Możesz spróbować usunąć wolumen za pomocą polecenia:

W wyniku powinieneś zobaczyć komunikat o błędzie:

Error Response

Usuńmy kontener, używając identyfikatora kontenera pokazanego w wyniku, za pomocą polecenia docker rm :

Zastąp wyróżniony identyfikator kontenera identyfikatorem id swojego kontenera wyświetlonym w terminalu. Polecenie usuwa kontener, ale nie usuwa utworzonego wolumenu. Możesz wyświetlić listę dostępnych wolumenów za pomocą polecenia docker volume ls aby zweryfikować:

Oto wynik:

Docker Volume List

Aby usunąć kontener utworzony w Kroku 2, wprowadź następujące polecenie:

W tym kroku udało Ci się utworzyć wolumen Docker w tym samym czasie, co kontener. Zobaczmy, jak możemy utworzyć wolumen z istniejącego katalogu z danymi.

Krok 3: Tworzenie wolumenu Docker z istniejącego katalogu z danymi

Jeśli chcesz skopiować dane do wolumenu, możesz utworzyć wolumen podczas tworzenia kontenera i podać ścieżkę do katalogu zawierającego dane w obrazie bazowym. W poniższym poleceniu tworzymy kontener i dodajemy wolumen danych w /var, który jest katalogiem zawierającym dane w obrazie bazowym:

Po uruchomieniu polecenia zawartość katalogu /var obrazu bazowego zostanie skopiowana do wolumenu. Wolumen można podłączyć do nowego kontenera. Następnie wyjdź z kontenera:

Create Docker Volume

Wprowadź następujące polecenie, aby utworzyć kontener, podłączyć wolumen i wyświetlić zawartość wolumenu za pomocą polecenia ls :

Powinieneś zobaczyć podobny wynik polecenia, który jest kopią zawartości katalogu /var z obrazu bazowego, teraz dostępnego w Step3DataVolume:

Copy Docker Volume

Podczas montowania /var katalogu, tak jak zrobiliśmy to w tym przykładzie, może być niepraktyczne, pomaga nam to zrozumieć, że można zamontować dowolny katalog utworzony w niestandardowych obrazach do wolumenu Docker, aby udostępnić dane innym kontenerom.

Krok 4: Udostępnianie danych między wieloma kontenerami Docker

W większości przypadków będziesz chciał, aby wiele kontenerów miało dostęp do danych z jednego wolumenu Docker. W poprzednich przykładach podłączaliśmy wolumen tylko do jednego kontenera. Teraz dowiesz się, jak podłączyć wolumen do wielu kontenerów. Chociaż można to łatwo osiągnąć, Docker nie obsługuje blokowania plików. W przypadku wielu kontenerów zapisujących do tego samego wolumenu, musisz indywidualnie zaprojektować aplikacje uruchomione w tych kontenerach, aby obsługiwały zapis do współdzielonych magazynów danych w celu uniknięcia uszkodzenia danych.

  • Utwórz Step4Container1 i Step4DataVolume

Użyj polecenia docker run z flagą --name, aby utworzyć nazwany kontener:

Wewnątrz kontenera uruchom następujące polecenie, aby utworzyć plik tekstowy i dodać tekst:

Następnie wyjdź z kontenera i wróć do środowiska hosta. Teraz chcemy utworzyć kolejny kontener i zamontować w nim wolumeny z Step4Container1 do niego.

  • Utwórz Step4Container2 i podłącz wolumeny z kontenera Step4Container1

Wykonaj następujące polecenie, aby utworzyć Step4Container2 i zamontować wolumeny z Step4Container1:

Wewnątrz kontenera użyj polecenia cat, aby zweryfikować trwałość danych:

Powinieneś zobaczyć następujący wynik:

Container Data Sharing

Możemy dopisać więcej tekstu do pliku z poziomu Step4Container2 wprowadzając następujące polecenie:

Po tym wyjdź z kontenera, a my wrócimy do Step4Container1, aby sprawdzić, czy dane nadal tam są.

  • Weryfikacja zmian wprowadzonych w wolumenie Docker między różnymi kontenerami

Aby wyświetlić zmiany, najpierw zrestartujesz Step4Container1 za pomocą polecenia:

Sprawdź zmiany za pomocą polecenia:

Powinieneś zobaczyć wynik podobny do poniższego zrzutu ekranu:

Copied Container Data

Po zweryfikowaniu, że oba kontenery mogą odczytywać i zapisywać dane w tym samym wolumenie, możesz teraz wyjść z kontenera. Jak wspomniano, Docker nie obsługuje blokowania plików, to zadanie logiki aplikacji działającej wewnątrz kontenerów powinno obsługiwać dostęp do odczytu i zapisu do współdzielonych magazynów danych. Docker umożliwia montowanie wolumenów jako tylko do odczytu, aby zapobiec przypadkowemu uszkodzeniu danych przez kontenery, które wymagają jedynie dostępu do odczytu, poprzez dodanie :ro jak pokazano w następnym przykładzie.

  • Montowanie wolumenu do kontenera Docker jako tylko do odczytu

W tym przykładzie utworzymy kontener o nazwie Step4Container3. W poleceniu tworzenia montujemy wolumeny z Step4Container1 i dodajemy :ro, aby określić, że ten kontener ma dostęp tylko do odczytu, ale nie może zapisywać w wolumenie. Wykonaj następujące polecenie w terminalu:

Po wejściu do kontenera możesz odczytać plik tekstowy w wolumenie, wprowadzając następujące polecenie:

Read Only Mount

Jeśli jednak spróbujesz usunąć plik za pomocą polecenia:

W terminalu otrzymasz komunikat o błędzie, taki jak:

Read Only Error

Po zweryfikowaniu uprawnień do odczytu i zapisu możesz opuścić kontener. Jeśli chcesz usunąć kontenery i wolumen utworzone w tym samouczku, uruchom następujące polecenia:

W tym kroku dowiedziałeś się, jak udostępniać dane między wieloma kontenerami za pomocą wolumenów Docker, a także jak montować wolumeny danych w kontenerach w trybie tylko do odczytu.

Podsumowanie

W tym samouczku utworzyłeś wolumeny Docker i dowiedziałeś się, jak udostępniać dane między kontenerami Docker. Omawiając udostępnianie danych między kontenerami, zauważyliśmy, że indywidualna logika aplikacji wewnątrz kontenera musi obsługiwać blokowanie plików, aby zapobiec uszkodzeniu danych podczas zapisu do współdzielonych magazynów danych, ponieważ Docker nie posiada implementacji do obsługi blokowania plików.

Więcej zasobów dotyczących korzystania z Dockera można znaleźć w innych samouczkach na naszym blogu:

Udanego korzystania!

author

Pranay Kapgate

Autor · CloudSigma

Preslav Dobrev jest projektantem kreatywnym w CloudSigma, skupiającym się na spójnej tożsamości biznesowej przy wykorzystaniu tradycyjnych i innowacyjnych kanałów marketingowych. Biegle łączy wizję artystyczną ze strategicznym marketingiem, tworząc wywierające wpływ narracje marki.

Komentarze

Brak komentarzy. Bądź pierwszy.