Docker mount volume to running container

Introduction

Docker volumes are widely used and useful tools for ensuring data persistence while working in containers. They are a better alternative than compiling additional writable layers, which increase Docker image size.

In this tutorial, learn how to use Docker Volumes with practical examples.

What are Docker Volumes?

Docker volumes are file systems mounted on Docker containers to preserve data generated by the running container.

The volumes are stored on the host, independent of the container life cycle. This allows users to back up data and share file systems between containers easily.

Getting Started With Docker Volumes

There are different ways to mount a Docker volume while launching a container. Users can decide between the -v and the --mount flags, which are added to the docker run command.

This article shows examples of both flags in use.

How to Create a Docker Volume

To create a Docker Volume use the command:

docker volume create [volume_name]

Docker automatically creates a directory for the volume on the host under the /var/lib/docker/volume/ path. You can now mount this volume on a container, ensuring data persistence and data sharing among multiple containers.

For example, to create a volume under the name data, you would run the command:

docker volume create data

List Docker Volumes

To verify you have successfully created a Docker volume, prompt Docker to list all available volumes with:

docker volume list

The output displays a list of volumes, specifying their location [DRIVER] and their VOLUME NAME. In the image below, you can see the volume data created in the previous section.

Inspecting Docker Volumes

To see more information about a Docker volume, use the inspect command:

docker volume inspect [volume_name]

It lists details of a volume, including its location on the host file [Mountpoint]. Everything stored within the data volume can also be found in the directory listed under the mountpoint path.

Mounting a Data Volume

To mount a data volume to a container add the --mount flag to the docker run command. It adds the volume to the specified container, where it stores the data produced inside the virtual environment.

To run a container and mount a data volume to it, follow the basic syntax:

docker run --mount source=[volume_name],destination=[path_in_container] [docker_image]

Replace [path_in_container] with the path where you want to place the data volume in the container. Everything stored in that directory automatically gets saved on the data volume on the host as well.

For example, to launch an Ubuntu container and mount the data volume to it, run:

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

The command instructs Docker to run a container in interactive mode [-it] from the Ubuntu image, under the name example1, while mounting the volume data in the /data directory inside the container.

Then, check to verify the volume was successfully mounted by listing the content of the container:

ls

Find the Docker volume under the name defined while launching the container. In this example, it is data.

Copying Files Between Containers From a Shared Volume

Let’s see how Docker volumes allow you to share files between containers.

To do so, we use the volume and container created in the previous section. This included running the commands:

  • docker volume create data
  • docker run -it --name=example1 --mount source=data,destination=/data ubuntu

1. Once you have switched to the container command prompt, move to the data volume directory:

cd data

2. Create an empty sample file using the touch command:

touch sample1.txt

3. Now, exit the container:

exit

4. Then, launch a new container example2 with the same data volume:

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

5. List the content of the container. You should find the data directory, as in example1:

ls

6. Move to the data directory and list the content of it:

cd data
ls

The output should list the sample1.txt file you created in the previous container [example1].

Mounting a Host Directory as a Data volume

You can also mount an existing directory from the host machine to a container. This type of volume is called Host Volumes.

You can mount host volumes by using the -v flag and specifying the name of the host directory.

Everything within the host directory is then available in the container. What’s more, all the data generated inside the container and placed in the data volume is safely stored on the host directory.

The basic syntax for mounting a host directory is:

docker run -v "$[pwd]":[volume_name] [docker_image]

The "$[pwd]" attribute instructs Docker to mount the directory the user is currently in.

The following example outlines how this is done.

1. First, create a sample directory on the host under the name tmp and move into it:

mkdir tmp
cd tmp

2. Once inside the directory, create a test file to see whether it will be available from the container:

touch file.txt

2. Then, use the docker run command to launch an Ubuntu container with the host directory attached to it:

docker run -it -v "$[pwd]":/data1 ubuntu

This launches the container in interactive mode and mounts a volume under the name data1.

3. List the content of the container and verify there is a data1 directory:

ls

4. Open the mounted directory and list the content. The output should display the file you created on the host:

cd data1
ls

Volume Permission and Ownership

Volume permissions van be changed by configuring the ownership within the Dockerfile.

Use the RUN instruction and the chown command to set the Docker volume permission. Make sure this instruction precedes the line defining the VOLUME.

Alternatively, you can change the ownership of the directory used as the host volume.

For instructions on how to use the chown command, refer to Linux File Permission Tutorial: How To Check And Change Permissions.

To delete a Docker volume, you need to specify its name.

The basic syntax for removing a Docker volume in the command line is:

docker volume rm [volume_name]

Docker removes volumes only if they are not in use at the moment. If there is a container with the specified volume, it responds with an error. To proceed, stop and remove the container and then rerun the docker volume rm command.

Note: If you don’t know the name of the volume, use the docker volume ls command.

How to Delete All Volumes at Once

To delete all unused Docker volumes with a single command:

docker volume prune

The output warns you it will remove all local volumes not used by at least one container. Press y to continue.

Conclusion

After reading this article, you should have a better understanding of how Docker volumes work, as well as how to mount volumes to containers.

Can we create volume in existing container?

You can commit your existing container [that is create a new image from container's changes] and then run it with your new mounts. If it's all OK, stop your old container, and use this new one.

Can a docker volume be mounted to multiple containers?

Yes you can add same location as a volume to many docker containers. Additionally you can use --volumes-from to mount your log directory in one container not actually running any application and then use the volumes from this container in your other containers without having to repeat the paths everywhere.

Which docker command is used to attach to a running container?

Use docker attach to attach your terminal's standard input, output, and error [or any combination of the three] to a running container using the container's ID or name. This allows you to view its ongoing output or to control it interactively, as though the commands were running directly in your terminal.

Chủ Đề