Jak ludzie radzą sobie z trwałym przechowywaniem kontenerów Docker?
Obecnie używam tego podejścia: zbuduj obraz, np. Dla PostgreSQL, a następnie uruchom kontener za pomocą
docker run --volumes-from c0dbc34fd631 -d app_name/postgres
IMHO, który ma tę wadę, że nie wolno mi (przypadkowo) usuwać kontenera „c0dbc34fd631”.
Innym pomysłem byłoby zamontowanie woluminów hosta „-v” w kontenerze, jednak identyfikator użytkownika w kontenerze niekoniecznie odpowiada identyfikatorowi użytkownika z hosta, a następnie uprawnienia mogą zostać pomieszane.
Uwaga: Zamiast --volumes-from 'cryptic_id'
ciebie możesz również użyć --volumes-from my-data-container
gdzie my-data-container
jest nazwa przypisana do kontenera tylko danych, np. docker run --name my-data-container ...
(Patrz zaakceptowana odpowiedź)
docker
docker-container
juwalter
źródło
źródło
--name
. masz-name
Odpowiedzi:
Docker 1.9.0 i nowsze wersje
Użyj interfejsu API woluminu
Oznacza to, że wzorzec kontenera zawierającego tylko dane musi zostać porzucony na rzecz nowych woluminów.
W rzeczywistości interfejs API woluminu jest tylko lepszym sposobem na osiągnięcie wzorca kontenera danych.
Jeśli utworzysz kontener za pomocą
-v volume_name:/container/fs/path
Dockera, automatycznie utworzy się nazwany wolumin, który może:docker volume ls
docker volume inspect volume_name
--volumes-from
połączenieNowy interfejs API woluminu dodaje przydatne polecenie, które pozwala zidentyfikować wiszące woluminy:
A następnie usuń go poprzez jego nazwę:
Jak podkreśla @mpugach w komentarzach, możesz pozbyć się wszystkich wiszących woluminów za pomocą ładnego jednowierszowego:
Docker 1.8.xi niższe
Podejście, które wydaje się działać najlepiej w przypadku produkcji, polega na użyciu kontenera zawierającego tylko dane .
Kontener tylko danych jest uruchamiany na obrazie barebone i właściwie nie robi nic poza ujawnieniem woluminu danych.
Następnie możesz uruchomić dowolny inny kontener, aby uzyskać dostęp do woluminów kontenera danych:
W tym poście na blogu znajduje się dobry opis tak zwanego kontenera jako wzorca objętości, który wyjaśnia główny punkt posiadania kontenerów zawierających wyłącznie dane .
Dokumentacja dokera ma teraz DEFINICJALNY opis kontenera jako wzorzec wolumenu / s .
Poniżej znajduje się procedura tworzenia kopii zapasowych / przywracania dla Docker 1.8.xi niższych.
UTWORZYĆ KOPIĘ ZAPASOWĄ:
PRZYWRACAĆ:
Oto fajny artykuł doskonałego Briana Goffa wyjaśniający, dlaczego warto używać tego samego obrazu dla kontenera i kontenera danych.
źródło
--volumes-from
pozwala współdzielić miejsce na dysku,--link
umożliwia udostępnianie usługdocker volume create --name mydata
) jest preferowane w stosunku do kontenera woluminów danych. 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 ”.W Docker wersja 1.0 powiązanie podłączenia pliku lub katalogu na maszynie hosta można wykonać za pomocą podanego polecenia:
Powyższy wolumin może być używany jako trwały magazyn na hoście z uruchomionym Dockerem.
źródło
Od Docker Compose 1.6 poprawiono obsługę woluminów danych w Docker Compose. Poniższy plik tworzenia utworzy obraz danych, który będzie trwał między ponownymi uruchomieniami (a nawet usunięciem) kontenerów nadrzędnych:
Oto ogłoszenie na blogu: Compose 1.6: Nowy plik Compose do definiowania sieci i woluminów
Oto przykładowy plik tworzenia:
O ile rozumiem: utworzy to kontener woluminu danych (
db_data
), który będzie trwał między restartami.Jeśli uruchomisz:
docker volume ls
powinieneś zobaczyć swój wolumin na liście:Możesz uzyskać więcej szczegółowych informacji na temat objętości danych:
Niektóre testy:
Uwagi:
W
volumes
bloku można również określić różne sterowniki . Na przykład można określić sterownik Flocker dla danych db_data:Oświadczenie: To podejście jest obiecujące i używam go z powodzeniem w środowisku programistycznym. Obawiałbym się wykorzystać to jeszcze w produkcji!
źródło
W przypadku, gdy nie jest jasne z aktualizacji 5 wybranej odpowiedzi, począwszy od Docker 1.9, można tworzyć woluminy, które mogą istnieć bez powiązania z konkretnym kontenerem, dzięki czemu wzorzec „kontenera tylko danych” staje się nieaktualny.
Zobacz Kontenery tylko z danymi przestarzałe w programie dokującym 1.9.0? # 17798 .
Wydaje mi się, że opiekunowie Dockera zdali sobie sprawę, że wzorzec kontenera obejmujący tylko dane był nieco zapachowym zapachem projektu i postanowili uczynić woluminy osobnym bytem, który może istnieć bez powiązanego kontenera.
źródło
Chociaż jest to nadal część Dockera, która wymaga trochę pracy , powinieneś umieścić wolumin w Dockerfile z instrukcją VOLUME , abyś nie musiał kopiować woluminów z innego kontenera.
To sprawi, że twoje pojemniki będą mniej zależne od siebie i nie będziesz musiał się martwić, że usunięcie jednego pojemnika wpłynie na inny.
źródło
docker rm
)Korzystając z Docker Compose , po prostu dołącz nazwany wolumin, na przykład:
źródło
Odpowiedź @ tommasop jest dobra i wyjaśnia niektóre mechanizmy korzystania z kontenerów zawierających tylko dane. Ale ponieważ ktoś, kto początkowo myślał, że pojemniki z danymi są głupie, gdy można po prostu powiązać, zamontuje wolumin na hoście (jak sugeruje kilka innych odpowiedzi), ale teraz zdaje sobie sprawę, że w rzeczywistości pojemniki tylko z danymi są całkiem fajne, mogę zasugerować własny post na blogu na ten temat: Dlaczego pojemniki danych Docker (woluminy!) są dobre
Zobacz także: moja odpowiedź na pytanie „ Jaki jest (najlepszy) sposób zarządzania uprawnieniami do udostępnionych woluminów Docker? ”, Na przykład, jak używać kontenerów danych, aby uniknąć problemów takich jak uprawnienia i mapowanie UID / GID z hostem.
Aby rozwiązać jedną z pierwotnych obaw PO: nie można usunąć kontenera danych. Nawet jeśli kontener danych zostanie usunięty, same dane nie zostaną utracone, dopóki jakikolwiek kontener będzie miał odniesienie do tego woluminu, tj. Do dowolnego kontenera, przez który zamontowano wolumin
--volumes-from
. Tak więc, chyba że wszystkie powiązane kontenery zostaną zatrzymane i usunięte (można uznać to za ekwiwalent przypadkurm -fr /
) dane są bezpieczne. Zawsze możesz odtworzyć kontener danych, wykonując--volumes-from
dowolny kontener, który ma odniesienie do tego woluminu.Jak zawsze rób jednak kopie zapasowe!
AKTUALIZACJA: Docker ma teraz woluminy, którymi można zarządzać niezależnie od kontenerów, co dodatkowo ułatwia zarządzanie.
źródło
Istnieje kilka poziomów zarządzania trwałymi danymi, w zależności od potrzeb:
-v host-path:container-path
aby utrwalić dane katalogu kontenera w katalogu hosta.--volumes-from
do zamontowania tych danych w kontenerze aplikacji.źródło
Jeśli chcesz przenosić woluminy, powinieneś również spojrzeć na Flockera .
Z README:
źródło
To zależy od twojego scenariusza (nie jest to tak naprawdę odpowiednie dla środowiska produkcyjnego), ale jest jeden sposób:
Tworzenie kontenera dokującego MySQL
Jego istotą jest użycie katalogu na hoście w celu utrwalenia danych.
źródło
Niedawno pisałem o potencjalnym rozwiązaniu i aplikacji demonstrującej tę technikę. Uważam, że jest dość wydajny podczas opracowywania i produkcji. Mam nadzieję, że to pomaga lub podsyca pewne pomysły.
Repo: https://github.com/LevInteractive/docker-nodejs-example
Artykuł: http://lev-interactive.com/2015/03/30/docker-load-balanced-mongodb-persistence/
źródło
Po prostu używam predefiniowanego katalogu na hoście, aby utrwalić dane dla PostgreSQL. W ten sposób można również łatwo migrować istniejące instalacje PostgreSQL do kontenerów Docker: https://crondev.com/persistent-postgresql-inside-docker/
źródło
Moim rozwiązaniem jest skorzystanie z nowego
docker cp
, który jest teraz w stanie kopiować dane z kontenerów, bez względu na to, czy jest uruchomiony, czy nie i udostępniać wolumin hosta dokładnie w tej samej lokalizacji, w której aplikacja bazy danych tworzy swoje pliki bazy danych w kontenerze . To podwójne rozwiązanie działa bez kontenera tylko danych, prosto z oryginalnego kontenera bazy danych.Tak więc mój systemowy skrypt startowy wykonuje kopię zapasową bazy danych w archiwum na hoście. W nazwie pliku umieściłem znacznik czasu, aby nigdy nie przepisywać pliku.
Robi to na ExecStartPre:
I robi to samo na ExecStopPost:
Dodatkowo odsłoniłem folder z hosta jako wolumin dokładnie w tej samej lokalizacji, w której przechowywana jest baza danych:
Działa świetnie na mojej maszynie wirtualnej (buduję stos LEMP dla siebie): https://github.com/DJviolin/LEMP
Ale po prostu nie wiem, czy jest to „kuloodporne” rozwiązanie, gdy twoje życie zależy od niego (na przykład sklep internetowy z transakcjami w każdej możliwej milisekundie)?
Po 20 min. 20 sek. Od tego oficjalnego filmu przewodniego Dockera prezenter robi to samo z bazą danych:
Rozpoczęcie pracy z Dockerem
źródło
Użyj trwałej deklaracji wolumenu (PVC) z Kubernetes, która jest narzędziem do zarządzania i planowania kontenerów Docker:
Trwałe objętości
Zalety korzystania z Kubernetes w tym celu:
źródło