Pomimo interaktywnego samouczka Dockera i często zadawanych pytań tracę dane po wyjściu kontenera.
Zainstalowałem Docker zgodnie z opisem tutaj: http://docs.docker.io/en/latest/installation/ubuntulinux bez problemu na Ubuntu 13.04.
Ale traci wszystkie dane po wyjściu.
iman@test:~$ sudo docker version
Client version: 0.6.4
Go version (client): go1.1.2
Git commit (client): 2f74b1c
Server version: 0.6.4
Git commit (server): 2f74b1c
Go version (server): go1.1.2
Last stable version: 0.6.4
iman@test:~$ sudo docker run ubuntu ping
2013/10/25 08:05:47 Unable to locate ping
iman@test:~$ sudo docker run ubuntu apt-get install ping
Reading package lists...
Building dependency tree...
The following NEW packages will be installed:
iputils-ping
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 56.1 kB of archives.
After this operation, 143 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu/ precise/main iputils-ping amd64 3:20101006-1ubuntu1 [56.1 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 56.1 kB in 0s (195 kB/s)
Selecting previously unselected package iputils-ping.
(Reading database ... 7545 files and directories currently installed.)
Unpacking iputils-ping (from .../iputils-ping_3%3a20101006-1ubuntu1_amd64.deb) ...
Setting up iputils-ping (3:20101006-1ubuntu1) ...
iman@test:~$ sudo docker run ubuntu ping
2013/10/25 08:06:11 Unable to locate ping
iman@test:~$ sudo docker run ubuntu touch /home/test
iman@test:~$ sudo docker run ubuntu ls /home/test
ls: cannot access /home/test: No such file or directory
Przetestowałem to również podczas interaktywnych sesji z tym samym wynikiem. Zapomniałem czegoś?
EDYCJA: WAŻNE DLA NOWYCH UŻYTKOWNIKÓW DOCKER
Jak powiedział @ mohammed-noureldin i inni, tak naprawdę NIE jest to pojemnik wychodzący . Za każdym razem tworzy nowy pojemnik.
Docker
. Proponuję zachować tytuł i oryginalne pytanie, ponieważ początkujący z pewnością będą szukać czegoś takiego. Ale dlaczego nie dodasz czegoś opisującego swoje nieporozumienia w momencie pisania postu. Pomoże to wyjaśnić. To jest nasza kultura tutaj w SO ... prawda? :-)Odpowiedzi:
Musisz zatwierdzić wprowadzone zmiany w kontenerze, a następnie uruchomić go. Spróbuj tego:
Następnie pobierz identyfikator kontenera za pomocą tego polecenia:
Zatwierdź zmiany w kontenerze:
Następnie uruchom kontener:
To powinno działać.
źródło
<none>
. Jak dodawać zatwierdzenie do istniejącego obrazu?Gdy użyjesz
docker run
do uruchomienia kontenera, faktycznie tworzy on nowy kontener na podstawie podanego obrazu.Oprócz innych użytecznych odpowiedzi tutaj, pamiętaj, że możesz zrestartować istniejący kontener po jego wyjściu, a zmiany nadal tam są.
źródło
docker ps
pokazuje tylko działające kontenery dokerów.docker ps -a
pokazuje również te, które zostały zakończone - i możesz kontynuować. Zatwierdzenie jest konieczne tylko po każdym uruchomieniu, jeśli chcesz zrobić tam migawkę do użycia w przyszłości, w przeciwnym razie sam kontener zostanie w pobliżu, abyś mógł z niej korzystać.jenkins
pobiorę dokera serwera i uruchomię go na moim hoście ci i uruchomi on niektóre zadania, które mam, w wyniku czego serwer jenkins zapisuje na dysku niektóre dzienniki. teraz, jeśli mój serwer (który był hostem mojego dokera) zostanie zrestartowany i uruchomię ponownie moją dokerkę Jenkins, czy to znaczy, że straciłem wszystkie pliki dziennika? jeśli tak, to w jaki sposób mogęjenkins
na przykład użyć okna dokowanego, aby ułatwić instalację Jenkins w CI?docker cp $(docker ps -alq):/path/to/file .
docker run -it --name my_debian debian
i późniejdocker start my_debian && docker attach my_debian
)Istnieją następujące sposoby utrwalenia danych kontenera:
Woluminy dokerów
Dokowanie zatwierdzenia
a) utwórz kontener z obrazu ubuntu i uruchom terminal bash.
b) Wewnątrz zacisku zainstaluj zawinięcie
c) Wyjdź z terminalu kontenerowego
d) Zanotuj swój identyfikator kontenera, wykonując następujące polecenie:
e) zapisz kontener jako nowy obraz
f) sprawdź, czy możesz zobaczyć swój nowy obraz z zainstalowanym curl.
źródło
exit
wcześniejdocker commit
? Dzięki.docker run
polecenia uruchamiasz bash w kontenerze i zostajesz tam ze względu na opcje-i
i-t
(interaktywne z TTY). Jednak Docker działa na twoim komputerze poza kontenerem, więc po dokonaniu niezbędnych zmian w kontenerze od wewnątrz, aby wrócić do powłoki systemu, musiszexit
(lub Ctrl + D) powłokę kontenera. Zwróć również uwagę na#
iw$
odpowiedzi, które wskazują różne powłoki, w których zapisywane są polecenia.docker stop
następnie następujedocker start
.Oprócz odpowiedzi Unferth zaleca się utworzenie pliku Docker .
W pustym katalogu utwórz plik o nazwie „Dockerfile” z następującą zawartością.
Utwórz obraz za pomocą Dockerfile . Użyjmy tagu, abyśmy nie musieli pamiętać szesnastkowego numeru obrazu.
A następnie uruchom obraz w kontenerze.
źródło
Mam o wiele prostszą odpowiedź na twoje pytanie, uruchom następujące dwa polecenia
powyższe polecenie ps -a zwraca listę wszystkich kontenerów. Weź nazwę kontenera, który odwołuje się do nazwy obrazu - „ubuntu”. docker auto generuje na przykład nazwy kontenerów -
'lightlyxuyzx'
to znaczy, jeśli nie używasz opcji --name.Ważne są opcje -t i -d, utworzony kontener jest odłączony i można go ponownie podłączyć zgodnie z opisem poniżej z opcją -t.
Dzięki opcji --name możesz nazwać swój kontener w moim przypadku „moja_nazwa_main”.
a powyższe polecenie pomaga zalogować się do kontenera za pomocą powłoki bash. Od tego momentu wszelkie zmiany wprowadzone w kontenerze są automatycznie zapisywane przez dokera. Na przykład -
apt-get install curl
wewnątrz kontenera Możesz wyjść z kontenera bez żadnych problemów, doker automatycznie zapisuje zmiany.Przy następnym użyciu Wszystko, co musisz zrobić, to uruchomić te dwa polecenia za każdym razem, gdy chcesz pracować z tym kontenerem.
To polecenie poniżej uruchomi zatrzymany pojemnik:
Kolejny przykład z portami i wspólną przestrzenią podany poniżej:
W moim przypadku: 7efe2989e877 - to imageid poprzedniego uruchomionego kontenera, który uzyskałem
źródło
--name
docker run --name mycontainername -t -d ubuntu /bin/bash
Jeśli chcesz zachować dane w kontenerze, możesz zajrzeć do woluminów dokowanych. Odwiedź https://docs.docker.com/engine/tutorials/dockervolumes/ . Dokumentacja dokera jest bardzo dobrym miejscem do rozpoczęcia
źródło
Moją sugestią jest zarządzanie dokerem za pomocą komponowania dokera. Jest łatwym sposobem zarządzania wszystkimi kontenerami dokera dla twojego projektu, możesz zmapować wersje i połączyć różne kontenery, aby ze sobą współpracowały.
Dokumenty są bardzo proste do zrozumienia, lepsze niż dokumenty dokerów.
Dokumenty Docker-Compose
Najlepsza
źródło
Powyżej zadanego pytania znajdują się naprawdę świetne odpowiedzi. Być może nie będzie potrzeby kolejnej odpowiedzi, ale nadal chcę wyrazić swoją osobistą opinię na ten temat w najprostszych możliwych słowach.
Oto kilka uwag na temat pojemników i obrazów, które pomogą nam wyciągnąć wniosek:
Wniosek :
Jak widzimy, kontener dokera jest niezależny od obrazu dokera.
Kontener można zrestartować, pod warunkiem, że unikalny identyfikator tego kontenera [użyj,
docker ps --all
aby uzyskać identyfikator] .Wszelkie operacje, takie jak utworzenie nowego katalogu, tworzenie plików, instalowanie narzędzi itp. Można wykonać wewnątrz kontenera, gdy jest on uruchomiony. Po zatrzymaniu kontener zachowuje wszystkie zmiany. Zatrzymywanie i restartowanie kontenera jest jak ponowne uruchamianie systemu komputerowego.
Już utworzony kontener jest zawsze dostępny do ponownego uruchomienia, ale kiedy wydamy
docker run
polecenie, nowy kontener jest tworzony z obrazu, a zatem jest jak nowy system komputerowy. Zmiany wprowadzone w starym kontenerze - jak możemy teraz zrozumieć - nie są dostępne w tym nowym kontenerze.Ostatnia uwaga :
Wydaje mi się, że teraz jest oczywiste, dlaczego dane wydają się być utracone, ale wciąż są dostępne ... ale w innym [starym] pojemniku. Więc zwróć uwagę na różnicę w
docker start
&docker run
Command i nigdy się w nich nie mylić.źródło
podobny problem (i w żaden sposób sam Dockerfile nie może go naprawić) doprowadził mnie do tej strony.
etap 0: dla wszystkich, mając nadzieję, że Dockerfile może to naprawić: dopóki --dns i --dns-search nie pojawią się w obsłudze Dockerfile - nie ma możliwości zintegrowania zasobów opartych na intranecie.
etap 1: po zbudowaniu obrazu za pomocą Dockerfile (przy okazji to poważna usterka, Dockerfile musi znajdować się w bieżącym folderze), posiadając obraz do wdrożenia tego, co jest oparte na intranecie, poprzez uruchomienie skryptu uruchamiania dokera. przykład:
docker run -d \ --dns=${DNSLOCAL} \ --dns=${DNSGLOBAL} \ --dns-search=intranet \ -t pack/bsp \ --name packbsp-cont \ bash -c " \ wget -r --no-parent http://intranet/intranet-content.tar.gz \ tar -xvf intranet-content.tar.gz \ sudo -u ${USERNAME} bash --norc"
etap 2: zastosowanie skryptu uruchamiania dokera w trybie demona, zapewniając lokalne rekordy dns, aby mieć możliwość pobierania i wdrażania lokalnych rzeczy.
ważna kwestia: skrypt uruchamiający powinien kończyć się czymś w rodzaju
/usr/bin/sudo -u ${USERNAME} bash --norc
kontynuowania działania kontenera nawet po zakończeniu skryptów instalacyjnych.nie , nie jest możliwe uruchomienie kontenera w trybie interaktywnym dla pełnej automatyzacji, ponieważ pozostanie on w wewnętrznej linii poleceń, dopóki nie zostanie naciśnięty CTRL-p CTRL-q .
Nie , jeśli interakcja bash nie zostanie wykonana na końcu skryptu instalacyjnego, kontener zakończy się natychmiast po zakończeniu wykonywania skryptu, tracąc wszystkie wyniki instalacji.
etap 3: kontener nadal działa w tle, ale nie jest jasne, czy kontener zakończył procedurę instalacji, czy nie. za pomocą następującego bloku, aby określić zakończenie procedury wykonywania:
while ! docker container top ${CONTNAME} | grep "00[[:space:]]\{12\}bash \--norc" - do echo "." sleep 5 done
skrypt będzie kontynuował działanie dopiero po zakończeniu instalacji. i jest to właściwy moment na wywołanie: zatwierdzenia , podając bieżący identyfikator kontenera, a także nazwę obrazu docelowego (może być taki sam jak w procedurze kompilacji / uruchamiania , ale dołączony z tagiem lokalnych celów instalacji. przykład:docker commit containerID pack/bsp:toolchained
zobacz ten link na jak uzyskać właściwy identyfikator konteneraetap 4: kontener został zaktualizowany o lokalne instalacje, a także został przypisany do nowo przypisanego obrazu (ten z dodanym znacznikiem celu). teraz można bezpiecznie zatrzymać pojemnik. przykład:
docker stop packbsp-cont
stage5: w dowolnym momencie, w którym kontener z lokalnymi instalacjami wymaga uruchomienia, uruchom go z wcześniej zapisanym obrazem. przykład:
docker run -d -t pack/bsp:toolchained
źródło
genialna odpowiedź tutaj Jak kontynuować dokera, który jest opuszczany przez kilogramy użytkownika
Ta druga linia jest kluczowa. Więc exec jest używany zamiast uruchamiania, a nie na obrazie, ale na containerid. I robisz to po uruchomieniu kontenera.
źródło
Żadna z odpowiedzi nie odnosi się do wyboru tego projektu. Myślę, że doker działa w ten sposób, aby zapobiec tym 2 błędom:
źródło