Pregunta Cómo lidiar con el almacenamiento persistente (por ejemplo, bases de datos) en Docker


¿Cómo lidian las personas con el almacenamiento persistente para sus contenedores Docker?

Actualmente estoy usando este enfoque: construir la imagen, p. 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 debo (por accidente) eliminar el contenedor "c0dbc34fd631".

Otra idea sería montar volúmenes de host "-v" en el contenedor, sin embargo, el identidad de usuario dentro del contenedor no necesariamente coincide con el identidad de usuario del host, y luego los permisos podrían estar en mal estado.

Nota: en lugar de --volumes-from 'cryptic_id' también puedes usar --volumes-from my-data-container dónde my-data-container es un nombre que asignó a un contenedor de solo datos, p. docker run --name my-data-container ... (ver la respuesta aceptada)


837
2017-08-28 19:45


origen


Respuestas:


Docker 1.9.0 y superior

Utilizar volumen API

docker volume create --name hello
docker run -d -v hello:/container/path/for/volume container_image my_command

Esto significa que el modelo de contenedor de solo datos debe abandonarse a favor de los nuevos volúmenes.

En realidad, el volumen API es solo una mejor manera de lograr lo que era el patrón de 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 pueda:

  1. Ser listado a través del docker volume ls
  2. Ser identificado a través del docker volume inspect volume_name
  3. Respaldado como un directorio normal
  4. Respaldado como antes a través de un --volumes-from conexión

El nuevo volumen API agrega un útil comando que te permite identificar volúmenes colgantes:

docker volume ls -f dangling=true

Y luego eliminarlo a través de su nombre:

docker volume rm <volume name>

Como @mpugach subraya en los comentarios, puede deshacerse de todos los volúmenes colgantes con un buen trazo:

docker volume rm $(docker volume ls -f dangling=true -q)
# Or using 1.13.x
docker volume prune

Docker 1.8.xy por debajo

El enfoque que parece funcionar mejor para la producción es usar un solo contenedor de datos.

El contenedor de solo datos se ejecuta en una imagen barebone 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:

docker run --volumes-from data-container some-other-container command-to-execute
  • aquí puede obtener una buena idea de cómo organizar los diferentes contenedores.
  • aquí hay una buena idea de cómo funcionan los volúmenes.

En esta publicación en el blog hay una buena descripción de los llamados contenedor como patrón de volumen que aclara el punto principal de tener solo contenedores de datos.

La documentación de Docker tiene ahora la descripción DEFINITIVA de contenedor como volumen / s patrón.

A continuación se muestra el procedimiento de copia de seguridad / restauración para Docker 1.8.xy posterior.

APOYO:

sudo docker run --rm --volumes-from DATA -v $(pwd):/backup busybox tar cvf /backup/backup.tar /data
  • --rm: elimina el contenedor cuando sale
  • --volumes-from DATA: adjuntar a los volúmenes compartidos por el contenedor DATA
  • -v $ (pwd): / backup: bind monta el directorio actual en el contenedor; para escribir el archivo tar
  • busybox: una imagen pequeña y simple, buena para el mantenimiento rápido
  • tar cvf /backup/backup.tar / data: crea un archivo tar sin comprimir de todos los archivos en el directorio / data

RESTAURAR:

# Create a new data container
$ sudo docker run -v /data -name DATA2 busybox true
# untar the backup files into the new container᾿s data volume
$ sudo docker run --rm --volumes-from DATA2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
data/
data/sven.txt
# Compare to the original container
$ sudo docker run --rm --volumes-from DATA -v `pwd`:/backup busybox ls /data
sven.txt

Aquí hay un buen artículo del excelente Brian Goff explicando por qué es bueno usar la misma imagen para un contenedor y un contenedor de datos.


885
2017-12-18 07:50



En Docker versión v1.0, unir un montaje de un archivo o directorio en la máquina host se puede hacer con el comando dado:

$ docker run -v /host:/container ...

El volumen anterior podría usarse como un almacenamiento persistente en el host que ejecuta Docker.


58
2017-10-29 10:30



A partir de Docker Compose 1.6, ahora hay una compatibilidad mejorada para los 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 de composición para definir redes y volúmenes

Aquí hay un ejemplo de archivo de composición:

version: "2"

services:
  db:
    restart: on-failure:10
    image: postgres:9.4
    volumes:
      - "db-data:/var/lib/postgresql/data"
  web:
    restart: on-failure:10
    build: .
    command: gunicorn mypythonapp.wsgi:application -b :8000 --reload
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    links:
      - db

volumes:
  db-data:

