Saturday, April 24, 2021

Docker Volumes - Deep Dive with Use Cases

Understanding  Docker Volumes in-depth with real-time scenarios. Where the MongoDB is the backend tier Database and frontend web application using - Mongo-Express container.

Use Case 1: MongoDB container without volume observe what happens to the data.

Use Case 2: After attaching volume = persistence - confirm re-create containers data persist 

Use Case 3: Database containerversion changes does not impacts the Data persisted

Let's start the experiment on data persistance.

Docker Volume Persistant
Docker Volume deep dive - MongoDB persistant 



To share the sensitive data we use network isolation, which is already discussed in Docker Networks post.

# Create Network
docker network create mynet 
Now let's use this mynet throughout all our use-case examples. MongoDB Connect to Mongo-express which is a member in the same network so that it can access the database


Use Case 1: MongoDB Without any volume - Non Persistence

MongoDB Container without any persistance storage :
docker run -d --name mongodb01 --network mynet \
    -e MONGO_INITDB_ROOT_USERNAME=admin \
    -e MONGO_INITDB_ROOT_PASSWORD="vybhavatechnologies" mongo

Aa we have not mentioned any tag after mongo so it will pull the latest mongo image from the docker hub. Validate mongodb container

docker ps -a

If you don't see running docker container for mongodb check the logs using
docker logs mangodb -f
here -f is optional to see the floating log content. If all good, we can run the next container Mongo-express
# Web client - based on nodejs express fraework  package
  docker run -it --rm \
    --network mynet \
    --name mongo-express \
    -p 8081:8081 \
    -e ME_CONFIG_OPTIONS_EDITORTHEME="ambiance" \
    -e ME_CONFIG_MONGODB_SERVER="mongodb01" \
    -e ME_CONFIG_BASICAUTH_USERNAME="admin" \
    -e ME_CONFIG_BASICAUTH_PASSWORD="vybhavatechnologies" \
    mongo-express
This container is for the use-and-throw container so used --rm in the above command.

On the browser open the mongoexpress web application for example as : http://192.168.33.250:8081/ Enter the user: admin and password as vybhavatechnologies



MangoDB non-persistence
Build Stateful application with MongoDB container

after login to the mongo-express webpage and perform above steps looks as 

Jyotsna Document added to Mongo-express
Collection adding document on mongo-express


Use Case 2: Docker Volume attached to mongo container

In Use Case 2 let's create the volume and use it while creating the mongo database container:
  docker volume create myvol  
  docker volume ls
Now let's use the volume which is created as named volume on the Docker host machine. Attach it to the MongoDB container.
  
docker run -d --name mongodb02 --network mynet \
    -v myvol:/data/db  \
    -e MONGO_INITDB_ROOT_USERNAME=admin \
    -e MANGO_INITDB_ROOT_PASSWORD="vybhavatechnologies" mongo:4.4.5-bionic
	
This time image tag I'm using mongo:4.4.5-bionic, I've tried windows server but it didn't work!
  # Check the contianer up
  docker ps
  
  # Web client - nodejs express 
docker run -it --rm \
    --network mynet \
    --name mongo-express \
    -p 8081:8081 \
    -e ME_CONFIG_OPTIONS_EDITORTHEME="ambiance" \
    -e ME_CONFIG_MONGODB_SERVER="mongodb02" \
    -e ME_CONFIG_BASICAUTH_USERNAME="admin" \
    -e ME_CONFIG_BASICAUTH_PASSWORD="vybhavatechnologies" \
    mongo-express
Now let's add documents for each student data

[
    { "name": "Vignesh", "Course": "Automations"},
    { "name": "Srinivas", "Course": "AWS Solutions"},
    { "name": "Abhijoy", "Course": "WebLogic"},
    { "name": "Shammi", "Course": "Continerized Solutions"},
    { "name": "Rajsekhar", "Course": "Microsoft Azure DevOps"},
    { "name": "Srikant", "Course": "DB Solutions"},
    { "name": "Viswasri", "Course": "AWS DevOps Solutions"},
    { "name": "Melvin", "Course": "DevOps Solutions"}
]

Now run the removal of containers, add the following alias to .bashrc your docker host machine.
  alias dc='docker rm -v -f $(docker ps -aq)'
  dc
  docker ps -a # confirm all containers removed  
