Blob storage is an object store to store vast amounts of unstructured data, blob storage is an option. It uses a flat namespace to store the data. The blob storage can have multiple containers and each container contains the blob objects/data.
Suppose, there is a requirement to mount to the blob storage container to access the data from the docker container. Now, since the blob storage is not an actual file system so there is a need for a middleware that can help to mount the object/blob storage as the file system. And in this case, the middleware that we are going to use is Blobfuse (v1). However, the blob storage also supports NFS 3.0 protocol but for the purpose of this article, we will not use it.
BlobFuse is a virtual file system driver for Azure Blob storage. BlobFuse allows you to access your existing block blob data in your storage account through the Linux file system. BlobFuse uses the virtual directory scheme with the forward-slash ‘/’ as a delimiter.
For the purpose of this article, we build the flask application and bundle it as a docker container. The purpose of the flask app is to load the images (icons) stored in the Blob Storage. Hence, we will mount the Blob Storage on the Ubuntu filesystem and subsequently, bind the mount with the container as a part of volumes.
Hands-On
Create blob storage & upload files
Go to Azure Portal
→ search for Storage Accounts
→ Create the Blob storage account as below.
Post creating the Azure Blob Storage, go to that resource → click Containers
under Data storage
→ click + Container
and fill in the required details and click on Create
As mentioned above, upload the images within the container. I have uploaded a couple of images.
Launch Virtual Machine
Search for Virtual Machines
on Azure Portal
and create Azure Virtual Machine
Click on Networking
to open port 8000
. Click on Add inbound port rule
and open port 8000. Its because the flask application will be running on port 8000.
As a next step, connect to VM via Visual Studio Code since we are going to write some code and docker config files. But you can also SSH into the instance for the same.
After a successful remote connection, execute the below commands to setup docker.
sudo apt-get update
sudo apt-get install docker-compose
Setup Blobfuse
To install Blobfuse, add the Microsoft package repository by executing the below commands
wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
sudo apt-get update
rm -r packages-microsoft-prod.deb
Install blobfuse
sudo apt-get install blobfuse
Authorize blobfuse to access storage by creating the config file and adding accountName
, accountKey
& containerName
in the config file
touch /home/ubuntu/fuse_connection.cfg
accountName containerblobstorage
accountKey storageaccesskey
containerName icons
Get the Access key from Access keys
under Security + networking
and copy the Key
For more information about the setup check here
Create a temp mount path & mount folder
Execute the below command to create both
sudo mkdir -p /mnt/resource/blobfusetmp
sudo mkdir -p /mnt/containermnt
Post mount path/folder creation, execute the below command to mount the blob storage on the Ubuntu system
sudo blobfuse /mnt/containermnt --tmp-path=/mnt/resource/blobfusetmp --config-file=/home/ubuntu/fuse_connection.cfg
/mnt/containermnt
is where the blob storage is mounted
If the command is successful, you can execute ls /mnt/containermnt
to test if the mount is successful.
Note: If the VM is rebooted, then the storage will unmount and it needs to be mounted manually
Deploy the application
Now, it is time to write some code. Go ahead and create a directory in your VM and copy the code from here
The directory structure looks as follows
app.py
contain the flask code which will render display.py
from the templates
directory. display.py
will load all the images from static/images
folder. The requirements.txt
contains the information about the python packages to be installed.
We will mount the /mnt/containermnt
on static/images
folder via docker-compose.yml
file. Dockerfile
contains all the definitions/commands to create an image
Within docker-compose.yml
the flaskapp_sevice is defined. Port 8000
is exposed to the host, for accessing the application via the public IP address of the Virtual Machine. /mnt/containermnt
is mapped to the static/images
directory in the container
version: '3'
services:
flaskapp_service:
container_name: flaskapp
build:
context: ./
dockerfile: Dockerfile
ports:
- "8000:8000"
volumes:
- /mnt/containermnt:/project/flaskapp/static/images
Finally, execute the below command to build the image and run the container.
sudo docker-compose up --build -d
Once, the container is up and running copy the public IPv4 address of the virtual machine and open a new tab in the browser & navigate to http://yourpublicip:8000
This is how the output looks like in my case
Here, we have successfully mounted the blob storage on the docker container and the flask application is able to load the data from there.
I hope this is helpful and can cater to the number of use cases.
References: