Docker Volumes and Bind Mounts Explained Tutorial

Docker Volumes and Bind Mounts Explained Tutorial. In this post, we will introduce Docker volumes, bind mounts then show you how to manage and mount Docker Volumes.

Docker volumes and binding mounts allows you to store and exchange data in containers. They are like local volumes, but also work with Docker containers. Docker is a used containerization solution that provides an intuitive interface. This allows you to deploy your application as a lightweight process set rather than a full virtual machine.

So the Docker images are like a snapshot of a container’s file system and contain both your application and its dependencies. When you run it, it recreates the state of the container.

You don’t have to worry about setting up your environment, as running an image recreates everything for you. It is isolated from your operating system and other running containers.

So with Docker volumes it allows you to mount volumes into containers so that they persist between restarts.

Let’s continue reading Docker Volumes and Bind Mounts Explained Tutorial.

What is Docker Volume?

Docker volumes are useful tool for providing data persistence when working in containers.

What are they? They are file systems mount on docker containers to hold the data generated by the active container.

Volumes have in built sharing functionality, which allows you to share files across your applications without having them stored on the same machine.

You can think of a volume as a hard drive in your computer where you store files that you want to keep safe from deletion by accident or by removing from their current location.

When you create a new container, it will always have its own copy of all its files, but if any of those files change, they will update within the container instead of being written to another location.

This means that when using Docker volumes to share files between many containers, you should not use them as your only method for transferring data between containers. Why? because they do not support this type of sharing.

Primarily Docker volume provides an easier way to store data and move them from one container to another. It’s like how you can share files across your computers using Samba, or Dropbox on your phone.

When the container no longer exists, the data is not preserved and it can be challenging to extract the data from the container if another process needs it.

The writable level of a container is associated with the host machine on which the container runs. We can not move the data elsewhere. Writing to the writable level of a container requires a storage driver to manage the file system.

How Docker Store Files?

Worth knowing that Docker provides two options for containers to store files on the host machine so that the files persist even after the container is shut down:

  • We can store volumes in a part of the host file system.
  • Allows users to store bind mounts anywhere on the host system.

Regardless of the container’s lifecycle the volumes are put away on the host. This allows users to back up data and share file systems between containers.

Types of Volume Mount

1. Volume Mount

The easiest way to think about a volume is that it’s like a folder on your computer. A folder on your computer, for instance, we can store it in the same place as all your movies and books, so you can access them from anywhere.

A volume, in a similar way, we can store it in the same place as data that’s important to you. When we create a volume using Docker’s create volume command, it’s stored on the host filesystem managed by Docker (/var/lib/docker/volumes/ on Linux).

This means that if we want to save a file and access it later from anywhere else (like our home computer), we don’t have to worry about whether our file has been deleted when we log out of work!

Naming the volume it can named or leave as anonymous when we mount it. They both have different uses depending on what you want from your container or service!

2. Bind Mount

The terms “bind mount” and “constrained mount” may sound like they’re the same thing, but they’re not.

A file or folder on the host computer is mount in a container when we use a constrained mount. The full path of a file or directory is reference on the host computer.

If bind mount does not exist, you can create it on demand. Additionally bind mounts are very efficient, but they rely on the host machine’s filesystem, which has a specific directory structure.

If we want to develop new Docker applications, consider using named volumes instead of bind mounts. We cannot use Docker CLI commands to manage bind mounts.

3. tmpfsmounts

The tmpfs filesystem is a way of storing the data in the host system’s memory and not on the file system. This means that it does not need to write to disk as it is store in RAM.

It is possible to use tmpfs mounts with Docker containers, but this requires a little more explanation. When you build a container with Docker, you need to know which file systems each container should use. You can specify this via parameters like -v or –volume .

The default value for all filesystems except devicemapper (the default for devicemapper is tmpfs) is the host filesystem /dev/mmcblk0p1 on the Docker host itself (i.e., where your Docker daemon runs).

