Photo by Ian Taylor on Unsplash
Learning Docker As a Newbie: Part 2
Docker Images, Containers, Volumes
Brief
Before Getting Started with this, I would highly recommend folks to check my First Blog in Docker. There I have explained why we need Docker and What Problems it solves at the industry level. You can also check a blog on this. In this blog, I will be explaining Docker in more depth which includes Docker Images, Containers etc.
Docker Images
In the case of running an application, we must need its dependencies and configuration files. Now we know in the case of Docker, applications are run in Docker Containers. So how are we going to get all the dependencies or configuration files to run the code? This is where Docker Images comes into the picture.
Docker Image is a Package which contains application/software binaries with all its dependencies and configuration files needed to run the code. Also, it is just a read-only template which is immutable.
A Docker Image can have a series of layers. Every layer can represent an instruction that we run in it.
Here's another question where are these images stored?
These Images are stored in a Docker Registry like DockerHub, Elastic Container Repository, etc. A Docker image will have a base OS layer in it always, and we can install software and its dependencies above the underlying OS layer in the image.
Docker Registry
Docker registry is just a storage for Docker Images. These are kept in the form of repositories, where it has different versions of that specific image. Default Docker engine talks with DockerHub (Docker Public Registry Instance).
Sometimes you don't want your repositories to be public, in DockerHub you can have only 1 private image repository. But in real-world scenarios, you might need more private registries.
It is possible to run on-premise private repositories.
Example -> Amazon Elastic Container Registry, Google Container Registry, Azure Container Registry.
You can visit all the official Docker images like Ubuntu, Nginx, etc in DockerHub.
Now to pull any Docker image you can use this command:
docker pull <Docker Image Name>
By default, it will pull the latest image present in the DockerHub repository.
For example -> if we do docker pull ubuntu
it will pull the image with the tag latest
. Now to pull a particular version of an image for that we need to add that specific tag, like docker pull nginx:alpine
it will pull the alpine version of the nginx image.
Docker image commands
There are a few commands which are used quite often while dealing with Docker images:
For viewing the images on your local you can run this command:
docker image ls
This command will list all the images available in the local system.
If we want to check the history of each layer in the images :
docker history <image_name>
If you want to remove an image we can use the following command:
docker image rm <image_name>
There's another command:
docker rmi <image_name>
- We can get cases where we want to get rid of many unused images, which can be removed using:
Now By default, you will be prompted to continue. In this case, use the -f or --force flag. We can limit which images are pruned using filtering expressions with the --filter flag. Example ->docker image prune -a
docker image prune -a --filter "until=24h"
- We can tag an image by using this:
docker image tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
- We can push an image to the DockerHub repository:
Remember to log in before pushing the images usingdocker image push <image>
docker login -u <username>
.
Docker Containers
A Container is a runtime instance of a Docker image. It is the actual instantiation of the image just like Classes and Objects. We can create any number of containers from a single Docker image. Docker containers cannot change their underlying docker image. The best thing I like about containers is that containers are:
- Lighter
- Faster
- Efficient than VMs
For more info check out the official documentation of Docker.Docker Container Commands
Here are some important Docker Commands: - If you want to run a Container you can use:
ofdocker container run <Image name>
An example can be ->docker run <image name>
It will get the latest image of ubuntu from DockerHub and run the container.docker run ubuntu
- We can run the container in the interactive mode:
It may not work for the first time for the ones who don't have iputils or figlet installed in their system. To install it u can follow the below instructions:docker run -it ubuntu
apt update -y
apt-get install -y iputils-ping
This helps you run the container in the interactive modeapt-get install figlet
- Most of the time you may want our container run in a specific PORT like PORT-80 or PORT-8080. To configure that we can use the
-p
flag to specify the PORT
Example ->docker run -p HOSTPORT:CONTAINERPORT
docker run -p 80:3000
- If you want to run a container in the background you can use the
-d
flag to run in detached mode.
The container will run in Detached mode.docker run -d ubuntu
- If you want to add some environment variables to your container then you can add them using the
-e
flag.docker run -it -e HOSTNAME=<container_name>
- There will be a time you want to stop the container then we can run:
docker container stop <container_id>
- To get the list of all containers:
It will list all the running containersdocker ps
Lists all the containers (running and exited) with unique namesdocker ps -a
Lists the container IDs only.docker ps -a -q
- You might want to specify a name for your container this can be achieved using
--name
flag.docker run -d --name <name> <imagename>
- To remove a container we can use
ORdocker rm <container_id>
docker rm -fdocker rm <container_name> If you want to remove a running container then you need `-f` command to forcefully stop the container
docker rm -f $(docker ps -a -q )To remove all the containers we can use this:
docker rm -f $(docker ps -a -q -f status=exited) ```To remove all the exited containers:
- If you want to look at a specific process in a specific container
docker top <container>
- To check all the configs of the container we can use :
docker inspect <container_name>
- If you want to check all the logs of the container :
If you want to check the live logs of the containerdocker logs <container_name>
docker logs -f <container_name>
- If you want to get live info on CPU, Memory Usage or the I/O of the containers then we need :
docker stats
Conclusion
In this Blog, I have covered almost all the important commands required in Docker Images and Containers. In the next Part, I will be covering the remaining important topics of Docker like Docker Volumes, Network, and DockerFile. Feel free to share any feedback.