Pierdo mis datos cuando el contenedor sale

A pesar de Docker's Interactive tutorial y faq , pierdo mis datos cuando el contenedor sale.

He instalado Docker como se describe aquí: http://docs.docker.io/en/latest/installation/ubuntulinux sin ningún problema en ubuntu 13.04.

Pero pierde todos los datos cuando sale.

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 

También lo probé con sesiones interactivas con el mismo resultado. Olvidé algo?

EDITAR: IMPORTANTE PARA NUEVOS USUARIOS DOCKER

Como dijeron @ mohammed-noureldin y otros, en realidad, este NO es un contenedor que sale . Cada vez que solo crea un nuevo contenedor.

Debe confirmar los cambios que realiza en el contenedor y luego ejecutarlo. Prueba esto:

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

A continuación, obtenga la identificación del contenedor con este command:

 sudo docker ps -l 

Confirmar cambios al contenedor:

 sudo docker commit <container_id> iman/ping 

A continuación, ejecute el contenedor:

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

Esto debería funcionar.

Cuando utiliza la aplicación docker run para iniciar un contenedor, en realidad crea un nuevo contenedor basado en la image que ha especificado.

Además de las otras respuestas útiles aquí, tenga en count que puede reiniciar un contenedor existente después de salir y sus cambios aún están allí.

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

Existen las siguientes forms de conservar los datos del contenedor:

  1. Volúmenes Docker

  2. Docker se compromete

    a) crear un contenedor desde la image ubuntu y ejecutar un terminal bash.

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

    b) Dentro del terminal, instale el rizo

      # apt-get update # apt-get install curl 

    c) Salga de la terminal de contenedores

      # exit 

    d) Tome nota de su identificador de contenedor ejecutando el siguiente command:

      $ docker ps -a 

    e) save contenedor como nueva image

      $ docker commit <container_id> new_image_name:tag_name(optional) 

    f) verifique que pueda ver su nueva image con curl instalado.

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

Además de la respuesta de Unferth , se recomienda crear un Dockerfile .

En un directory vacío, cree un file llamado "Dockerfile" con los siguientes contenidos.

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

Crea una image usando el file Docker . Usemos una label para no tener que recordar el número de image hexadecimal.

 $ docker build -t iman/ping . 

Y luego ejecuta la image en un contenedor.

 $ docker run iman/ping stackoverflow.com 

Es posible que desee ver los volúmenes de acoplador si desea conservar los datos en su contenedor. Visita https://docs.docker.com/engine/tutorials/dockervolumes/ . La documentation del docker es un muy buen lugar para comenzar

Mi sugerencia es administrar Docker, con docker componer. Es fácil administrar todos los contenedores de Docker para su proyecto, puede mapear las versiones y vincular diferentes contenedores para trabajar juntos.

Los documentos son muy simples de entender, mejores que los documentos de docker.

Docker-Compose Docs

Mejor

el problema similar (y de ninguna manera Dockerfile solo podría solucionarlo) me trajo a esta página.

etapa 0: para todos, esperando que Dockerfile pueda arreglarlo: hasta que –dns y –dns-search aparezcan en el soporte de Dockerfile – no hay manera de integrar resources basados ​​en intranet.

Etapa 1: después de crear una image usando Dockerfile (por cierto, es un problema grave que Dockerfile debe estar en la carpeta actual ), tener una image para implementar lo que está basado en la intranet, ejecutando el script de ejecución de Docker. ejemplo: 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"

Etapa 2: aplicación docker run script en modo daemon que proporciona loggings dns locales para tener la capacidad de download e implementar cosas locales.

punto importante: el script run debe terminar con algo como /usr/bin/sudo -u ${USERNAME} bash --norc para mantener el contenedor en ejecución incluso después de que finalicen los scripts de installation.

no , no es posible ejecutar el contenedor en modo interactivo para todo el asunto de la automation, ya que permanecerá dentro de la instrucción de commands internos hasta que se presione CTRL-p CTRL-q .

no , si la interacción de bash no se ejecutará al final de la secuencia de commands de installation, el contenedor terminará inmediatamente después de que finalice la ejecución de la secuencia de commands, perdiendo todos los resultados de la installation.

etapa 3: el contenedor aún se está ejecutando en segundo plano, pero no está claro si el contenedor ha finalizado o no el procedimiento de installation. usando el siguiente bloque para determinar los finales del procedimiento de ejecución: 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 el script continuará más adelante solo después de la installation completa. y este es el momento adecuado para llamar: confirmar , proporcionando el identificador actual del contenedor así como el nombre de la image de destino (puede ser el mismo que en el procedimiento de compilation / ejecución pero con la label de los propósitos de installation local. ejemplo: docker commit containerID pack/bsp:toolchained . vea este enlace sobre cómo get el contenedor ID apropiado

Etapa 4: el contenedor se ha actualizado con las instalaciones locales y se ha asignado a la image recién asignada (la que tiene la label para fines añadidos). ahora es seguro detener el funcionamiento del contenedor. ejemplo: docker stop packbsp-cont

stage5: en cualquier momento que el contenedor con instalaciones locales requiera ejecutarse, inícielo con la image previamente guardada. ejemplo: docker run -d -t pack/bsp:toolchained