Now run the same steps to create the mongodb02 and mongoexpress containers check the data exists and now try to add new document:
  {
    _id: ObjectId(),
    "name": 'Pranavsai',
    "Course": 'Analytics'
}

New data loaded
Document collection added to MongoDB 

mongodb with Volume
MongoDB with Volume


The data volume attached so we can re-start the container any time number of times !!!

Use Case 3: Database container version changes do not impact Data persistence

In this Use Case 3 experiment, I thought of taking MongoDB 3 and MongoDB 4 version images. But unfortunately, it didn't work for me the issue was with the version 3 image. So this experiment we can do with the same major version 4 and it's sub-versions then it is compatible to test this use-case.

  
docker run -d --name mongodb03 --network mynet \
    -v myvol:/data/db  \
    -e MONGO_INITDB_ROOT_USERNAME=admin \
    -e MONGO_INITDB_ROOT_PASSWORD="vybhavatechnologies" mongo:4
The rest of the steps are the same as the above use case 2

We can pick the latest version (say n) then before version (n-1 if exists) but here is the current (year 2021) mongo version tags are here:

Docker Hub mongo DB image tags
Docker Hub mongo DB image tags


References:

1 comment:

D2i Technology said...

DevOps services will be beneficial for getting most reliable users by giving appropriate software delivery at time. As DevOps will let automated feature which is necessary for the fastest delivery of products by analyzing the errors and let them handle while deploying. http://ttlink.com/d2itechnology

Categories

Kubernetes (24) Docker (20) git (13) Jenkins (12) AWS (7) Jenkins CI (5) Vagrant (5) K8s (4) VirtualBox (4) CentOS7 (3) docker registry (3) docker-ee (3) ucp (3) Jenkins Automation (2) Jenkins Master Slave (2) Jenkins Project (2) containers (2) create deployment (2) docker EE (2) docker private registry (2) dockers (2) dtr (2) kubeadm (2) kubectl (2) kubelet (2) openssl (2) Alert Manager CLI (1) AlertManager (1) Apache Maven (1) Best DevOps interview questions (1) CentOS (1) Container as a Service (1) DevOps Interview Questions (1) Docker 19 CE on Ubuntu 19.04 (1) Docker Tutorial (1) Docker UCP (1) Docker installation on Ubunutu (1) Docker interview questions (1) Docker on PowerShell (1) Docker on Windows (1) Docker version (1) Docker-ee installation on CentOS (1) DockerHub (1) Features of DTR (1) Fedora (1) Freestyle Project (1) Git Install on CentOS (1) Git Install on Oracle Linux (1) Git Install on RHEL (1) Git Source based installation (1) Git line ending setup (1) Git migration (1) Grafana on Windows (1) Install DTR (1) Install Docker on Windows Server (1) Install Maven on CentOS (1) Issues (1) Jenkins CI server on AWS instance (1) Jenkins First Job (1) Jenkins Installation on CentOS7 (1) Jenkins Master (1) Jenkins automatic build (1) Jenkins installation on Ubuntu 18.04 (1) Jenkins integration with GitHub server (1) Jenkins on AWS Ubuntu (1) Kubernetes Cluster provisioning (1) Kubernetes interview questions (1) Kuberntes Installation (1) Maven (1) Maven installation on Unix (1) Operations interview Questions (1) Oracle Linux (1) Personal access tokens on GitHub (1) Problem in Docker (1) Prometheus (1) Prometheus CLI (1) RHEL (1) SCM (1) SCM Poll (1) SRE interview questions (1) Troubleshooting (1) Uninstall Git (1) Uninstall Git on CentOS7 (1) Universal Control Plane (1) Vagrantfile (1) amtool (1) aws IAM Role (1) aws policy (1) caas (1) chef installation (1) create organization on UCP (1) create team on UCP (1) docker CE (1) docker UCP console (1) docker command line (1) docker commands (1) docker community edition (1) docker container (1) docker editions (1) docker enterprise edition (1) docker enterprise edition deep dive (1) docker for windows (1) docker hub (1) docker installation (1) docker node (1) docker releases (1) docker secure registry (1) docker service (1) docker swarm init (1) docker swarm join (1) docker trusted registry (1) elasticBeanStalk (1) global configurations (1) helm installation issue (1) mvn (1) namespaces (1) promtool (1) service creation (1) slack (1)