Bind Volumes: How Map folders in your Docker host to your container
First lets create folder in our docker host
root@master:~# mkdir mysql root@master:~# ls index.html mysql snap
Map the new folder to the folder in the container
root@master:~# docker run -d -v /mnt/mysql:/var/lib/mysql --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql
Now, Lets enter to the container and create new database.
root@master:~# docker exec -it some-mysql bash root@43bbea76beca:/# mysql -u root -pmy-secret-pw mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \\g. Your MySQL connection id is 8 Server version: 8.0.22 MySQL Community Server - GPL Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.01 sec) mysql> create database docker_db; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | docker_db | | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> exit root@43bbea76beca:/# exit exit
Now lets delete the container.
root@master:~# docker rm -f some-mysql
Make sure that you have some data in our new folder in the docker host.
root@master:~# ls /mnt/mysql/ auto.cnf ca-key.pem docker_db ibdata1 '#innodb_temp' private_key.pem sys binlog.000001 ca.pem '#ib_16384_0.dblwr' ib_logfile0 mysql public_key.pem undo_001 binlog.000002 client-cert.pem '#ib_16384_1.dblwr' ib_logfile1 mysql.ibd server-cert.pem undo_002 binlog.index client-key.pem ib_buffer_pool ibtmp1 performance_schema server-key.pem
Lets restore our information in a new brand MySQL container, basically we using the same command as before.
root@master:~# docker run -d -v /mnt/mysql:/var/lib/mysql --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql
Lets enter to our new container and check that we can see our new docker_db database.
root@master:~# docker exec -ti some-mysql bash root@814f0801e5d4:/# mysql -u root -pmy-secret-pw mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \\g. Your MySQL connection id is 8 Server version: 8.0.22 MySQL Community Server - GPL Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | docker_db | | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql>
Normal Volume – Manage by docker
How to create a Normal Volume:
- Important to know Normal volume created in the Docker Root Directory
root@master:~# docker volume create mysql_volume mysql_volume
How to find Normal volume:
Long way….
root@master:~# docker info | grep -i root WARNING: No swap limit support Docker Root Dir: /var/lib/docker root@master:~# cd /var/lib/docker/ root@master:/var/lib/docker# ls builder buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes root@master:/var/lib/docker# ls volumes/ mysql_volume
Short way…
root@master:/var/lib/docker# docker volume ls DRIVER VOLUME NAME local mysql_volume
Lets create new MySQL container:
root@master:/var/lib/docker# docker run -d -v mysql_volume:/var/lib/mysql --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql
Now we can see all the data in our new docker volume.
root@master:/var/lib/docker/volumes/mysql_volume/_data# ls auto.cnf ca-key.pem '#ib_16384_0.dblwr' ib_logfile0 mysql public_key.pem undo_001 binlog.000001 ca.pem '#ib_16384_1.dblwr' ib_logfile1 mysql.ibd server-cert.pem undo_002 binlog.000002 client-cert.pem ib_buffer_pool ibtmp1 performance_schema server-key.pem binlog.index client-key.pem ibdata1 '#innodb_temp' private_key.pem sys
Anonymous Volumes: Be Careful when you use them (Not Recommended)
Lets create MySQL container this time with the tag -v we don’t specify any mapping to the Docker Host.
root@master:~# docker run -d -v /var/lib/mysql --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql
To find where docker create the Anonymous volume we use this command
root@master:~# docker inspect some-mysql
Under mounts we can find what the name of the volume
In this output we can see the mapping and the location of the volume to the container folder.
- Volume name “060239d0072093a4a2e984467751e163f197a0e40b57299a62ef17e83798815b”,
- Volume location “/var/lib/docker/volumes/”
"Mounts": [ { "Type": "volume", "Name": "060239d0072093a4a2e984467751e163f197a0e40b57299a62ef17e83798815b", "Source": "/var/lib/docker/volumes/060239d0072093a4a2e984467751e163f197a0e40b57299a62ef17e83798815b/_data", "Destination": "/var/lib/mysql", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ],
If we will go the Volume Location folder we can find all MySQL data in the container in our docker root directory.
root@master:~# cd /var/lib/docker/volumes/060239d0072093a4a2e984467751e163f197a0e40b57299a62ef17e83798815b/_data root@master:/var/lib/docker/volumes/060239d0072093a4a2e984467751e163f197a0e40b57299a62ef17e83798815b/_data# ls auto.cnf ca-key.pem '#ib_16384_0.dblwr' ib_logfile0 mysql public_key.pem undo_001 binlog.000001 ca.pem '#ib_16384_1.dblwr' ib_logfile1 mysql.ibd server-cert.pem undo_002 binlog.000002 client-cert.pem ib_buffer_pool ibtmp1 performance_schema server-key.pem binlog.index client-key.pem ibdata1 '#innodb_temp' private_key.pem sys
Important to know.
- The Anonymous Volumes can be removed when you delete the container if you using this flag -v.
root@master:# docker rm -fv some-mysql root@master:~# cd /var/lib/docker/volumes/060239d0072093a4a2e984467751e163f197a0e40b57299a62ef17e83798815b/_data -bash: cd: /var/lib/docker/volumes/060239d0072093a4a2e984467751e163f197a0e40b57299a62ef17e83798815b/_data: No such file or directory
Remove Dangling volumes (volumes that are not in use with any container)
root@master:~# docker volume rm $(docker volume ls -f=dangling=true -q)