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
- Skonfiguruj serwer z systemem Ubuntu 20.04 oraz Utwórz użytkownika niebędącego administratorem (non-root) z uprawnieniami sudo. Zaloguj się jako ten użytkownik, aby przejść do kolejnych kroków.
- Zainstaluj Dockera – posiadamy samouczek na temat Jak zainstalować i obsługiwać Dockera na Ubuntu, musisz wykonać kroki 1, 2, 3 i 4. Powinno to zadziałać na dowolnej dystrybucji Ubuntu.
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 :
|
1 |
docker volume create --name Step1DataVolume |
Powinieneś zobaczyć następujący wynik wskazujący, że tworzenie wolumenu zakończyło się sukcesem:
![]()
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:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
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:
|
1 |
echo "Step One Sample Text" > /Step1DataVolume/StepOne.txt |
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:
|
1 |
docker volume inspect Step1DataVolume |
Powinieneś zobaczyć następujący wynik:

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:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
Wewnątrz kontenera uruchom następujące polecenie, aby zweryfikować, czy StepOne.txt plik istnieje:
|
1 |
cat /Step1DataVolume/StepOne.txt |
Powinieneś zobaczyć podobny wynik:

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:
|
1 |
docker run -ti --name=Step2Container1 -v Step2DataVolume:/Step2DataVolume ubuntu |
Będąc wewnątrz kontenera, wprowadź następujące polecenie, aby zapisać dane w wolumenie i zweryfikować, czy dane tam są:
|
1 2 3 |
echo "Step Two Sample Text" > /Step2DataVolume/StepTwo.txt cat /Step2DataVolume/StepTwo.txt |
Poniżej znajduje się wynik tych trzech poleceń:

Następnie wyjdź z kontenera. Po ponownym uruchomieniu kontenera za pomocą następującego polecenia, wolumen zostanie podłączony automatycznie:
|
1 |
docker start -ai Step2Container1 |
Wewnątrz kontenera zweryfikuj, czy wolumen jest zamontowany, sprawdzając istnienie pliku StepTwo.txt za pomocą polecenia:
|
1 |
cat /Step2DataVolume/StepTwo.txt |
Oto wynik:

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:
|
1 |
docker volume rm Step2DataVolume |
W wyniku powinieneś zobaczyć komunikat o błędzie:
![]()
Usuńmy kontener, używając identyfikatora kontenera pokazanego w wyniku, za pomocą polecenia docker rm :
|
1 |
docker rm e3932e65e484bbf4524ca8de1b1dd99c4e92c12f92a9d6b0567a643d0aa6bb2d |
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ć:
|
1 |
docker volume ls |
Oto wynik:

Aby usunąć kontener utworzony w Kroku 2, wprowadź następujące polecenie:
|
1 |
docker volume rm Step2DataVolume |
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:
|
1 |
docker run -ti --rm -v Step3DataVolume:/var ubuntu |
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:

Wprowadź następujące polecenie, aby utworzyć kontener, podłączyć wolumen i wyświetlić zawartość wolumenu za pomocą polecenia ls :
|
1 |
docker run --rm -v Step3DataVolume:/Step3DataVolume ubuntu ls Step3DataVolume |
Powinieneś zobaczyć podobny wynik polecenia, który jest kopią zawartości katalogu /var z obrazu bazowego, teraz dostępnego w Step3DataVolume:

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:
|
1 |
docker run -ti --name=Step4Container1 -v Step4DataVolume:/Step4DataVolume ubuntu |
Wewnątrz kontenera uruchom następujące polecenie, aby utworzyć plik tekstowy i dodać tekst:
|
1 |
echo "Step Four Sample Text" > /Step4DataVolume/StepFour.txt |
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:
|
1 |
docker run -ti --name=Step4Container2 --volumes-from Step4Container1 ubuntu |
Wewnątrz kontenera użyj polecenia cat, aby zweryfikować trwałość danych:
|
1 |
cat /Step4DataVolume/StepFour.txt |
Powinieneś zobaczyć następujący wynik:

Możemy dopisać więcej tekstu do pliku z poziomu Step4Container2 wprowadzając następujące polecenie:
|
1 |
echo "We are appending text while inside Step4Container2" >> /Step4DataVolume/StepFour.txt |
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:
|
1 |
docker start -ai Step4Container1 |
Sprawdź zmiany za pomocą polecenia:
|
1 |
cat /Step4DataVolume/StepFour.txt |
Powinieneś zobaczyć wynik podobny do poniższego zrzutu ekranu:

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:
|
1 |
docker run -ti --name=Step4Container3 --volumes-from Step4Container1:ro ubuntu |
Po wejściu do kontenera możesz odczytać plik tekstowy w wolumenie, wprowadzając następujące polecenie:
|
1 |
cat /Step4DataVolume/StepFour.txt |

Jeśli jednak spróbujesz usunąć plik za pomocą polecenia:
|
1 |
rm /Step4DataVolume/StepFour.txt |
W terminalu otrzymasz komunikat o błędzie, taki jak:
![]()
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:
|
1 2 3 |
docker rm Step4Container1 Step4Container2 Step4Container3 docker volume rm Step4DataVolume |
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:
- Jak udostępniać dane między kontenerem Docker a hostem
- Czyszczenie zasobów Dockera – obrazy, kontenery i wolumeny
- Wdrażanie Laravel, Nginx i MySQL za pomocą Docker Compose
- Instalacja i konfiguracja Dockera na CentOS 7
Udanego korzystania!
Komentarze
Brak komentarzy. Bądź pierwszy.