¿Por qué la máquina acoplable borra datos al reiniciar?

9

Estoy usando Docker Toolbox en OSX.

He creado un contenedor de volumen de datos para almacenar datos persistentes: https://docs.docker.com/userguide/dockervolumes/#creating-and-mounting-a-data-volume-container .

Verifiqué que estos datos están almacenados en la máquina virtual boot2docker (creada por docker-machine) y no en el contenedor, para que persista. Sin embargo, "reinicio de la máquina acoplable" borra estos datos personalizados en la máquina virtual.

No puedo encontrar documentación sobre lo que está sucediendo. Encontré una publicación en el foro que menciona que los datos en / var / lib / docker se conservarán, pero no pude encontrar ningún documento oficial que lo indique y también parece extraño teniendo en cuenta que la guía de almacenamiento persistente anterior no usa esta ruta o incluso menciona que sus datos serán eliminados

¿Se espera esto? De ser así, ¿hay alguna documentación oficial sobre la ruta correcta para almacenar datos persistentes?


Editar: Agregar un ejemplo de falla del 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
fuente

Respuestas:

8

Esto definitivamente debería funcionar:

$ 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

¿Puedes dar más detalles sobre los pasos para reproducir tu problema?

boot2docker tiene un sistema de archivos de solo lectura (se borrará al reiniciar) con la excepción de:

  1. Contenedores y sus datos (volúmenes): esto es lo que lees sobre /var/lib/docker
  2. Imágenes de Docker
  3. Configuración de Docker (p. Ej., /var/lib/boot2docker/profileDonde se pueden ajustar las banderas de daemon)
nathanleclaire
fuente
Hola, acabo de sugerir una edición a tu respuesta. ¿Quería especificar la imagen de busybox en los comandos de la segunda, tercera y cuarta ejecución? Sin hacerlo, Docker intenta descargar imágenes llamadas "sh" y "cat", que sospecho que no es lo que pretendías. Agregaré un ejemplo erróneo arriba.
Gerry
Gracias por tu ayuda. Tanto tú como @ mc0e ayudaron con este, así que te di la marca y a él la recompensa (así como un +1 para ambos). Espero que consideres esto justo.
Gerry
1
Ah sí, mal escrito. Lo siento por el error tipográfico.
nathanleclaire
No se necesitan disculpas. Solo estaba revisando dos veces para asegurarme de que no había entendido mal. Saludos por toda su ayuda con esto.
Gerry
6

No uso boot2docker, pero si / data se borra al reiniciar, ahí es donde se almacena su volumen ( docker run -v /data:/var/lib/mysql), por lo que se perderá.

Lo que está haciendo también es combinar dos patrones diferentes para manejar la persistencia del volumen. Para obtener persistencia, los contenedores pueden montar volúmenes desde una ubicación específica en el sistema host (que se supone que es persistente), o pueden asociarse con un contenedor de datos y montarse con ellos --volumes-from. Parece que el enfoque del sistema de archivos del host no es apropiado para boot2docker, y debe usar el patrón de volumen de datos (solo).

Presumiblemente, debería crear su contenedor de datos con -v /var/lib/mysql, en lugar de -v /data:/var/lib/mysql.

mc0e
fuente
Sin embargo, crear un volumen usando el indicador -v y luego usar volúmenes de ese contenedor en otros contenedores usando --volumes-from es exactamente lo que muestra la documentación: docs.docker.com/userguide/dockervolumes/… Esperaría que si -v / location sabe que debería ser relativo a / var / lib / docker / volume y luego agregar dos puntos no debería cambiar eso. Por lo menos esto no es intuitivo. -v / var / lib / mysql! = -v / var / lib / mysql: / var / lib / mysql También parece que los documentos de mysql-docker deberían actualizarse: hub.docker.com/_/mysql/#caveats
Gerry
Gracias por tu ayuda. Tanto usted como @nathanleclaire ayudaron con este, así que le di la recompensa (ya que vale más) y le di la marca a nathanleclaire (así como un +1 para ambos). Espero que pienses que esto es justo.
Gerry
@Gerry Ciertamente se recomienda crear un volumen y luego usarlo a través de --volumes-from. El montaje de los datos efímeros / en su contenedor no lo es.
mc0e
Sí, el problema es que no sabía / los datos eran efímeros hasta que reinicié.
Gerry
0

Tenga en cuenta que estoy usando docker para mac beta que está usando xhyve vm.

El contenido de / var / lib / boot2docker se conservará entre los reinicios de la máquina. Entonces, si desea que ciertos archivos estén disponibles en su máquina virtual, colóquelos en este directorio.

Si desea que se pueda acceder a ellos en una ubicación diferente para ejecutar contenedores docker, puede agregar lo siguiente a / var / lib / boot2docker / profile:

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

Si desea agregar otra configuración a los archivos del sistema que persistirá entre los reinicios de VM, como valores adicionales en su archivo de hosts, puede agregar un comando como el siguiente a / var / lib / boot2docker / profile:

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

Espero eso ayude

baoluofu
fuente