Dlaczego kontener traci dane po restarcie
Zapisz wiersz do bazy danych działającej w kontenerze Docker, zatrzymaj kontener, uruchom go ponownie: wiersza nie ma.
Każdy kontener przy każdym starcie dostaje swój system plików na nowo z obrazu. Wszystko, co kontener sam zapisze — pliki bazy danych, przesłane pliki, logi — trafia do warstwy zapisywalnej, która jest kasowana przy usunięciu kontenera. Wolumin Docker to sposób na trzymanie tych danych poza kontenerem, tam gdzie przetrwają.
Czym jest Wolumin Docker?
Wolumin Docker to mechanizm do zapisywania danych poza kontenerem, tak aby przetrwały nawet gdy kontener zostanie zatrzymany, uruchomiony ponownie lub usunięty.
Pomyśl o woluminach jak o zewnętrznym dysku twardym, który podłączasz do kontenera. Dane są zapisywane na tym “zewnętrznym dysku” i pozostają bezpieczne niezależnie od tego, co stanie się z kontenerem.
Dlaczego Używać Woluminów?
- Trwałość: dane przeżywają cykl życia kontenera
- Współdzielenie: wiele kontenerów może mieć dostęp do tych samych danych
- Backup: łatwiej jest tworzyć kopie zapasowe danych
- Wydajność: woluminy są zoptymalizowane pod kątem operacji I/O
- Przenośność: możesz przenosić dane między różnymi hostami
Woluminy, bind mounts i tmpfs: czego użyć
Dane utrwalisz na trzy sposoby, w kolejności, po jaką powinieneś sięgać: woluminy, bind mounts, tmpfs.
1. Woluminy (Volumes) - Zalecany Wybór
Woluminy są w pełni zarządzane przez Docker i zapisywane w specjalnym katalogu na hoście (/var/lib/docker/volumes/ na Linuksie).
| |
Zalety:
- Zarządzane przez Docker (łatwe do tworzenia, usuwania, inspekcji)
- Działają na Linuksie, Windows i Mac
- Mogą być współdzielone między wieloma kontenerami
- Obsługują sterowniki do zdalnego przechowywania (chmura, NFS itp.)
2. Bind Mounts - Bezpośrednie Połączenie
Bind mounts łączą konkretny folder na twoim komputerze bezpośrednio z kontenerem.
| |
Kiedy ich używać:
- Podczas developmentu, aby widzieć zmiany w kodzie w czasie rzeczywistym
- Gdy potrzebujesz dostępu do konkretnych plików systemu hosta
- Do współdzielenia konfiguracji między hostem a kontenerem
Uwaga: bind mounts zależą od struktury systemu plików hosta, więc są mniej przenośne.
3. tmpfs Mounts - Tymczasowe Dane w Pamięci
tmpfs mounts zapisują dane w RAM hosta, nie na dysku.
| |
Kiedy ich używać:
- Dla wrażliwych danych, które nie powinny być zapisywane na dysku
- Dla tymczasowych cache’ów o wysokiej wydajności
- Dane są tracone po zatrzymaniu kontenera (i dokładnie o to chodzi)
Polecenia woluminów Docker: create, list, inspect, remove
Tworzenie Woluminu
| |
Listowanie Woluminów
| |
Inspekcja Woluminu
| |
To polecenie pokazuje, gdzie wolumin jest fizycznie zapisany i inne przydatne informacje.
Usuwanie Woluminu
| |
Uwaga: usunięcie woluminu oznacza utratę wszystkich zawartych danych. Nie ma kosza ani odzyskiwania.
Przykłady woluminów Docker: baza danych, development z przeładowaniem, współdzielenie
Przykład 1: Baza Danych MySQL z Trwałymi Danymi
Bez woluminu, za każdym razem gdy restartujesz kontener MySQL, tracisz wszystkie dane. Oto jak to rozwiązać:
| |
Teraz możesz zatrzymać, zrestartować lub nawet usunąć i odtworzyć kontener: dane bazy danych pozostaną nienaruszone w woluminie mysql-data.
Przykład 2: Development Webowy z Bind Mount
Podczas developmentu chcesz, aby zmiany w kodzie były natychmiast widoczne w kontenerze:
| |
Każda zmiana plików w folderze src będzie natychmiast dostępna w kontenerze.
Przykład 3: Współdzielenie Danych Między Kontenerami
Dwa kontenery, które muszą mieć dostęp do tych samych plików:
| |
Woluminy w Docker Compose
W Docker Compose woluminy deklarujesz raz, a każda usługa, która ich potrzebuje, odwołuje się do nich po nazwie:
| |
Za pomocą prostego docker-compose up, Docker automatycznie tworzy potrzebne woluminy.
Backup i Przywracanie Woluminów
Tworzenie Backupu Woluminu
| |
To polecenie:
- Montuje wolumin w trybie tylko do odczytu (
ro) - Tworzy skompresowane archiwum w bieżącym katalogu
Przywracanie Backupu
| |
Błędy z woluminami Docker, których warto unikać
1. Zapominanie o Używaniu Woluminów dla Baz Danych
Jeśli używasz bazy danych w Dockerze bez woluminu, stracisz wszystkie dane. Zawsze.
2. Używanie Bind Mounts na Produkcji
Bind mounts są świetne do developmentu, ale na produkcji używaj woluminów Docker dla lepszej przenośności i bezpieczeństwa.
3. Brak Backupów Woluminów
Woluminy nie są automatycznie uwzględniane w backupach systemu. Planuj regularne kopie zapasowe.
4. Gromadzenie Osieroconych Woluminów
Gdy usuwasz kontenery, woluminy pozostają. Używaj okresowo:
| |
Aby usunąć woluminy, które nie są już połączone z żadnym kontenerem.
Która opcja przechowywania do czego
| Scenariusz | Rozwiązanie |
|---|---|
| Baza danych na produkcji | Wolumin Docker |
| Lokalny development | Bind mount |
| Wrażliwe dane tymczasowe | tmpfs |
| Współdzielenie między kontenerami | Wolumin Docker |
| Pliki konfiguracyjne | Bind mount lub Wolumin |
| Logi aplikacji | Wolumin Docker |
Zasada, która wystarcza w większości przypadków
Użyj nazwanego woluminu do wszystkiego, co kontener zapisuje, a co chcesz zachować — przede wszystkim baz danych. Użyj bind mounta, gdy chcesz, żeby kontener widział folder na twojej maszynie w trakcie edycji, czyli głównie przy lokalnym developmencie. tmpfs zostaw na dane, które nie mogą trafić na dysk.
Gdy baza danych ma wolumin, możesz usuwać i odtwarzać jej kontener dowolnie często, a dane zostają na miejscu. O to właśnie chodzi.