Docker Tip #28: Named Volumes vs Path Based Volumes
There's a couple of ways to save and sync data between a container and your Docker host. Let's compare 2 of them.
Named volumes look like this
postgres:/var/lib/postgresql/data. If you’re using Docker Compose, it will automatically create the volume for you when you first do a
docker-compose up, but if not you would need to create it yourself by running
docker volume create postgres.
The name doesn’t need to be postgres, but it’s a best practice to name your volumes so you know what they refer to later. You can prefix them with your project’s name to avoid name conflicts.
When you use a volume like this, Docker will manage the volume for you. On Linux, that volume will get saved to
/var/lib/docker/volumes/postgres/_data. If you’re running Windows or MacOS it will get saved somewhere else, but the moral of the story is, you don’t need to worry about it. You can set it and forget it, and it will work across all systems.
Path based volumes serve the same purpose as named volumes, except you’re responsible for managing where the volume gets saved on the Docker host. For example if you did
./postgres:/var/lib/postgresql/data then a
postgres/ directory would get created in the current directory on the Docker host.
If you go this route you’ll notice that the permissions will be the same as what they are set to in your
Dockerfile or what you set with the
--user flag when running the container. If you did none of that then the contents of that folder will be owned by root.
Which One Should You Use?
Back before named volumes existed, it was always a question on where you should store these volumes. Some people put them in a
data/ folder relative to your project. Other people put them in
~/.docker-volumes and this quickly got weird because now you’re writing volumes out to areas of your host’s file system that are unrelated to the project.
My rule of thumb is, if you’re dealing with data that you’re not actively dealing with directly then use a named volume and let Docker manage it.
However, if you’re using a volume in development and you want to mount in the current directory so you can code your project without rebuilding then by all means use a path based volume because that’s 100% normal and is considered a best practice. For example, you may see that referenced as
.:/app in a