Además de definir los services
, en el fichero docker-compose.yaml
podemos definir los volúmenes que vamos a necesitar en nuestra infraestructura. Además, como hemos visto, podremos indicar que volumen va a utilizar cada contenedor.
Veamos un ejemplo:
version: '3.1'
services:
db:
container_name: contenedor_mariadb
image: mariadb
restart: always
environment:
MYSQL_ROOT_PASSWORD: asdasd
volumes:
- mariadb_data:/var/lib/mysql
volumes:
mariadb_data:
Y podemos iniciar el escenario:
$ docker compose up -d
[+] Running 3/3
✔ Network mariadb_default Created 0.1s
✔ Volume "mariadb_mariadb_data" Created 0.0s
✔ Container contenedor_mariadb Started 0.5s
$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
contenedor_mariadb mariadb "docker-entrypoint.sh mariadbd" db About a minute ago Up About a minute 3306/tcp
Y comprobamos que se ha creado un nuevo volumen:
$ docker volume ls
DRIVER VOLUME NAME
local mariadb_mariadb_data
...
En la definición del servicio db
hemos indicado que el contenedor montará el volumen en un directorio determinado con el parámetro volumes
. Podemos comprobar que efectivamente se ha realizado el montaje:
$ docker inspect -f '{{json .Mounts}}' contenedor_mariadb
[{"Type":"volume","Name":"mariadb_mariadb_data","Source":"/var/lib/docker/volumes/mariadb_mariadb_data/_data","Destination":"/var/lib/mysql","Driver":"local","Mode":"z","RW":true,"Propagation":""}]
Recuerda que si necesitas iniciar el escenario desde 0, debes eliminar el volumen:
$ $ docker compose down -v
[+] Running 3/3
✔ Container contenedor_mariadb Removed 0.8s
✔ Volume mariadb_mariadb_data Removed 0.1s
✔ Network mariadb_default Removed 0.1s
De forma similar podemos indicar que un contenedor va a utilizar bind mount como almacenamiento. En este caso sería:
version: '3.1'
services:
db:
container_name: contenedor_mariadb
image: mariadb
restart: always
environment:
MYSQL_ROOT_PASSWORD: asdasd
volumes:
- ./data:/var/lib/mysql
Y después de iniciar el escenario podemos ver cómo se ha creado el directorio data
:
$ cd data/
/data$ ls
aria_log.00000001 aria_log_control ibdata1 ib_logfile0 ibtmp1 mysql
Hay que tener en cuenta que si usamos bind mount el comando docker compose down -v
no eliminará el directorio donde se guardan los datos, en este caso ./data
.