¿Cómo manejan las personas el almacenamiento persistente de sus contenedores Docker?
Actualmente estoy usando este enfoque: compile la imagen, por ejemplo, para PostgreSQL, y luego inicie el contenedor con
docker run --volumes-from c0dbc34fd631 -d app_name/postgres
En mi humilde opinión, eso tiene el inconveniente de que nunca (por accidente) debo eliminar el contenedor "c0dbc34fd631".
Otra idea sería montar los volúmenes de host "-v" en el contenedor, sin embargo, el ID de usuario dentro del contenedor no coincide necesariamente con el ID de usuario del host, y luego los permisos pueden estar en mal estado.
Nota: en lugar de --volumes-from 'cryptic_id'
, también puede usar --volumes-from my-data-container
where my-data-container
es un nombre que asignó a un contenedor de solo datos, por ejemplo docker run --name my-data-container ...
(consulte la respuesta aceptada)
fuente
--name
. tienes-name
Respuestas:
Docker 1.9.0 y superior
Usar volumen API
Esto significa que el patrón de contenedor de solo datos debe abandonarse en favor de los nuevos volúmenes.
En realidad, la API de volumen es solo una mejor manera de lograr lo que era el patrón del contenedor de datos.
Si crea un contenedor con un
-v volume_name:/container/fs/path
Docker, creará automáticamente un volumen con nombre para usted que puede:docker volume ls
docker volume inspect volume_name
--volumes-from
conexiónLa nueva API de volumen agrega un comando útil que le permite identificar volúmenes colgantes:
Y luego eliminarlo a través de su nombre:
Como @mpugach subraya en los comentarios, puedes deshacerte de todos los volúmenes colgantes con una buena frase:
Docker 1.8.xy debajo
El enfoque que parece funcionar mejor para la producción es utilizar un contenedor de solo datos .
El contenedor de solo datos se ejecuta en una imagen básica y, en realidad, no hace nada excepto exponer un volumen de datos.
Luego puede ejecutar cualquier otro contenedor para tener acceso a los volúmenes del contenedor de datos:
En esta publicación de blog hay una buena descripción del llamado contenedor como patrón de volumen que aclara el punto principal de tener contenedores de datos solamente .
La documentación de Docker tiene ahora la descripción DEFINITIVA del contenedor como patrón de volumen / s .
El siguiente es el procedimiento de copia de seguridad / restauración para Docker 1.8.xy a continuación.
APOYO:
RESTAURAR:
Aquí hay un buen artículo del excelente Brian Goff que explica por qué es bueno usar la misma imagen para un contenedor y un contenedor de datos.
fuente
--volumes-from
le permite compartir espacio en disco, le--link
permite compartir servicios.docker volume create --name mydata
) es preferible a un contenedor de volumen de datos. La gente de Docker sugiere que los Contenedores de Volumen de Datos " ya no se consideran un patrón recomendado ", "los volúmenes con nombre deberían poder reemplazar los volúmenes de solo datos en la mayoría (si no todos) los casos " y " no hay razón para que pueda usar contenedores de solo datos ".En Docker versión v1.0 , el comando dado puede vincular el montaje de un archivo o directorio en la máquina host:
El volumen anterior podría usarse como un almacenamiento persistente en el host que ejecuta Docker.
fuente
A partir de Docker Compose 1.6, ahora hay soporte mejorado para volúmenes de datos en Docker Compose. El siguiente archivo de composición creará una imagen de datos que persistirá entre los reinicios (o incluso la eliminación) de los contenedores principales:
Aquí está el anuncio del blog: Compose 1.6: Nuevo archivo Compose para definir redes y volúmenes
Aquí hay un ejemplo de archivo de composición:
Hasta donde puedo entender: Esto creará un contenedor de volumen de datos (
db_data
) que persistirá entre reinicios.Si ejecuta:
docker volume ls
debería ver su volumen en la lista:Puede obtener más detalles sobre el volumen de datos:
Algunas pruebas:
Notas:
También puede especificar varios controladores en el
volumes
bloque. Por ejemplo, puede especificar el controlador Flocker para db_data:Descargo de responsabilidad: este enfoque es prometedor, y lo estoy usando con éxito en un entorno de desarrollo. ¡Todavía estaría preocupado por usar esto en producción!
fuente
En caso de que no esté claro en la actualización 5 de la respuesta seleccionada, a partir de Docker 1.9, puede crear volúmenes que puedan existir sin estar asociados con un contenedor específico, por lo que el patrón "contenedor de solo datos" queda obsoleto.
¿Ver contenedores de datos obsoletos con Docker 1.9.0? # 17798 .
Creo que los mantenedores de Docker se dieron cuenta de que el patrón del contenedor de solo datos era un poco un olor a diseño y decidieron hacer de los volúmenes una entidad separada que pueda existir sin un contenedor asociado.
fuente
Si bien esto sigue siendo parte de Docker que necesita algo de trabajo , debe colocar el volumen en el Dockerfile con la instrucción VOLUME para que no necesite copiar los volúmenes de otro contenedor.
Eso hará que sus contenedores sean menos interdependientes y no tenga que preocuparse por la eliminación de un contenedor que afecte a otro.
fuente
docker rm
)Cuando use Docker Compose , simplemente adjunte un volumen con nombre, por ejemplo:
fuente
La respuesta de @ tommasop es buena y explica algunas de las mecánicas del uso de contenedores de solo datos. Pero como alguien que inicialmente pensó que los contenedores de datos eran tontos cuando uno podía enlazar, montar un volumen en el host (como lo sugieren varias otras respuestas), pero ahora se da cuenta de que, de hecho, los contenedores solo de datos son bastante limpios, puedo sugerir mi propio publicación de blog sobre este tema: ¿Por qué los contenedores de datos de Docker (volúmenes) son buenos?
Ver también: mi respuesta a la pregunta " ¿Cuál es la (mejor) forma de administrar los permisos para los volúmenes compartidos de Docker? " Para ver un ejemplo de cómo usar contenedores de datos para evitar problemas como permisos y mapeo uid / gid con el host.
Para abordar una de las preocupaciones originales del OP: que el contenedor de datos no debe eliminarse. Incluso si se elimina el contenedor de datos, los datos en sí no se perderán siempre que cualquier contenedor tenga una referencia a ese volumen, es decir, cualquier contenedor que haya montado el volumen a través de
--volumes-from
. Por lo tanto, a menos que se detengan y eliminen todos los contenedores relacionados (uno podría considerar esto como el equivalente de un accidenterm -fr /
), los datos están seguros. Siempre puede volver a crear el contenedor de datos haciendo--volumes-from
cualquier contenedor que tenga una referencia a ese volumen.¡Como siempre, haga copias de seguridad!
ACTUALIZACIÓN: Docker ahora tiene volúmenes que se pueden administrar independientemente de los contenedores, lo que hace que sea más fácil de administrar.
fuente
Existen varios niveles de administración de datos persistentes, según sus necesidades:
-v host-path:container-path
para conservar los datos del directorio del contenedor en un directorio del host.--volumes-from
para montar esos datos en el contenedor de su aplicación.fuente
Si desea mover sus volúmenes, también debe mirar Flocker .
Desde el archivo Léame:
fuente
Depende de su escenario (esto no es realmente adecuado para un entorno de producción), pero aquí hay una manera:
Crear un contenedor Docker de MySQL
Lo esencial es usar un directorio en su host para la persistencia de datos.
fuente
Recientemente escribí sobre una posible solución y una aplicación que demuestra la técnica. Me parece bastante eficiente durante el desarrollo y la producción. Espero que ayude o provoque algunas ideas.
Repo: https://github.com/LevInteractive/docker-nodejs-example
Artículo: http://lev-interactive.com/2015/03/30/docker-load-balanced-mongodb-persistence/
fuente
Solo estoy usando un directorio predefinido en el host para conservar los datos para PostgreSQL. Además, de esta manera es posible migrar fácilmente las instalaciones existentes de PostgreSQL a los contenedores Docker: https://crondev.com/persistent-postgresql-inside-docker/
fuente
Mi solución es usar el nuevo
docker cp
, que ahora puede copiar datos de los contenedores, sin importar si se está ejecutando o no, y compartir un volumen de host en la misma ubicación exacta donde la aplicación de base de datos está creando sus archivos de base de datos dentro del contenedor . Esta solución doble funciona sin un contenedor de solo datos, directamente desde el contenedor de la base de datos original.Entonces, mi script de inicio systemd está tomando el trabajo de hacer una copia de seguridad de la base de datos en un archivo en el host. Coloqué una marca de tiempo en el nombre del archivo para nunca reescribir un archivo.
Lo está haciendo en ExecStartPre:
Y también está haciendo lo mismo en ExecStopPost:
Además, expuse una carpeta del host como volumen a la misma ubicación exacta donde se almacena la base de datos:
Funciona muy bien en mi VM (estoy construyendo una pila LEMP para mí): https://github.com/DJviolin/LEMP
Pero no sé si es una solución "a prueba de balas" cuando su vida realmente depende de ello (por ejemplo, una tienda web con transacciones en cualquier milisegundo posible).
A los 20 minutos y 20 segundos de este video oficial de Docker, el presentador hace lo mismo con la base de datos:
Comenzando con Docker
fuente
Utilice el reclamo de volumen persistente (PVC) de Kubernetes, que es una herramienta de programación y administración de contenedores Docker:
Volúmenes persistentes
Las ventajas de usar Kubernetes para este propósito son que:
fuente