Dlaczego maszyna dokująca usuwa dane po ponownym uruchomieniu?

9

Używam Docker Toolbox na OSX.

Utworzyłem kontener objętości danych do przechowywania trwałych danych: https://docs.docker.com/userguide/dockervolumes/#creating-and-mounting-a-data-volume-container .

Sprawdziłem, czy te dane są rzeczywiście przechowywane na maszynie wirtualnej boot2docker (utworzonej przez maszynę dokującą), a nie w kontenerze, aby mogły zostać zachowane. Jednak „restart maszyny dokującej” usuwa te niestandardowe dane z maszyny wirtualnej.

Nie mogę znaleźć dokumentacji dotyczącej tego, co się dzieje. Znalazłem jeden post na forum, w którym wspomniano, że dane w / var / lib / docker zostaną zachowane, ale nie mogłem znaleźć żadnych oficjalnych dokumentów stwierdzających to, i wydaje się to również dziwne, biorąc pod uwagę, że powyższy przewodnik dotyczący przechowywania nie korzysta z tej ścieżki ani nawet nie wspomina o tym twoje dane zostaną usunięte.

Czy jest to oczekiwane, a jeśli tak, to czy istnieje oficjalna dokumentacja na właściwej ścieżce do przechowywania trwałych danych?


Edycja: dodanie przykładu nieudanego senario

$ docker-machine ssh alt
docker@alt:~$ docker run -v /data:/var/lib/mysql --name mydata busybox sh -c "echo 'hello' > /var/lib/mysql/hello"
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
hello
docker@alt:~$ exit
$ docker-machine restart alt
Starting VM...
$ docker-machine ssh alt
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
cat: can't open '/var/lib/mysql/hello': No such file or directory
Gerry
źródło

Odpowiedzi:

8

To zdecydowanie powinno działać:

$ docker-machine ssh default
docker@default:~$ docker run -v /data --name mydata busybox true
docker@default:~$ docker run --volumes-from mydata busybox sh -c "echo hello >/data/hello"
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello
docker@default:~$ exit
$ docker-machine restart default
Starting VM...
$ docker-machine ssh default
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello

Czy możesz bardziej szczegółowo opisać kroki mające na celu odtworzenie problemu?

boot2docker ma system plików tylko do odczytu (zostanie wyczyszczony przy ponownym uruchomieniu) z wyjątkiem:

  1. Kontenery i ich dane (woluminy) - o tym czytasz /var/lib/docker
  2. Obrazy dokerów
  3. Konfiguracja dokera (np. /var/lib/boot2docker/profileGdzie można modyfikować flagi demona)
nathanleclaire
źródło
Cześć, właśnie zasugerowałem edycję twojej odpowiedzi. Czy chodziło Ci o określenie obrazu zajętości w komendach 2. i 3. uruchomienia? Bez tego doker próbuje pobrać obrazy o nazwie „sh” i „cat”, co, jak podejrzewam, nie jest tym, czego zamierzałeś. Dodam powyżej nieudany przykład.
Gerry,
Dziękuję za pomoc Zarówno ty, jak i @ mc0e pomogliście w tym, więc dałem wam kleszcza, a on nagrodę (a także +1 za oba). Mam nadzieję, że uważasz to za uczciwe.
Gerry,
1
Ach tak, źle napisane. Przepraszam za literówkę.
nathanleclaire
Przeprosiny nie są konieczne. Sprawdziłem tylko dwa razy, aby upewnić się, że się nie zrozumiałem. Pozdrawiam za twoją pomoc w tym.
Gerry,
6

Nie używam boot2docker, ale jeśli / dane zostaną wyczyszczone przy ponownym uruchomieniu, tam jest przechowywany twój wolumin ( docker run -v /data:/var/lib/mysql), więc zostanie utracony.

To, co robisz, to także łączenie dwóch różnych wzorców radzenia sobie z utrzymywaniem głośności. Aby uzyskać trwałość, kontenery mogą montować woluminy z określonej lokalizacji w systemie hosta (który jest uważany za trwały) lub mogą być powiązane z kontenerem danych i montowane --volumes-from. Wygląda na to, że podejście do systemu plików hosta nie jest odpowiednie dla boot2docker i powinieneś użyć wzorca woluminu danych (tylko).

Prawdopodobnie powinieneś tworzyć swój kontener danych -v /var/lib/mysql, zamiast -v /data:/var/lib/mysql.

Mc0e
źródło
Utworzenie woluminu za pomocą flagi -v, a następnie użycie woluminów z tego kontenera w innych kontenerach za pomocą --volumes-from jest dokładnie tym, co pokazuje dokumentacja: docs.docker.com/userguide/dockervolumes/ ... Spodziewałbym się, że jeśli -v / location wie, że powinno być względne w stosunku do / var / lib / docker / woluminów, a następnie dodanie dwukropka nie powinno tego zmienić. Przynajmniej jest to nieintuicyjne. -v / var / lib / mysql! = -v / var / lib / mysql: / var / lib / mysql Wydaje się również, że dokumentacja mysql- docker
Gerry,
Dziękuję za pomoc Zarówno ty, jak i @nathanleclaire pomogliście w tym, więc dałem wam nagrodę (ponieważ jest ona warta więcej) i dałem kleszczowi nathanleclaire (a także +1 za oba). Mam nadzieję, że uważasz, że to jest sprawiedliwe.
Gerry,
@Gerry Zalecane jest utworzenie woluminu, a następnie użycie go za pomocą opcji --volumes-from. Montowanie efemerycznych / danych na kontenerze nie jest.
mc0e,
Tak, problem w tym, że nie wiedziałem / dane były ulotne, dopóki nie uruchomiłem ponownie.
Gerry,
0

Zauważ, że używam dokera dla Mac beta, który używa xhyve vm.

Zawartość / var / lib / boot2docker będzie utrwalana między restartami komputera. Więc jeśli chcesz, aby niektóre pliki były dostępne w twoim vm, umieść je w tym katalogu.

Jeśli chcesz, aby były one dostępne w innym miejscu do uruchamiania kontenerów dokerów, możesz dodać następujące opcje do / var / lib / boot2docker / profile:

mkdir -p /desired/path
ln -s /var/lib/boot2docker/your.file /desire/path/your.file

Jeśli chcesz dodać inną konfigurację do plików systemowych, które będą się utrzymywać między restartami vm, takie jak dodatkowe wartości w pliku hosts, możesz dodać polecenie takie jak poniższe do / var / lib / boot2docker / profile:

echo '127.0.0.1 your.domain.com' >> /etc/hosts

Mam nadzieję, że to pomoże

baoluofu
źródło