docker run -v <host_path>:<container_path>[:<options>] <image>
docker run -v <volume_name>:<container_path> <image>
example
docker run -v ./src:/app/src myapp:1.0docker run -v pgdata:/var/lib/postgresql/data postgres:16docker run -v ./config.json:/app/config.json:ro myapp:1.0
Note Host paths starting with ./ or / create bind mounts. A plain name like pgdata creates or reuses a named volume. Append :ro for read-only. If the host path does not exist, Docker creates it as a directory (not a file), which often causes surprises.
Note Named volumes declared in the top-level volumes: key persist across restarts and compose down. Bind mounts (host paths) are useful for development but should not be used for database storage in production.
docker volume create <name>
docker run -v <name>:<container_path> <image>
example
docker volume create pgdata
docker run -d -v pgdata:/var/lib/postgresql/data postgres:16
output
pgdata
Note Named volumes are managed by Docker and stored under /var/lib/docker/volumes/ on Linux. They persist independently of containers and survive docker rm. This is the recommended way to persist database data.