Por lo que puedo entender: Esto creará un contenedor de volumen de datos (db_data) que persistirá entre reinicios.

Si tu corres: docker volume ls Debería ver su volumen en la lista:

local               mypthonapp_db-data
...

Puede obtener más detalles sobre el volumen de datos:

docker volume inspect mypthonapp_db-data
[
  {
    "Name": "mypthonapp_db-data",
    "Driver": "local",
    "Mountpoint": "/mnt/sda1/var/lib/docker/volumes/mypthonapp_db-data/_data"
  }
]

Algunas pruebas:

# Start the containers
docker-compose up -d

# .. input some data into the database
docker-compose run --rm web python manage.py migrate
docker-compose run --rm web python manage.py createsuperuser
...

# Stop and remove the containers:
docker-compose stop
docker-compose rm -f

# Start it back up again
docker-compose up -d

# Verify the data is still there
...
(it is)

# Stop and remove with the -v (volumes) tag:

docker-compose stop
docker=compose rm -f -v

# Up again ..
docker-compose up -d

# Check the data is still there:
...
(it is).

Notas:

  • También puede especificar varios controladores en volumes bloquear. Por ejemplo, puede especificar el controlador Flocker para db_data:

    volumes:
      db-data:
        driver: flocker
    
  • A medida que mejoran la integración entre Docker Swarm y Docker Compose (y posiblemente comiencen a integrar a Flocker en el ecosistema Docker (escuché el rumor de que Docker compró Flocker), creo que este enfoque debería ser cada vez más poderoso.

Renuncia: Este enfoque es prometedor y lo estoy usando con éxito en un entorno de desarrollo. ¡Me daría miedo utilizar esto en producción todavía!


23
2018-04-15 08:15



En caso de que no quede claro a partir de 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, lo que hace que el patrón "contenedor solo de datos" quede obsoleto.

Ver ¿Contenedores solo de datos obsoletos con docker 1.9.0? # 17798.

Creo que los mantenedores de Docker se dieron cuenta de que el patrón contenedor solo de datos era un poco olor a diseño y decidieron hacer de los volúmenes una entidad separada que puede existir sin un contenedor asociado.


15
2018-02-15 16:47



Si bien esto todavía es parte de Docker eso necesita un poco de trabajo, deberías poner el volumen en el archivo Docker con la instrucción VOLUME por lo que no necesita copiar los volúmenes de otro contenedor.

Eso hará que sus contenedores sean menos interdependientes y no tendrá que preocuparse por la eliminación de un contenedor que afecte a otro.


11
2017-09-12 19:10



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 solo podía unir un volumen al host (como lo sugirieron varias otras respuestas), pero ahora se da cuenta de que, de hecho, los contenedores de solo datos son bastante prolijos, puedo sugerir mi propio publicación de blog sobre este tema: ¿Por qué Docker Data Containers (Volumes!) Es bueno

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 los contenedores de datos para evitar problemas como permisos y la asignación de uid / gid con el host.

Para abordar una de las preocupaciones originales de OP: que el contenedor de datos no debe ser eliminado. Incluso si se elimina el contenedor de datos, los datos en sí mismos 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 él. --volumes-from. Entonces, a menos que todos los contenedores relacionados sean detenidos y eliminados (uno podría considerar esto como el equivalente de un accidente rm -fr /) la información es segura. Siempre puedes volver a crear el contenedor de datos haciendo --volumes-from cualquier contenedor que tenga una referencia a ese volumen.

Como siempre, ¡cree copias de seguridad!

ACTUALIZACIÓN: Docker ahora tiene volúmenes que se pueden gestionar independientemente de los contenedores, lo que hace que esto sea más fácil de administrar.


8
2017-11-21 15:32



Cuando utilice Docker Compose, simplemente adjunte un volumen con nombre, por ejemplo,

version: '2'
services:
  db:
    image: mysql:5.6
    volumes:
      - db_data:/var/lib/mysql:rw
    environment:
      MYSQL_ROOT_PASSWORD: root
volumes:
  db_data:

8
2018-01-31 09:27



Si desea mover sus volúmenes, también debe mirar Flocker.

Del LÉAME:

Flocker es un administrador de volúmenes de datos y una herramienta de administración de clústeres Docker de múltiples hosts. Con él puede controlar sus datos utilizando las mismas herramientas que utiliza para sus aplicaciones sin estado al aprovechar la potencia de ZFS en Linux.

Esto significa que puede ejecutar sus bases de datos, colas y almacenes de clave-valor en Docker y moverlos tan fácilmente como el resto de su aplicación.


7
2018-04-02 11:58