Perdo i miei dati quando il container esce

Nonostante il tutorial interattivo e le faq di Docker, perdo i miei dati quando il container esce.

Ho installato Docker come descritto qui: http://docs.docker.io/en/latest/installation/ubuntulinux senza alcun problema su Ubuntu 13.04.

Ma perde tutti i dati quando esce.

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 

L’ho anche testato con sessioni interattive con lo stesso risultato. Ho dimenticato qualcosa?

EDIT: IMPORTANTE PER I NUOVI UTENTI DOCKER

Come @ mohammed-noureldin e altri hanno detto, in realtà questo NON è un contenitore in uscita . Ogni volta crea solo un nuovo contenitore.

È necessario eseguire il commit delle modifiche apportate al contenitore e quindi eseguirlo. Prova questo:

 sudo docker pull ubuntu sudo docker run ubuntu apt-get install -y ping 

Quindi ottieni l’id del contenitore usando questo comando:

 sudo docker ps -l 

Applica modifiche al contenitore:

 sudo docker commit  iman/ping 

Quindi esegui il contenitore:

 sudo docker run iman/ping ping www.google.com 

Questo dovrebbe funzionare.

Quando si utilizza la docker run per avviare un contenitore, in realtà viene creato un nuovo contenitore in base all’immagine specificata.

Oltre alle altre risposte utili qui, si noti che è ansible riavviare un contenitore esistente dopo che è terminato e le modifiche sono ancora presenti.

 docker start f357e2faab77 # restart it in the background docker attach f357e2faab77 # reattach the terminal & stdin 

Esistono i seguenti modi per mantenere i dati del contenitore:

  1. Volumi Docker

  2. Docker commit

    a) creare un contenitore da un’immagine ubuntu ed eseguire un terminale bash.

      $ docker run -i -t ubuntu:14.04 /bin/bash 

    b) All’interno del terminale installare arricciatura

      # apt-get update # apt-get install curl 

    c) Uscire dal terminale del contenitore

      # exit 

    d) Prendi nota del tuo id contenitore eseguendo il seguente comando:

      $ docker ps -a 

    e) salva il contenitore come nuova immagine

      $ docker commit  new_image_name:tag_name(optional) 

    f) verifica di poter vedere la tua nuova immagine con l’arricciatura installata.

      $ docker images $ docker run -it new_image_name:tag_name bash # which curl /usr/bin/curl 

Oltre alla risposta di Unferth , si consiglia di creare un Dockerfile .

In una directory vuota, creare un file chiamato “Dockerfile” con i seguenti contenuti.

 FROM ubuntu RUN apt-get install ping ENTRYPOINT ["ping"] 

Crea un’immagine usando il Dockerfile . Usiamo un tag in modo da non dover ricordare il numero esadecimale dell’immagine.

 $ docker build -t iman/ping . 

E quindi eseguire l’immagine in un contenitore.

 $ docker run iman/ping stackoverflow.com 

Si consiglia di esaminare i volumi della finestra mobile se si desidera mantenere i dati nel contenitore. Visita https://docs.docker.com/engine/tutorials/dockervolumes/ . La documentazione della finestra mobile è un ottimo punto di partenza

Il mio suggerimento è di gestire la finestra mobile, con la finestra mobile comporre. È un modo facile per gestire tutti i contenitori della finestra mobile per il tuo progetto, puoi mappare le versioni e colbind diversi contenitori per lavorare insieme.

I documenti sono molto semplici da capire, meglio dei documenti del docker.

Docker-Compose Docs

Migliore

il problema simile (e in nessun modo Dockerfile da solo potrebbe risolverlo) mi ha portato a questa pagina.

fase 0: per tutti, sperando che Dockerfile possa risolverlo: fino a quando –dns e –dns-search appariranno nel supporto Dockerfile – non c’è modo di integrare le risorse basate sulla intranet.

fase 1: dopo la creazione dell’immagine usando Dockerfile (a proposito è un problema serio Dockerfile deve essere nella cartella corrente ), con un’immagine per distribuire ciò che è basato su intranet, eseguendo lo script di esecuzione docker. esempio: 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"

fase 2: applicazione dello script di esecuzione della finestra mobile in modalità daemon che consente ai record DNS locali di avere la possibilità di scaricare e distribuire materiale locale.

punto importante: lo script di esecuzione dovrebbe terminare con qualcosa come /usr/bin/sudo -u ${USERNAME} bash --norc per mantenere il contenitore in esecuzione anche dopo il completamento degli script di installazione.

no , non è ansible eseguire il contenitore in modalità intertriggers per la materia di automazione completa poichè rimarrà all’interno verrà richiesto il comando finché CTRL-p CTRL-q non viene premuto.

no , se la bash intertriggers non verrà eseguita alla fine dello script di installazione, il contenitore terminerà immediatamente dopo aver terminato l’esecuzione dello script, perdendo tutti i risultati dell’installazione.

fase 3: il contenitore è ancora in esecuzione in background ma non è chiaro se il contenitore ha terminato la procedura di installazione o non ancora. usando il seguente blocco per determinare la conclusione della procedura di esecuzione: while ! docker container top ${CONTNAME} | grep "00[[:space:]]\{12\}bash \--norc" - do echo "." sleep 5 done while ! docker container top ${CONTNAME} | grep "00[[:space:]]\{12\}bash \--norc" - do echo "." sleep 5 done while ! docker container top ${CONTNAME} | grep "00[[:space:]]\{12\}bash \--norc" - do echo "." sleep 5 done lo script procederà ulteriormente solo dopo l’installazione completata. e questo è il momento giusto per chiamare: commit , fornendo l’id del contenitore corrente e il nome dell’immagine di destinazione (potrebbe essere lo stesso della procedura build / run ma aggiunto al tag di installazione locale. esempio: docker commit containerID pack/bsp:toolchained vedi questo link su come ottenere containerID corretto

fase 4: il contenitore è stato aggiornato con le installazioni locali e si è impegnato in una nuova immagine assegnata (quella con tag di scopo aggiunto). ora è sicuro fermare il container in esecuzione. esempio: docker stop packbsp-cont

stage5: in qualsiasi momento è necessario eseguire il contenitore con installazioni locali, avviarlo con l’immagine precedentemente salvata. esempio: docker run -d -t pack/bsp:toolchained

una risposta brillante qui Come continuare una finestra mobile che viene abbandonata dall’utente kgs

 docker start $(docker ps -a -q --filter "status=exited") (or in this case just docker start $(docker ps -ql) 'cos you don't want to start all of them) docker exec -it  /bin/bash 

Quella seconda linea è cruciale. Quindi exec viene usato al posto di esecuzione, e non su un’immagine ma su un containeride. E lo fai dopo che il contenitore è stato avviato.

Ho avuto questo problema … ogni volta che esci devi avviare il tuo contenitore non eseguirlo … lanciare un’immagine agane crea un nuovo contenitore questo aiuterà il docker ad avviare la finestra mobile