Search code examples
dockerdocker-composedocker-volumepersistent-storagepersistent-volumes

How does volume mount from container to host and vice versa work?


docker run -ti --rm -v DataVolume3:/var ubuntu

Lets say I have a volume DataVolume 3 which pulls the contents of /var in the ubuntu container even after killing this ubuntu container the volume remains and I can use this volume DataVolume3 to mount it to other containers. This means with the deletion of container the volume mounts are not deleted.
How does this work ?
Does that volume mount mean that it copies the contents of /var into some local directory because this does not look like a symbolic link ?
If I have the container running and I create a file in the container then the same file gets copied to the host path ?
How does this whole process of volume mount from container to host and host to container work ?


Solution

  • Volumes are used for persistent storage and the volumes persists independent of the lifecycle of the container.

    We can go through a demo to understand it clearly.

    First, let's create a container using the named volumes approach as:

    docker run -ti --rm -v DataVolume3:/var ubuntu
    

    This will create a docker volume named DataVolume3 and it can be viewed in the output of docker volume ls:

    docker volume ls
    DRIVER              VOLUME NAME
    local               DataVolume3
    

    Docker stores the information about these named volumes in the directory /var/lib/docker/volumes/ (*):

    ls /var/lib/docker/volumes/
    1617af4bce3a647a0b93ed980d64d97746878564b141f30b6110d0818bf32b76  DataVolume3 
    

    Next, let's write some data from the ubuntu container at the mounted path var:

    echo "hello" > var/file1
    root@2b67a89a0050:/# cat /var/file1
    hello
    

    We can see this data with cat even after deleting the container:

    cat /var/lib/docker/volumes/DataVolume3/_data/file1
    hello
    

    Note: Although, we are able to access the volumes like shown above but it not a recommended practice to access volumes data like this.

    Now, next time when another container uses the same volume then the data from the volume gets mounted at the container directory specified as part of -v flag.

    (*) The location may vary based on OS as pointed by David and probably can be seen by the docker volume inspect command.