8.1 Wprowadzenie do wirtualnych dysków
Montowanie wolumenów (Volumes) — to jedna z najbardziej przydatnych funkcji Docker'a. Dzięki niej kontenery mogą łatwo pracować z danymi z maszyny hosta. Ta funkcja sprawia, że zarządzanie danymi jest elastyczne i wygodne: możesz przechowywać dane na długo, wymieniać się nimi między kontenerami i bez problemu robić kopie zapasowe lub przywracać dane, jeśli coś pójdzie nie tak.
Wolumeny (Volumes) w Docker — to sposób przechowywania danych tak, aby były niezależne od kontenerów. Nawet jeśli kontener zostanie usunięty, informacje zapisane w wolumenach pozostaną bezpieczne. Wolumeny można podłączać (montować) do kontenerów, co pozwala przechowywać dane osobno i używać ich wielokrotnie, niezależnie od tego, ile razy tworzysz lub usuwasz kontenery.
Główne rodzaje wolumenów
- Anonimowe wolumeny (Anonymous Volumes)
- Są automatycznie tworzone przez Docker, jeśli kontener nie ma jawnie wskazanego wolumenu.
- Używane do tymczasowego przechowywania danych.
- Nazwane wolumeny (Named Volumes)
- Są tworzone i zarządzane przez Docker.
- Mogą być podłączane do wielu kontenerów i pozostają zachowane nawet po ich usunięciu lub zatrzymaniu.
- Wolumeny z przypięciem (Bind Mounts)
- Łączą katalog na maszynie hosta z katalogiem w kontenerze.
- Są idealne do uzyskiwania dostępu do danych systemu hosta i wygodne podczas tworzenia aplikacji.
Podstawowa składnia polecenia docker run
do montowania wolumenów
-v <host_path>:<container_path>
Pełna składnia:
docker run -v <host_path>:<container_path> [OPTIONS] IMAGE [COMMAND] [ARG...]
Główne opcje do montowania wolumenów
1. Opcja -v
lub --volume
Używana do tworzenia nazwanego wolumenu lub wolumenu z przypięciem.
Przykład:
docker run -d -v /host/data:/container/data nginx
2. Opcja --mount
Zapewnia bardziej elastyczny i szczegółowy sposób montowania wolumenów, wspierając dodatkowe parametry.
Przykład:
docker run -d --mount type=bind,source=/host/data,target=/container/data nginx
8.2 Tworzenie i używanie wolumenów
1. Nazwane wolumeny
Nazwane wolumeny są tworzone i zarządzane przez Docker. Służą do trwałego przechowywania danych, które powinny być zachowane pomiędzy restartami lub usuwaniem kontenerów.
Tworzenie nazwanego wolumenu:
docker volume create my_volume
Uruchamianie kontenera z zamontowaniem wolumenu:
W tym przykładzie wolumen my_volume
jest montowany do katalogu /data
wewnątrz kontenera my_container
. Wszystkie dane zapisane w /data
zostaną zachowane w wolumenie i będą dostępne nawet po usunięciu kontenera.
docker run -d -v my_volume:/data --name my_container nginx
2. Anonimowe wolumeny
Anonimowe wolumeny są automatycznie tworzone przez Docker i są powiązane z konkretnym kontenerem. Są przydatne dla tymczasowych danych, które nie muszą być przechowywane po usunięciu kontenera.
Uruchamianie kontenera z anonimowym wolumenem:
W tym przykładzie Docker automatycznie stworzy anonimowy wolumen i zamontuje go do katalogu /data
wewnątrz kontenera.
docker run -d -v /data --name my_container nginx
3. Powiązane katalogi
Powiązane katalogi pozwalają na montowanie katalogów systemu hosta do kontenerów. Jest to wygodne dla współdzielenia danych pomiędzy kontenerami a systemem hosta. Taki sposób często stosowany jest podczas programowania, gdy kod źródłowy znajduje się w systemie hosta.
Uruchamianie kontenera z powiązanym katalogiem:
W tym przykładzie katalog /host/data
na maszynie hosta jest montowany do katalogu /container/data
wewnątrz kontenera my_container
.
docker run -d -v /host/data:/container/data --name my_container nginx
8.3 Przykłady użycia wolumenów
1. Zapisywanie danych bazy danych
Użycie wolumenów dla baz danych pomaga zachować dane nawet przy restartach i aktualizacjach kontenera. To szczególnie ważne dla niezawodnego działania w środowiskach produkcyjnych.
Przykład:
W tym przykładzie dane PostgreSQL są zapisywane w wolumenie db_data
, co gwarantuje ich zachowanie przy restarcie lub usunięciu kontenera.
docker volume create db_data
docker run -d -v db_data:/var/lib/postgresql/data --name postgres_container postgres
2. Współdzielenie danych między kontenerami
Czasami trzeba dzielić dane między kilkoma kontenerami. Wolumeny pozwalają łatwo to zrobić.
Przykład
Utworzymy wolumen i uruchomimy dwa kontenery, które będą używać tego wolumenu. Oba kontenery uzyskają dostęp do danych w wolumenie shared_data
, co umożliwia im wymianę informacji.
docker volume create shared_data
docker run -d -v shared_data:/data --name container1 nginx
docker run -d -v shared_data:/data --name container2 nginx
3. Rozwój i testowanie
Przy tworzeniu aplikacji wygodnie jest używać podłączonych katalogów do współdzielenia kodu źródłowego między kontenerem a maszyną hosta. To pozwala programistom edytować kod na hoście, a kontenerowi — od razu pracować z aktualizacjami.
Przykład
W tym przykładzie katalog /path/to/source
na maszynie hosta jest montowany w katalogu /app
wewnątrz kontenera dev_container
. Dzięki temu kontener może używać aktualnego kodu źródłowego bezpośrednio z systemu hosta.
docker run -d -v /path/to/source:/app --name dev_container node
8.4 Zarządzanie wolumenami
Docker oferuje wygodne komendy do zarządzania wolumenami, dzięki którym można łatwo tworzyć, usuwać i sprawdzać informacje o wolumenach.
1. Wyświetlenie wszystkich wolumenów
Ta komenda wyświetla listę wszystkich dostępnych wolumenów na maszynie hosta.
docker volume ls
2. Wyświetlenie informacji o wolumenie
Za pomocą tej komendy można uzyskać szczegółowe dane o wolumenie my_volume
: jego lokalizacji w systemie plików hosta oraz informacji o kontenerach, które używają tego wolumenu.
docker volume inspect my_volume
3. Usuwanie wolumenu
Ta komenda usuwa wolumen my_volume
. Przed usunięciem ważne jest, aby upewnić się, że wolumen nie jest używany przez żaden kontener, w przeciwnym razie komenda nie zostanie wykonana.
docker volume rm my_volume
8.5 Backup wolumenów
Dla bezpieczeństwa danych ważne jest posiadanie możliwości tworzenia kopii zapasowych wolumenów i ich przywracania w razie potrzeby.
1. Tworzenie backupu wolumenu
W tym przykładzie zawartość wolumenu my_volume
jest archiwizowana do pliku my_volume_backup.tar.gz
, który jest zapisywany w katalogu /backup
na maszynie hosta.
docker run --rm -v my_volume:/volume -v /backup:/backup busybox tar czf /backup/my_volume_backup.tar.gz /volume
2. Przywracanie wolumenu
Ten przykład przywraca zawartość wolumenu my_volume
z kopii zapasowej, która jest przechowywana w pliku my_volume_backup.tar.gz
.
docker run --rm -v my_volume:/volume -v /backup:/backup busybox tar xzf /backup/my_volume_backup.tar.gz -C /volume
GO TO FULL VERSION