Jak wybrać między pojemnikiem woluminu dokowanego a woluminem dokowanym?

24

Po przeczytaniu dokumentacji poczułem się trochę zdezorientowany, jak najlepiej zarządzać produktywnymi danymi aplikacji / usług.

Wydaje się, że istnieją 3 opcje:

  1. Wystarczy zmapować wolumin do katalogu hosta (tj. -vArgument za docker run)
  2. Utwórz obraz kontenera dokowanego dla danych (tj. Osobny kontener i --volumes-from)
  3. Tworzenie woluminu dokera (tj. docker volume create)

Wygląda na to, że przyjętą praktyką jest opcja nr 2, ale zastanawiam się, jaki jest cel nr 3.

Zwłaszcza, jak właściwie radzisz sobie z tymi scenariuszami docker volumei czy lepiej jest używać kontenera woluminu danych, czy to w każdej sytuacji?

  • Potrzebujesz danych aplikacji w osobnym woluminie i / lub warstwie pamięci na serwerze
  • Tworzenie kopii zapasowej
  • Przywracanie danych
dukeofgaming
źródło
@MichaelHampton Zdałem sobie sprawę, że powinienem przeformułować moje pytanie
dukeofgaming
# 1 nie jest poważną opcją dla produkcji; zasadniczo nie powinno się tego robić, jeśli istnieje alternatywa.
Michael Hampton
2
@MichaelHampton Dlaczego ?, danych nie można dokować, ale system operacyjny hosta jest nadal zarządzany przez zespół infrastruktury, który monitoruje i
tworzy
@dukeofgaming Nie wspominając o tym, że możesz btrfs scrubna nim uruchomić , aby znaleźć i naprawić uszkodzone pliki. Nie jestem pewien, jak działają rzeczy dokowane, ale myślę, że to nie chroni przed gniciem danych, więc zawsze potrzebuję pełnego przywracania, jeśli coś złego się stanie, zamiast przywracania pojedynczych plików. Inna myśl, że dodaje kolejną warstwę abstrakcji, więc jeszcze bardziej spowalnia czytanie i pisanie plików. Jakoś nie widzę zalet # 2 i # 3, ale nie mam doświadczenia z dokerem, więc to może się zmienić.
inf3rno

Odpowiedzi:

18

Myślę, że # 2 i # 3 to właściwie to samo, główna różnica polega na tym, że nie ma zatrzymanego kontenera z numerem 3 (jest to dosłownie tylko nazwany wolumin). Na przykład możesz utworzyć nazwany wolumin i zrobić podobnie, jak w przypadku # 2 -v.

Utwórz nazwany wolumin:

$ docker volume create --name test

Podłącz i zapisz niektóre dane do tego woluminu z kontenera:

$ docker run -v test:/opt/test alpine touch /opt/test/hello

Następnie możesz zamontować ten sam testwolumin w innym kontenerze i odczytać dane:

$ docker run -v test:/opt/test alpine ls -al /opt/test     
total 8
drwxr-xr-x    2 root     root          4096 Jan 23 22:28 .
drwxr-xr-x    3 root     root          4096 Jan 23 22:29 ..
-rw-r--r--    1 root     root             0 Jan 23 22:28 hello

Zaletą jest to, że wolumin nie zniknie przypadkowo, jeśli usuniesz kontener tylko danych. Teraz zarządzasz nim za pomocą docker volumepolecenia podrzędnego.

$ d volume ls
DRIVER              VOLUME NAME
local               test

Otwiera to również możliwości sterowników woluminów w dalszej części drogi, dzięki czemu możesz być w stanie udostępniać woluminy między hostami (tj. Woluminy nazwane przez NFS). Przykładami tego mogą być Flocker i Konwój . Jeśli chodzi o przenoszenie lub tworzenie kopii zapasowych danych, Convoy ma specjalne pod-komendy do tworzenia kopii zapasowych danych i pozwala na przechowywanie danych w systemie plików NFS lub EBS poza hostem.

Z tego powodu uważam, że bardziej nowatorskim sposobem (Docker 1.9+) jest użycie nazwanego woluminu zamiast kontenera zawierającego tylko dane.

Andy Shinn
źródło
Dzięki, odpowiedziałeś na większość moich pytań, ale kwestia zarządzania danymi w kontenerze w innej warstwie woluminu fizycznego wciąż pozostaje bez odpowiedzi i to jest najważniejsze ... załóżmy, że jest to rozwiązanie do zarządzania repozytorium git i potrzebuję tej części kontenera dane (które są woluminami zdefiniowanymi w pliku dokującym) w pamięci poziomu 0 znajdującej się w innym fizycznym woluminie hosta (tj. innej partycji, dysku fizycznym lub czymkolwiek
innym
I jakby nie z adnotacją kierowców głośności. W tej chwili, aby przechowywać dane poza fizycznym lokalnym sterownikiem pamięci, musisz użyć takiego, który zrobił dokładnie to, co chcesz zrobić. Z czubka mojej głowy jest github.com/rancher/convoy i github.com/ClusterHQ/flocker . Konwój obsługuje obecnie NFS i GlusterFS, co brzmi bliżej tego, czego szukasz. Zmodyfikuję odpowiedź, aby to wyjaśnić.
Andy Shinn
Korzystanie ze sterownika devicemapper wydaje się odpowiadać na moje pytanie, dzięki! docs.docker.com/engine/userguide/storagedriver/…
dukeofgaming
the volume won't accidentally disappear if you remove the data-only container. Czy mógłbyś opracować? Dzięki.
Stephane
22

Począwszy od Docker 1.9, tworzenie nazwanych woluminów za pomocą interfejsu API woluminów ( docker volume create --name mydata) jest preferowane zamiast kontenera woluminów danych. Od lutego 2016 r. Dokumentacja woluminów Docker jest bardzo nieaktualna. Ludzie w Docker sami sugerują, że kontenery woluminów danych „ nie są już uważane za zalecany wzorzec ”, „ nazwane woluminy powinny być w stanie zastąpić woluminy zawierające tylko dane w większości (jeśli nie wszystkich) przypadkach ” i „ bez powodu, dla którego mogę użyć kontenery tylko z danymi ”.

Quinn Comendant
źródło