Pierdo mis datos cuando sale el contenedor


A pesar del tutorial interactivo de Docker 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 LOS NUEVOS USUARIOS DE DOCKER

As @ mohammed-noureldin y otros dijeron, en realidad esto es NO un contenedor saliendo . Cada vez que acaba de crear un nuevo contenedor.

 295
Author: iman, 2013-10-25

10 answers

Necesita confirmar los cambios que realice en el contenedor y luego ejecutarlo. Prueba esto:

sudo docker pull ubuntu

sudo docker run ubuntu apt-get install -y ping

Luego obtenga el id del contenedor usando este comando:

sudo docker ps -l

Confirmar cambios en el contenedor:

sudo docker commit <container_id> iman/ping 

Luego ejecute el contenedor:

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

Esto debería funcionar.

 315
Author: Unferth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-05 01:51:57

Cuando usa docker run para iniciar un contenedor, en realidad crea un nuevo contenedor basado en la imagen que ha especificado.

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

docker start f357e2faab77 # restart it in the background
docker attach f357e2faab77 # reattach the terminal & stdin
 311
Author: ZeissS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-29 11:49:32

Existen las siguientes formas de conservar los datos del contenedor:

  1. Volúmenes Docker

  2. Docker commit

    A) cree un contenedor a partir de la imagen de ubuntu y ejecute un terminal bash.

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

    B) Dentro del terminal install curl

       # apt-get update
       # apt-get install curl
    

    C) Salir de la terminal de contenedores

       # exit
    

    D) Tome nota de su id de contenedor ejecutando el siguiente comando:

       $ docker ps -a
    

    E) guardar contenedor como nueva imagen

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

    F) compruebe que puede ver su nuevo imagen con curl instalado.

       $ docker images           
    
       $ docker run -it new_image_name:tag_name bash
          # which curl
            /usr/bin/curl
    
 92
Author: kalyani chaudhari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-17 08:48:38

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

En un directorio vacío, cree un archivo llamado "Dockerfile" con el siguiente contenido.

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

Cree una imagen usando el Dockerfile . Vamos a usar una etiqueta para que no tengamos que recordar el número de imagen hexadecimal.

$ docker build -t iman/ping .

Y luego ejecute la imagen en un contenedor.

$ docker run iman/ping stackoverflow.com
 51
Author: salathe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-09 11:17:48

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

 8
Author: Kudzanayi Mutamba,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-06 19:34:34

Mi sugerencia es administrar docker, con docker compose. Es una forma fácil de 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, mejor que los documentos de docker.

Docker-Compose Docs

Mejor

 3
Author: Cam T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-11 02:54:31

El problema similar (y de ninguna manera Dockerfile por sí solo podría solucionarlo) me llevó a esta página.

Etapa 0: para todos, esperamos que Dockerfile pueda solucionarlo: hasta que --dns y dns dns-search aparezcan en el soporte de Dockerfile, no hay forma de integrar recursos basados en intranet.

Etapa 1: después de compilar la imagen usando Dockerfile (por cierto, es un problema grave que Dockerfile debe estar en la carpeta actual), tener una imagen para implementar lo que está basado en intranet, ejecutando docker run script. 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: aplicando docker run script en modo demonio proporcionando registros dns locales para tener la capacidad de descargar e implementar cosas locales.

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

No , no es posible ejecutar el contenedor en modo interactivo para la materia de automatización completa, ya que lo hará permanecer dentro interno deberá símbolo del sistema hasta CTRL-p CTRL-q se presiona.

No, si la interacción de bash no se ejecutará al final del script de instalación, el contenedor terminará inmediatamente después de finalizar la ejecución del script, perdiendo todos los resultados de la instalación.

Etapa 3: el contenedor todavía se está ejecutando en segundo plano, pero no está claro si el contenedor ha finalizado el procedimiento de instalación o aún no. usando el siguiente bloque para determinar finaliza el procedimiento de ejecución: while ! docker container top ${CONTNAME} | grep "00[[:space:]]\{12\}bash \--norc" - do echo "." sleep 5 done el script continuará solo después de completar la instalación. y este es el momento adecuado para llamar a: commit, proporcionando el id del contenedor actual, así como el nombre de la imagen de destino (puede ser el mismo que en el procedimiento build/run pero anexado con la etiqueta local installation purposes. ejemplo: docker commit containerID pack/bsp:toolchained. vea este enlace sobre cómo obtener containerId

Etapa 4: el contenedor se ha actualizado con las instalaciones locales así como se ha confirmado en la imagen recién asignada (la que tiene la etiqueta purposes añadida). ahora es seguro detener el funcionamiento del contenedor. ejemplo: docker stop packbsp-cont

Stage5: en cualquier momento que el contenedor con instalaciones locales requiera para ejecutarse, arráncalo con la imagen previamente guardada. ejemplo: docker run -d -t pack/bsp:toolchained

 0
Author: Oleg Kokorin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-03 09:20:23

Una respuesta brillante aquí Cómo continuar un docker que se sale del usuario 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 <container-id> /bin/bash

Esa segunda línea es crucial. Por lo tanto, exec se usa en lugar de run, y no en una imagen sino en un containerid. Y lo haces después de que el contenedor se haya iniciado.

 0
Author: barlop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-27 02:14:27

Tuve este problema... cada vez que u sale u tiene que iniciar su contenedor no ejecutarlo... ejecutar una imagen agane crear un nuevo contenedor esto ayudará inicio de docker docker attach

 0
Author: fatemeh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-28 06:22:24

Tengo una respuesta mucho más simple a su pregunta, ejecute los siguientes dos comandos

sudo docker run ubuntu
sudo docker ps -a

El comando ps-a anterior devuelve una lista de todos los contenedores. Tome el nombre del contenedor que hace referencia al nombre de la imagen - 'ubuntu'. docker auto genera nombres para los contenedores por ejemplo - 'ubuntu-containername'

sudo docker start ubuntu-containername

sudo docker exec -ti ubuntu-containername bash

Este comando anterior iniciará el contenedor detenido y el siguiente comando le ayudará a iniciar sesión en el contenedor con bash shell. A partir de este punto, cualquier cambio que realice en el el contenedor es guardado automáticamente por docker. Por ejemplo - apt-get install curl dentro del contenedor Puede salir del contenedor sin ningún problema, docker guarda automáticamente los cambios.

En el siguiente uso, todo lo que tiene que hacer es ejecutar estos dos comandos cada vez que desee trabajar con este contenedor.

sudo docker start ubuntu-containername
sudo docker exec -ti ubuntu-containername bash
 0
Author: Magnus Melwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-04 07:02:10