Dockah! Dockah! Dockah!
I have been dabbling with docker for quite sometime, to be honest when it was introduced to me I didn’t understand it much but as time passed and I started experimenting with it I got to know the technology better and better. This made me understand various concepts better. I understood
sandboxing and got to appreciate how docker solves the problem of
works on my machine.
When I started using docker I use to just run few commands and I could get the server running, this I could access through browser that was more than enough for me. When I use to make changes to the code I could see it getting reflected in the way I am running the application and I was a happy man.
This was all abstract thinking and I was not worried about what was going inside the container, it was a black box for me. This went on for a while but it shouldn’t have, I have the right to know things and how they work. So I started exploring about the realm and the more I read about it the more I fell in love with it. I eventually landed up on Jessie’s blog. The amount of things she and Gautham has taught me is crazy. I could never think that docker being a headless server could actually be used to captivate an application in such a way that you decide how much resources should be given to it. We at jnaapti have been working on various other possibilities but that for some other time.
So yeah there is more to just starting the application using docker and get things to work. So let’s try to understand few things with respect to docker, this is purely from my experience and how I understood things. So containers are virtual environments which share some of the resource of your host operating system. Containers are just like
Airbnb guest for which the host is the
Operating System. Containers are allowed to use the resources only when the user of
Operating System gives them permission to use. Now the way I use them is basically in two ways, Stateful containers or Stateless containers, stateful being the one which has some data generated and stored in them while stateless is the one which doesn’t have any dependency on data.
Let me show you one of the use case that I generally use containers for; Now people may disagree and say I am exploiting it or using the power for wrong purpose but to be very frank if it solves my problem why should I care XD. Now, imagine I want to learn to write
Go and I don’t want to install it on my system but have an isolated environment for it. There are two ways I can pull a docker image which has
Go in it or get a normal image and install go in it. An image here is just like an
iso file which is used to help you install an
Operating System on your machine. Let’s see what all images I have on my machine,
I would run
docker images and the output looks like this:
This shows that I have a
znc image I use it to run a
znc bouncer. Let’s try and pull a
ubuntu image and install
golang in it. The command goes
docker pull ubuntu.
Now we need to
run a docker container and get a shell access to the container. For that we run command
docker run -it --name="golang" ubuntu:latest /bin/bash
Let’s break it down and see what is going on here,
run tells the docker to start the container
-it option tells that this is going to be an
interactive session and we need to attach a
tty to this,
--name is the option to give name to the docker container and
ubuntu:latest is the name of the image and
/bin/bash is the process that needs to be run.
Once you run this command you will that you will get a
root prompt something like this:
Now you can run any command inside it and you will be totally isolated from your host machine. For installing
golang let’s follow these instruction from Digital Ocean. You should ignore the
ssh instruction instead run
apt update and
apt install curl nano. Follow the rest normally and you will see it working like this:
You can play around with
golang in the docker and when you are done you can exit. The docker stays it’s just that you are out of it. You want the shell again you can run,
docker exec -it golang /bin/bash
You will get the shell again, this is what is called stateful container since it will have all the files that you have created. You can go ahead and
mount a volume to the container using
-v option in the
docker run statement, this will act as if you plugged in a pen-drive in the docker storage being a directory you have created on the host machine.
docker exec -it -v /home/fhackdroid/go-data:/go-data golang /bin/bash
/go-data in the docker container.
These are the few ways I use docker in my daily life, if you use it in any other way and you want to share do write it to me I would be more than happy to know.
Happy Hacking Folks!