# Persistir datos del contenedor





## Explicación

Cuando un contenedor se inicia, utiliza los archivos y la configuración proporcionados por la imagen. Cada contenedor puede crear, modificar y eliminar archivos, y lo hace sin afectar a ningún otro contenedor. Cuando el contenedor se elimina, estos cambios en los archivos también se eliminan.

Aunque esta naturaleza efímera de los contenedores es excelente, plantea un desafío cuando deseas persistir los datos. Por ejemplo, si reinicias un contenedor de base de datos, es probable que no quieras comenzar con una base de datos vacía. Entonces, ¿cómo se persisten los archivos?

### Volúmenes de contenedor

Los volúmenes son un mecanismo de almacenamiento que proporciona la capacidad de persistir datos más allá del ciclo de vida de un contenedor individual. Piensa en ello como proporcionar un acceso directo o un enlace simbólico (symlink) desde el interior del contenedor hacia el exterior.

Como ejemplo, imagina que creas un volumen llamado `log-data`.

```console
$ docker volume create log-data
```

Al iniciar un contenedor con el siguiente comando, el volumen se montará (o conectará) dentro del contenedor en `/logs`:

```console
$ docker run -d -p 80:80 -v log-data:/logs docker/welcome-to-docker
```

Si el volumen `log-data` no existe, Docker lo creará automáticamente por ti.

Cuando el contenedor se ejecuta, todos los archivos que escriba en la carpeta `/logs` se guardarán en este volumen, fuera del contenedor. Si eliminas el contenedor e inicias un nuevo contenedor utilizando el mismo volumen, los archivos seguirán allí.

> **Compartir archivos usando volúmenes**
>
> Puedes conectar el mismo volumen a múltiples contenedores para compartir archivos entre ellos. Esto puede ser útil en escenarios como la agregación de registros (logs), canalizaciones de datos (data pipelines) u otras aplicaciones basadas en eventos.

### Administrar volúmenes

Los volúmenes tienen su propio ciclo de vida más allá del de los contenedores y pueden crecer bastante según el tipo de datos y las aplicaciones que estés utilizando. Los siguientes comandos te serán útiles para administrar volúmenes:

- `docker volume ls` - enumera todos los volúmenes
- `docker volume rm <nombre-o-id-del-volumen>` - elimina un volumen (solo funciona cuando el volumen no está conectado a ningún contenedor)
- `docker volume prune` - elimina todos los volúmenes no utilizados (no conectados)

## Pruébalo

En esta guía, practicarás la creación y el uso de volúmenes para persistir datos creados por un contenedor de Postgres. Cuando la base de datos se ejecuta, almacena archivos en el directorio `/var/lib/postgresql`. Al conectar el volumen aquí, podrás reiniciar el contenedor varias veces manteniendo los datos.

### Usar volúmenes

1. [Descarga e instala](/get-started/get-docker/) Docker Desktop.

2. Inicia un contenedor utilizando la imagen de [Postgres](https://hub.docker.com/_/postgres) con el siguiente comando:

   ```console
   $ docker run --name=db -e POSTGRES_PASSWORD=secret -d -v postgres_data:/var/lib/postgresql postgres:18
   ```

   Esto iniciará la base de datos en segundo plano, la configurará con una contraseña y conectará un volumen al directorio donde PostgreSQL persistirá los archivos de la base de datos.

3. Conéctate a la base de datos utilizando el siguiente comando:

   ```console
   $ docker exec -ti db psql -U postgres
   ```

4. En la línea de comandos de PostgreSQL, ejecuta lo siguiente para crear una tabla de base de datos e insertar dos registros:

   ```text
   CREATE TABLE tasks (
       id SERIAL PRIMARY KEY,
       description VARCHAR(100)
   );
   INSERT INTO tasks (description) VALUES ('Finish work'), ('Have fun');
   ```

5. Verifica que los datos estén en la base de datos ejecutando lo siguiente en la línea de comandos de PostgreSQL:

   ```text
   SELECT * FROM tasks;
   ```

   Deberías obtener una salida que se parezca a la siguiente:

   ```text
    id | description
   ----+-------------
     1 | Finish work
     2 | Have fun
   (2 rows)
   ```

6. Sal de la terminal de PostgreSQL ejecutando el siguiente comando:

   ```console
   \q
   ```

7. Detén y elimina el contenedor de la base de datos. Recuerda que, aunque el contenedor haya sido eliminado, los datos se persisten en el volumen `postgres_data`.

   ```console
   $ docker stop db
   $ docker rm db
   ```

8. Inicia un nuevo contenedor ejecutando el siguiente comando, conectando el mismo volumen con los datos persistidos:

   ```console
   $ docker run --name=new-db -d -v postgres_data:/var/lib/postgresql postgres:18
   ```

   Es posible que hayas notado que se ha omitido la variable de entorno `POSTGRES_PASSWORD`. Esto se debe a que esa variable solo se utiliza al inicializar una nueva base de datos.

9. Verifica que la base de datos aún tenga los registros ejecutando el siguiente comando:

   ```console
   $ docker exec -ti new-db psql -U postgres -c "SELECT * FROM tasks"
   ```

### Ver el contenido del volumen

El Panel de Docker Desktop proporciona la capacidad de ver el contenido de cualquier volumen, así como la capacidad de exportar, importar, vaciar, eliminar y clonar volúmenes.

1. Abre el Panel de Docker Desktop y navega a la vista de **Volumes**. En esta vista, deberías ver el volumen **postgres_data**.

2. Selecciona el nombre del volumen **postgres_data**.

3. La pestaña **Stored Data** muestra el contenido del volumen y proporciona la capacidad de navegar por los archivos. La pestaña **Container in-use** muestra el nombre del contenedor que utiliza el volumen, el nombre de la imagen, el número de puerto utilizado por el contenedor y el destino (target). Un destino es una ruta dentro de un contenedor que da acceso a los archivos en el volumen. La pestaña **Exports** te permite exportar el volumen. Hacer doble clic en un archivo te permitirá ver su contenido y realizar cambios.

4. Haz clic derecho en cualquier archivo para guardarlo o eliminarlo.

### Eliminar volúmenes

Antes de eliminar un volumen, este no debe estar conectado a ningún contenedor. Si no has eliminado el contenedor anterior, hazlo con el siguiente comando (la opción `-f` detendrá el contenedor primero y luego lo eliminará):

```console
$ docker rm -f new-db
```

Existen algunos métodos para eliminar volúmenes, incluidos los siguientes:

- Selecciona la opción **Delete Volume** en un volumen en el Panel de Docker Desktop.
- Utiliza el comando `docker volume rm`:

  ```console
  $ docker volume rm postgres_data
  ```

- Utiliza el comando `docker volume prune` para eliminar todos los volúmenes no utilizados:

  ```console
  $ docker volume prune
  ```

## Recursos adicionales

Los siguientes recursos te ayudarán a aprender más sobre los volúmenes:

- [Administrar datos en Docker](/engine/storage)
- [Volúmenes](/engine/storage/volumes)
- [Montajes de volumen](/engine/containers/run/#volume-mounts)

## Siguientes pasos

Ahora que has aprendido sobre cómo persistir los datos del contenedor, es hora de aprender a compartir archivos locales con contenedores.

[Compartir archivos locales con contenedores](/get-started/docker-concepts/running-containers/persisting-container-data/sharing-local-files)


