Woluminy Dockera a mocowania powiązań: Utrwalaj dane kontenera we właściwy sposób
Usuń kontener, a jego dane zostaną z nim usunięte, chyba że przechowujesz go w bezpieczniejszym miejscu. Dowiedz się, jaka jest różnica między woluminami, mocowaniami powiązań i plikami tmpfs, kiedy używać każdego z nich i jak tworzyć kopie zapasowe tego, co ważne.
- Zapisywalna warstwa kontenera jest usuwana wraz z kontenerem, więc ważne dane wymagają zamontowania.
- Woluminy nazwane są zarządzane przez Docker i są zwykle wybierane w przypadku baz danych i danych produkcyjnych.
- Mocowania powiązań mapują folder hosta, co czyni je idealnymi do stosowania w przypadku kodu na żywo podczas programowania.
docker compose down -vusuwa woluminy, więc używaj go ostrożnie i przechowuj przetestowane kopie zapasowe.
Uruchamiasz bazę danych w kontenerze, dodajesz trochę danych, usuwasz kontener i uruchamiasz nowy. Dane zniknęły. Prawie każdy uczy się tej lekcji na własnej skórze. Woluminy Dockera i mocowania powiązań służą do utrzymywania danych poza czasem życia dowolnego kontenera.
W tym przewodniku wyjaśniono, jak działa każdy z nich i jak wybrać. Polecenia i pliki tutaj są standardowymi przykładami, opartymi na udokumentowanym zachowaniu Dockera i nie uruchomiliśmy ich na potrzeby tego artykułu, więc wypróbuj je najpierw na jednorazowych danych. Szczegóły mogą się różnić w zależności od wersji platformy Docker i wersji platformy Docker Desktop. Jeśli dopiero zaczynasz przygodę z kontenerami, zacznij od naszego samouczka Dockera dla początkujących.
Dlaczego dane kontenera znikają
Obraz platformy Docker składa się z warstw tylko do odczytu. Po uruchomieniu kontenera Docker dodaje na wierzch cienką zapisywalną warstwę, na której umieszczane są wszelkie zmiany. Warstwa ta przetrwa zatrzymanie i ponowne uruchomienie, ale zostanie usunięta po usunięciu kontenera.
docker run -d --name db -e POSTGRES_PASSWORD=devonly postgres:17
# ... create tables and add data ...
docker rm -f db
docker run -d --name db -e POSTGRES_PASSWORD=devonly postgres:17
# The data you added is not there
Jest to zgodne z projektem, ponieważ umożliwia swobodną wymianę pojemników. Oznacza to, że wszystko, co musisz zatrzymać, musi znajdować się poza kontenerem. Można to zrobić na trzy sposoby:
| Wpisz | Przechowywane w | Przeżyje usunięcie kontenera? |
|---|---|---|
| Nazwany wolumin | Obszar zarządzany przez Dockera | Tak |
| Mocowanie wiążące | Wybrana przez Ciebie ścieżka hosta | Tak |
| uchwyt tmpfs | Pamięć hosta | Nie |
Woluminy Dockera i mocowania bindów obok siebie
| Aspekt | Nazwany wolumin | Mocowanie wiążące |
|---|---|---|
| Zarządzane przez | Doker | Ty |
| Lokalizacja | Obszar przechowywania Dockera | Dowolna ścieżka na hoście |
| Zależy od folderów hosta? | Nie | Tak |
| Edycja od gospodarza | Niezręczne z założenia | To proste, zmiany pojawiają się natychmiast |
| Pusty cel wstępnie wypełniony z obrazu? | Tak | Nie, ścieżka hosta to ukrywa |
| Polecenia interfejsu CLI platformy Docker | Tak, docker volume |
Nie |
| Sterowniki do zdalnego magazynu | Tak | Nie |
| Najlepsze dla | Bazy danych, dane produkcyjne | Kod źródłowy w opracowaniu |
Nazwane tomy
Wolumin to pamięć utworzona i zarządzana przez Docker. Mówisz o nim po imieniu i nie musisz przejmować się tym, gdzie fizycznie żyje.
docker volume create pgdata
docker run -d --name db \
-e POSTGRES_PASSWORD=devonly \
-v pgdata:/var/lib/postgresql/data \
postgres:17
Teraz pliki bazy danych znajdują się w pgdata. Usuń kontener i rozpocznij nowy z tym samym wolumenem, a Twoje dane nadal tam będą. W systemie Linux woluminy zwykle znajdują się w obszarze /var/lib/docker/volumes/, ale nie należy bezpośrednio edytować tych plików. Na Docker Desktop znajdują się one wewnątrz maszyny wirtualnej, a nie w normalnym folderze.
Ścieżka wewnątrz kontenera zależy od obrazu, więc sprawdź dokumentację obrazu. Montowanie do niewłaściwej ścieżki to klasyczny błąd: wszystko wydaje się działać, ale dane nadal są zapisywane w warstwie kontenera. Nowsze główne wersje obrazu również mogą zmienić tę ścieżkę, dlatego przed aktualizacją przeczytaj uwagi do wydania.
Docker automatycznie utworzy nazwany wolumin, jeśli nie istnieje. Wolumin anonimowy utworzony bez nazwy również działa, ale otrzymuje długi, losowy identyfikator i łatwo go stracić. Zawsze podawaj nazwy woluminów.
Wiązanie wierzchowców
Montaż powiązania odwzorowuje określoną ścieżkę hosta bezpośrednio do kontenera. Obie strony natychmiast widzą te same pliki. Dzięki temu idealnie nadaje się do programowania, ponieważ zmiany w edytorze odnoszą skutek w działającym kontenerze bez przebudowy:
docker run -d --name web \
-p 8080:80 \
-v "$(pwd)/site:/usr/share/nginx/html:ro" \
nginx:1.27
Edytuj plik w site/, odśwież przeglądarkę, a zobaczysz zmianę. :ro sprawia, że uchwyt wewnątrz kontenera jest tylko do odczytu, co jest dobrym nawykiem, gdy kontener nie musi tam pisać.
Mocowania wiążące wiążą się z pewnymi kompromisami:
- Łączą cię z hostem. Ścieżka musi istnieć na każdym komputerze, więc konfiguracje są mniej przenośne.
- Ukrywają zawartość obrazu. Jeśli zamontujesz nad
/app, cokolwiek znajdowało się na obrazie, stanie się ono niewidoczne. Typowym przykładem jest zaginięcienode_modules. - Odsłaniają hosta. Kontener z zapisywalnym uchwytem może zmieniać lub usuwać pliki prawdziwego hosta. Nigdy nie montuj wrażliwych ścieżek, takich jak
/lub gniazdo Docker, chyba że w pełni rozumiesz ryzyko. - Wydajność może się różnić. Na platformie Docker Desktop dla systemów macOS i Windows udostępnianie plików przekracza granice wirtualizacji i może przebiegać wolniej niż w systemie Linux.
montuje się tmpfs
Montaż tmpfs żyje w pamięci hosta i nigdy nie jest zapisywany w warstwie kontenera. Znika, gdy kontener się zatrzyma, więc pasuje do plików tymczasowych, pamięci podręcznych i krótkotrwałych wrażliwych danych:
docker run -d --tmpfs /app/cache:size=64m myapp:1.0
tmpfs jest dostępny na hostach z systemem Linux. Może także przyspieszyć działanie baz danych w jednorazowych środowiskach testowych, w których nie zależy Ci na przechowywaniu danych.
-v lub –mount?
Obie flagi działają. --mount jest dłuższy, ale jest bardziej wyraźny i wiele osób woli go w skryptach:
# Short form
docker run -v pgdata:/var/lib/postgresql/data postgres:17
# Explicit form
docker run --mount type=volume,source=pgdata,target=/var/lib/postgresql/data postgres:17
# Bind mount, read-only
docker run --mount type=bind,source="$(pwd)"/site,target=/usr/share/nginx/html,readonly nginx:1.27
Jest jedna znacząca różnica. W przypadku opcji -v tworzona jest brakująca ścieżka hosta w postaci pustego folderu, co może ukryć literówkę. W przypadku --mount i typu powiązania Docker zamiast tego zgłasza błąd. Ponadto w przypadku -v lewa strona decyduje o typie: nazwa oznacza wolumin, a ścieżka oznacza podłączenie powiązania. Zatem -v data:/x i -v ./data:/x robią bardzo różne rzeczy.
Woluminy w Docker Compose
Większość prawdziwych projektów deklaruje przechowywanie w pliku Compose. Ten używa obu rodzajów, każdy do swojego właściwego zadania:
services:
web:
build: .
ports:
- "3000:3000"
volumes:
- ./src:/app/src # bind mount: live code
depends_on:
- db
db:
image: postgres:17
environment:
POSTGRES_PASSWORD: devonly
volumes:
- pgdata:/var/lib/postgresql/data # named volume: data
volumes:
pgdata:
Nazwane woluminy należy zadeklarować w sekcji najwyższego poziomu volumes. Funkcja Compose poprzedza rzeczywistą nazwę nazwą projektu. Pełny opis znajdziesz w naszym samouczku Docker Compose.
Wskazówka: docker compose down zachowuje nazwane woluminy, ale docker compose down -v usuwa je wraz z danymi. Zachowaj szczególną ostrożność w przypadku skryptów i historii powłoki, które obejmują -v.
Przydatne polecenia dotyczące głośności
| Polecenie | Co to robi |
|---|---|
wolumin okna dokowanego ls |
Zawiera listę tomów |
nazwa utworzenia woluminu dokowanego |
Tworzy wolumin |
nazwa kontroli woluminu dokowanego |
Pokazuje szczegóły, w tym lokalizację |
nazwa rm woluminu dokowanego |
Usuwa wolumin i jego dane |
przycinanie wolumenu okna dokowanego |
Usuwa nieużywane woluminy |
system dokowany df -v |
Pokazuje wykorzystanie dysku, łącznie z woluminami |
Sprawdź, co prune usunie, zanim to potwierdzisz, ponieważ nie można tego cofnąć. Woluminy, których obecnie nie używa żaden kontener, mogą nadal zawierać ważne dane.
Utwórz kopię zapasową i przywróć wolumen
Kopię zapasową woluminu można utworzyć, uruchamiając krótkotrwały kontener, w którym montuje się zarówno wolumin, jak i folder hosta:
# Back up
docker run --rm \
-v pgdata:/data:ro \
-v "$(pwd)":/backup \
alpine tar czf /backup/pgdata.tar.gz -C /data .
# Restore into a new volume
docker volume create pgdata_restored
docker run --rm \
-v pgdata_restored:/data \
-v "$(pwd)":/backup \
alpine tar xzf /backup/pgdata.tar.gz -C /data
W przypadku aktywnej bazy danych kopiowanie takich plików może spowodować przechwycenie niespójnego stanu. Najpierw zatrzymaj kontener lub, lepiej, użyj własnego narzędzia bazy danych, takiego jak pg_dump dla PostgreSQL. A kopia zapasowa, której nigdy nie przywróciłeś, jest tak naprawdę tylko nadzieją, więc przetestuj przywracanie.
Uprawnienia do plików
„Odmowa uprawnień” to najczęstszy problem z wierzchowcami. Pliki zachowują swoje numeryczne identyfikatory użytkowników i grup w systemie Linux, więc jeśli kontener działa jako użytkownik 1000, a folder hosta należy do innego użytkownika, zapisy nie powiodą się. Kilka sposobów, aby to naprawić:
- Uruchom kontener z pasującym użytkownikiem:
docker run --user "$(id -u):$(id -g)" ... - Skonfiguruj prawidłową własność obrazu, zgodnie z naszymi najlepszymi praktykami dotyczącymi pliku Dockerfile.
- Preferuj nazwane woluminy dla danych, ponieważ nowy wolumin przejmuje na własność folder obrazu, gdy jest używany po raz pierwszy.
- W systemach korzystających z SELinux montowanie powiązań może wymagać etykiety
:zlub:Z.
Unikaj pokusy chmod 777, jak wyjaśnia nasz przewodnik po poleceniach systemu Linux.
Którego powinieneś użyć?
| Sytuacja | Użyj |
|---|---|
| Dane bazy danych | Nazwany wolumin |
| Kod źródłowy do edycji na żywo | Mocowanie wiążące |
| Plik konfiguracyjny z Twojego repozytorium | Mocowanie wiązania tylko do odczytu |
| Udostępnianie danych pomiędzy kontenerami | Nazwany wolumin |
| Tymczasowa pamięć podręczna lub pliki tymczasowe | tmpfs |
| Jednorazowa testowa baza danych | tmpfs lub brak montowania |
| Kod aplikacji w produkcji | Wbuduj to w obraz |
Ten ostatni rząd ma znaczenie. W środowisku produkcyjnym kod należy do obrazu, więc to, co przetestowałeś, jest tym, co uruchamiasz. W klastrach przechowywanie danych znów działa inaczej, poprzez trwałe woluminy, które są omówione w szerszej dokumentacji Kubernetes. W naszym przewodniku Docker kontra Kubernetes wyjaśniono, jakie są między nimi powiązania.
Typowe błędy
- Montaż do złej ścieżki. Dane nadal znajdują się w warstwie kontenera i później znikają.
- Uruchamianie
down -vokazjonalnie. Spowoduje to usunięcie nazwanych woluminów. - Używanie ścieżek względnych z
-v. Formularze takie jak-v data:/xtworzą wolumin, a nie mapowanie folderu. - Umieszczanie sekretów w zapisywalnych uchwytach. Montuj je w trybie tylko do odczytu lub użyj funkcji sekretów.
- Wskazywanie dwóch kontenerów baz danych na jednym woluminie. Może to spowodować uszkodzenie danych.
- Brak kopii zapasowych. Wolumin nie jest kopią zapasową. Żyje na tym samym dysku.
Podsumowanie
Praktyczna zasada jest krótka: nazwane woluminy dla danych, montowanie powiązań dla edytowanego kodu i tmpfs dla rzeczy, które nie powinny trwać. Wypróbuj na jednorazowej bazie danych. Utwórz nazwany wolumin, dodaj wiersz, usuń kontener, rozpocznij nowy i potwierdź, że wiersz przetrwał. Następnie przećwicz tworzenie kopii zapasowych i przywracanie, zanim będą potrzebne.
Najczęstsze pytania
Jaka jest różnica między woluminem Docker a mocowaniem powiązania?
Wolumin jest zarządzany przez Docker i przechowywany w jego własnym obszarze. Montaż powiązania odwzorowuje określoną ścieżkę hosta, którą kontrolujesz, bezpośrednio do kontenera.
Czy zatrzymanie kontenera powoduje usunięcie jego danych?
Nie. Dane w warstwie zapisywalnej przetrwają zatrzymanie i ponowne uruchomienie. Zostanie utracony po usunięciu pojemnika, chyba że jest przechowywany w wolumenie lub powiązaniu.
Czy woluminy Dockera pozostają po utworzeniu okna Docker?
Tak, nazwane woluminy pozostają po utworzeniu okna dokowanego. Dodanie flagi -v usuwa je wraz ze wszystkimi zawartymi w nich danymi.
Gdzie są przechowywane woluminy Dockera?
W systemie Linux zwykle w katalogu /var/lib/docker/volumes. Na Docker Desktop żyją wewnątrz maszyny wirtualnej. Użyj kontroli woluminu okna dokowanego, aby zobaczyć lokalizację.
Czy wiele kontenerów może współdzielić wolumin?
Tak, kilka kontenerów może zamontować jeden wolumin. Aplikacja musi bezpiecznie obsługiwać współbieżny dostęp, a bazy danych generalnie nie powinny udostępniać plików danych w ten sposób.
Ucz się dalej
Potrzebujesz pomocy przy testowaniu, WordPressie lub SEO?
Pomagamy zespołom dostarczać lepsze oprogramowanie i rozwijać ich witryny. Powiedz nam, nad czym pracujesz, a my zaproponujemy jasny następny krok.
Więcej poradników na testowanie, sztuczna inteligencja i nowoczesny rozwój
Podobał Ci się ten artykuł? Wybierz temat i przejdź bezpośrednio do naszych najnowszych tutoriali.
Wyjaśnienie halucynacji AI: dlaczego modele językowe tworzą rzeczy i jak je zmniejszyć
Wyjaśniono halucynacje AI: czym są, dlaczego powstają w modelach językowych, typowe typy, jak je zredukować za pomocą uziemień i podpowiedzi oraz pr…
Przeczytaj artykuł →DevOpsWyjaśnienie zmiennych środowiskowych: pliki .env, sekrety i konfiguracja wykonana prawidłowo
Zmienne środowiskowe wyjaśnione na przykładach Pythona, które przeprowadziliśmy: ich odczytywanie i ustawianie, dlaczego każda wartość jest ciągiem …
Przeczytaj artykuł →Tworzenie oprogramowaniaWyjaśnienie ograniczenia szybkości interfejsu API: algorytmy, nagłówki i obsługa błędów 429
Ograniczanie szybkości API wyjaśnione za pomocą przeprowadzonej przez nas symulacji: zasobnik tokenów, stałe okno, przesuwane okno, 429 odpowiedzi, …
Przeczytaj artykuł →Automatyzacja testówWyśmiewanie w Pythonie: unittest.mock, patch i błędy, które sprawiają, że testy kłamią
Wyśmiewanie w Pythonie za pomocą unittest.mock, przetestowane: Mock i zwracana wartość, efekt uboczny, łatanie tam, gdzie używana jest nazwa, specyf…
Przeczytaj artykuł →Testowanie oprogramowaniaWyjaśnienie zasięgu kodu: pokrycie linii i oddziału oraz co naprawdę oznacza 100%
Wyjaśnienie pokrycia kodu za pomocą prawdziwego pliku cover.py: pokrycie linii, gałęzi i warunków, przeczytanie raportu, dlaczego 100% pokrycia może…
Przeczytaj artykuł →Bazy danych i SQLDELETE vs TRUNCATE vs DROP w SQL: różnice, wycofywanie i kiedy używać każdego z nich
DELETE vs TRUNCATE vs DROP wyjaśnione za pomocą przetestowanego SQL: co każdy usuwa, wycofywanie, wyzwalacze, resetowanie tożsamości, prędkość i czy…
Przeczytaj artykuł →Bazy danych i SQLWyjaśnienie widoków SQL: tworzenie, używanie i unikanie pułapek wraz z przykładami
Widoki SQL wyjaśnione za pomocą zapytań, które uruchomiliśmy: tworzenie widoku, wyniki na żywo, ukrywanie kolumn, wydajność, widoki z możliwością ak…
Przeczytaj artykuł →Tworzenie oprogramowaniaInterfejs TypeScript a typ: rzeczywiste różnice, testowane za pomocą kompilatora
Interfejs TypeScript a typ, sprawdzony z prawdziwym kompilatorem: co oba mogą zrobić, co tylko jeden, łączenie deklaracji, rozszerzenia a przecięcia…
Przeczytaj artykuł →Tworzenie oprogramowaniaPython *args i **kwargs wyjaśnione: elastyczne funkcje z przejrzystymi przykładami
Python *args i **kwargs wyjaśnione za pomocą uruchomionego przez nas kodu: pakowanie i rozpakowywanie, kolejność parametrów, argumenty zawierające t…
Przeczytaj artykuł →Tworzenie oprogramowaniaFunkcje Lambda w Pythonie: składnia, rzeczywiste zastosowania i kiedy ich nie używać
Funkcje lambda w Pythonie wyjaśnione za pomocą uruchomionego przez nas kodu: składnia, sortowanie za pomocą klucza, mapa i filtr, domknięcia, pułapk…
Przeczytaj artykuł →Sztuczna inteligencjaKim są agenci AI? Jak one działają, dzięki prostej pętli agenta, którą możesz uruchomić
Kim są agenci AI? Prosty przewodnik po pętli agenta, narzędziach, pamięci i poręczach, z małą pętlą w Pythonie, którą uruchomiliśmy, prawdziwymi zag…
Przeczytaj artykuł →DevOpsMonitorowanie a obserwowalność: prawdziwa różnica z logami, wskaźnikami i śladami
Wyjaśnienie monitorowania a obserwowalności: znane i nieznane awarie, dzienniki, metryki i ślady, opis incydentu przy kasie, złote sygnały, OpenTele…
Przeczytaj artykuł →DevOpsWoluminy platformy Docker a mocowania powiązań: utrwalanie danych kontenera we właściwy sposób
Wyjaśniono woluminy Dockera a montowanie powiązań: dlaczego dane kontenera znikają, nazwane woluminy, montowanie powiązań, tmpfs, przykłady tworzeni…
Przeczytaj artykuł →Automatyzacja testówTDD vs BDD: kluczowe różnice, jedna funkcja zbudowana w obie strony i kiedy używać każdej z nich
TDD vs BDD wyjaśnione za pomocą jednej funkcji rabatowej zbudowanej w obie strony: refaktoryzacja czerwono-zielona z uruchomionym przez nas kodem, s…
Przeczytaj artykuł →Tworzenie oprogramowaniaGit merge vs rebase: różnice, przykłady i kiedy czego używać
Git merge vs rebase wyjaśnione na prawdziwym wyniku logu, z tabelą porównawczą, złotą zasadą rebase i bezpiecznym procesem pracy zespołu.
Przeczytaj artykuł →Tworzenie oprogramowaniaPython list comprehension: składnia, przykłady i kiedy jej unikać
Python list comprehension wyjaśnione: składnia, filtrowanie, if-else, zagnieżdżone pętle, zmierzone czasy i sytuacje, w których zwykła pętla for jes…
Przeczytaj artykuł →Bazy danych i SQLSQL JOIN – wyjaśnienie z przykładami (Inner, Left, Right, Full)
Zrozum złączenia SQL krok po kroku na przykładowych tabelach i zapytaniach: INNER, LEFT, RIGHT, FULL, CROSS i SELF, plus typowe błędy i wskazówki wy…
Przeczytaj artykuł →