The reason why we don’t recommend using this option is that when you stop and start a container, it will still use that same filesystem – even if it has been replaced with another one!

So if you want to use tmpfs, you need to tell Docker that it should replace its default value for this parameter with an explicit value for your own purposes.

The most important thing about tmpfs is that it’s temporary – meaning that once the container stops running, everything.

4. Named Pipes

Named pipes are a way to send data from one container to another. This will allows us to run third party tools in containers and connecting them to the Docker Engine API through named pipes.

You can mount both bind mounts and volumes in containers using the -v or –volume flag, but the syntax is different for each.

Create and Manage Docker Volumes

In this section, we will show you how to create and manage docker volumes.

Create a Docker Volume

The basic syntax to create a docker volume is shown below:

				
					docker volume create <volume-name>
				
			

For example, to create a volume named myvolume, run the following command:

				
					docker volume create myvolume
				
			

The /var/lib/docker/volume/ directory is the default directory of all volumes. If the path does not exists, the above command will create it automatically.

List Docker Volumes

You can use the below command to list all created volumes:

				
					docker volume ls
				
			

You should see the created volume in the following output:

				
					DRIVER    VOLUME NAME
local     myvolume
				
			

To check the detail information about a Docker volume, use the following syntax:

				
					docker volume inspect <volume-name>
				
			

For example, run the following command to check the detail information of myvolume:

				
					docker volume inspect myvolume
				
			

You should see the volume information in the following output:

				
					[
    {
        "CreatedAt": "2022-08-05T17:34:31+05:30",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
        "Name": "myvolume",
        "Options": {},
        "Scope": "local"
    }
]
				
			

Mount a Docker Volume

In order to mount your created myvolume to a container, use the –add flag with the docker run command. This will adds the volume to the specified container and stores the data inside the virtual environment.

The basic syntax to create and mount a docker volume is shown below:

				
					docker run --mount source=<volume-name>,destination=<path-in-container> <docker-image>
				
			

A brief explanation of each flag is shown below:

  • –mount is a flag used to mount volumes inside the container.
  • source is the name of the Docker volume.
  • destination is the path of the folder in the container where you want to mount the volume.
  • docker-image is the name of the image used to create a container.

For example, to create a new ubuntu container and mount the myvolume to it, run the following command:

				
					docker run -it --name=ubuntu --mount source=myvolume,destination=/myvolume ubuntu
				
			

You will get in to the following shell:

				
					Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
d19f32bd9e41: Pull complete 
Digest: sha256:34fea4f31bf187bc915536831fd0afc9d214755bf700b5cdb1336c82516d154e
Status: Downloaded newer image for ubuntu:latest
root@cfeaf76dc644:/# 
				
			

You can now verify the mounted volume using the following command:

				
					mount | grep volume
				
			

You should see your mounted volume in the following output:

				
					/dev/sda4 on /myvolume type ext4 (rw,relatime,errors=remount-ro)
				
			

Remove a Docker Volume

You can use the below syntax to remove or delete a docker volume:

				
					docker volume rm <volume-name>
				
			

For example, to delete a myvolume, run the following command:

				
					docker volume rm myvolume
				
			

If you want to remove all unused volumes, run the following command:

				
					docker volume prune
				
			

You will need to confirm as shown below:

				
					WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
				
			

Well thank you for reading Docker Volumes and Bind Mounts Explained Tutorial.

Docker Volumes and Bind Mounts Explained Tutorial Conclusion

In this guide, we explained what is Docker volumes, its types and how to manage them via command line. In short,  to manage data in various application scenarios, we can use Docker volumes and bind mounts to solve them by means of the mount point. Now that you have a basic understanding of how this feature works, you should be able to use docker volumes and bind mounts more in your project.

Avatar for Hitesh Jethva
Hitesh Jethva

I am a fan of open source technology and have more than 10 years of experience working with Linux and Open Source technologies. I am one of the Linux technical writers for Cloud Infrastructure Services.

0 0 votes
Article Rating
Subscribe
Notify of
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x