Comprehensive Guide to Using Docker for Beginners

Arijit DasArijit Das
13 min read

Table of contents

Introduction to Containers

What are Containers?

Containers are lightweight, portable, and self-sufficient units that package software and its dependencies together to ensure consistency across different computing environments. Unlike traditional virtual machines (VMs), containers share the host operating system's kernel, making them more efficient and faster.

Key Characteristics of Containers

  • Lightweight: Containers share the OS kernel, reducing resource overhead.

  • Portable: They can run consistently across different environments, including development, testing, and production.

  • Isolated: Each container runs in its own environment, preventing conflicts between applications.

  • Scalable: Containers allow for easy scaling and deployment of applications.

Difference Between Virtual Machines and Containers

FeatureVirtual Machines (VMs)Containers
OS OverheadRequires full OS per VMShares host OS kernel
Resource UsageHigh (due to OS duplication)Low (lightweight runtime)
PerformanceSlower startup, more resource-intensiveFaster startup, efficient
PortabilityLess portable, dependent on OSHighly portable

Why Use Containers?

  • Consistency: Ensures applications run the same in different environments.

  • Efficiency: Uses fewer system resources compared to VMs.

  • Rapid Deployment: Faster application startup and scaling.

  • Microservices Architecture: Supports breaking applications into smaller, manageable services.

  • Docker: The most widely used container platform for packaging and running applications.

  • Podman: A daemonless container engine alternative to Docker.

  • Kubernetes: An orchestration system for managing containerized applications at scale.

  • LXC (Linux Containers): A lightweight alternative for running system containers.

Conclusion

Containers have revolutionized software deployment by providing consistency, efficiency, and scalability. They enable developers to build, test, and deploy applications seamlessly across various environments. In the next sections, we will explore Docker, the leading containerization platform, in detail.

Docker Zero to Hero

1. Introduction to Docker

Docker is an open-source platform designed to automate the deployment, scaling, and management of applications using containerization. It allows developers to package applications with all their dependencies into lightweight, portable containers that can run consistently across different environments.

2. Why Use Docker?

  • Consistency: Ensures applications work the same in development, testing, and production.

  • Efficiency: Uses fewer system resources than virtual machines.

  • Portability: Runs on various platforms (Windows, macOS, Linux, and cloud services).

  • Scalability: Easily scales applications up or down as needed.

  • Faster Deployment: Enables rapid development and deployment.

3. Docker vs. Virtual Machines

FeatureVirtual Machines (VMs)Docker Containers
OS OverheadFull OS per VMShares host OS kernel
Resource UsageHighLow
PerformanceSlower startupFaster startup
PortabilityLimitedHighly portable

4. Docker Architecture

Docker follows a client-server architecture comprising:

  • Docker Client: CLI tool that sends commands to the Docker daemon.

  • Docker Daemon: Runs on the host machine and manages containers.

  • Docker Images: Read-only templates used to create containers.

  • Docker Containers: The running instances of Docker images.

  • Docker Registry: A storage system for Docker images (e.g., Docker Hub).

5. Installing Docker

On Windows and macOS

  1. Download and install Docker Desktop from Docker's official website.

  2. Start Docker Desktop and verify installation using:

     docker --version
    

On Linux

  1. Install Docker using the package manager:

     sudo apt update
     sudo apt install docker.io -y
    
  2. Start Docker and verify installation:

     sudo systemctl start docker
     sudo docker --version
    

6. Basic Docker Commands

  • Check Docker version:

      docker --version
    
  • Pull an image from Docker Hub:

      docker pull ubuntu
    
  • List available images:

      docker images
    
  • Run a container interactively:

      docker run -it ubuntu bash
    
  • List running containers:

      docker ps
    
  • Stop a running container:

      docker stop <container_id>
    
  • Remove a container:

      docker rm <container_id>
    
  • Remove an image:

      docker rmi <image_id>
    

7. Docker Images and Containers

Creating a Custom Docker Image

  1. Create a Dockerfile:

     FROM ubuntu:latest
     RUN apt update && apt install -y curl
     CMD ["echo", "Hello, Docker!"]
    
  2. Build the image:

     docker build -t my-image .
    
  3. Run the container:

     docker run my-image
    

8. Docker Compose

Docker Compose is a tool for defining and running multi-container Docker applications using a docker-compose.yml file.

Example docker-compose.yml

version: '3'
services:
  web:
    image: nginx
    ports:
      - "8080:80"

Run the following command to start the services:

docker-compose up

9. Docker Networking

Docker provides several networking options:

  • Bridge Network (default): Containers communicate within the same network.

  • Host Network: Uses the host's networking stack.

  • Overlay Network: Used in Docker Swarm mode.

  • Custom Networks: Created for better isolation and control.

10. Docker Volumes (Data Persistence)

Volumes allow containers to persist data.

  • Create a volume:

      docker volume create my_volume
    
  • Use a volume in a container:

      docker run -v my_volume:/data ubuntu
    

11. Docker Security Best Practices

  • Use official images from trusted sources.

  • Run containers as a non-root user.

  • Enable resource limits (CPU, memory) to prevent abuse.

  • Regularly scan images for vulnerabilities.

  • Keep Docker updated to the latest version.

12. Conclusion

Docker is a powerful tool that simplifies application development, deployment, and management. By mastering Docker commands, images, networking, and security best practices, you can streamline software development and infrastructure management. Next, we will explore advanced Docker concepts like Docker Swarm, Kubernetes, and CI/CD integration.

Docker Containerzation for Django

1. Introduction

Dockerizing a Django application ensures consistent development and deployment environments. With Docker, we can package Django, dependencies, and database configurations into isolated containers, making deployments seamless and scalable.

2. Prerequisites

  • Python installed (for Django development)

  • Docker and Docker Compose installed

  • Basic knowledge of Django and Docker

3. Setting Up Django Project

If you don't have a Django project, create one:

mkdir django_docker && cd django_docker
python -m venv venv
source venv/bin/activate  # On Windows use `venv\Scripts\activate`
pip install django
django-admin startproject myproject .

4. Creating a Dockerfile

Create a Dockerfile in the project root:

# Use official Python image
FROM python:3.12

# Set working directory
WORKDIR /app

# Copy project files
COPY . /app/

# Install dependencies
RUN pip install --no-cache-dir -r requirements.txt

# Expose port 8000
EXPOSE 8000

# Run Django server
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

5. Creating requirements.txt

Generate and save dependencies:

pip freeze > requirements.txt

6. Adding a Docker Compose File

Create docker-compose.yml to manage services like the database and Django app:

version: '3.9'

services:
  web:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    depends_on:
      - db

  db:
    image: postgres:16
    environment:
      POSTGRES_DB: mydatabase
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:

7. Running the Containerized Django App

Build and run the containers:

docker-compose up --build -d

The Django application will be accessible at http://localhost:8000.

8. Managing Database Migrations

Run database migrations inside the container:

docker-compose exec web python manage.py migrate

9. Creating a Superuser

Create a Django admin user:

docker-compose exec web python manage.py createsuperuser

10. Conclusion

By containerizing Django with Docker, we ensure a reproducible, scalable, and portable application environment. This setup can be further extended with Nginx and Gunicorn for production deployment.

Multi Stage Docker Builds | Reduce Image Size by 800 % | Distroless Container Images

1. Introduction

Multi-stage builds in Docker help create optimized images by reducing unnecessary files, leading to smaller and more secure containers. Distroless images further minimize attack surfaces by eliminating package managers and unnecessary binaries.

2. Why Use Multi-Stage Builds?

  • Smaller Image Size: Removes build dependencies and intermediate artifacts.

  • Faster Deployment: Smaller images reduce transfer and load times.

  • Security: Reduces vulnerabilities by excluding unnecessary libraries.

  • Better Performance: Streamlined containers improve efficiency.

3. Example: Multi-Stage Build for a Go Application

This example demonstrates a multi-stage build for a Go application:

# First Stage: Build the application
FROM golang:1.21 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp

# Second Stage: Minimal runtime environment
FROM gcr.io/distroless/base-debian12
COPY --from=builder /app/myapp /
CMD ["/myapp"]

Breakdown:

  • Stage 1 (builder): Uses a full Golang image to compile the binary.

  • Stage 2 (distroless): Copies only the compiled binary to a minimal runtime image.

4. Multi-Stage Build for a Python Application

For Python apps, we can use a minimal runtime environment:

# First Stage: Install dependencies
FROM python:3.12 AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Second Stage: Create final minimal image
FROM gcr.io/distroless/python3-debian12
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.12 /usr/local/lib/python3.12
COPY . .
CMD ["app.py"]

5. Comparing Image Sizes

Using docker images, we can compare the sizes:

docker images | grep myapp

Example Size Reduction:

Image TypeSize
Traditional Base OS800MB
Distroless Image50MB
Multi-Stage + Distroless10MB

6. Conclusion

Using multi-stage builds with distroless images drastically reduces container size, improves security, and speeds up deployments. This is an essential practice for production-ready applications.

Docker Volumes and Bind Mounts|Persistent Storage for Docker

1. Introduction

By default, Docker containers have ephemeral storage, meaning data is lost when a container stops. To persist data, Docker provides Volumes and Bind Mounts.

2. Differences Between Volumes and Bind Mounts

FeatureVolumesBind Mounts
Managed by DockerYesNo
Location ControlStored in Docker paths (/var/lib/docker/volumes/)Stored in a user-specified path
PerformanceOptimized for DockerMay have performance overhead
Backup & RestoreEasy to manageManual handling required

3. Working with Volumes

Creating a Volume

docker volume create my_volume

Using a Volume in a Container

docker run -d -v my_volume:/app/data --name my_container nginx

Listing Volumes

docker volume ls

Inspecting a Volume

docker volume inspect my_volume

Removing a Volume

docker volume rm my_volume

4. Working with Bind Mounts

Running a Container with a Bind Mount

docker run -d -v /host/path:/container/path --name my_container nginx
  • /host/path → The directory on the host machine.

  • /container/path → The directory inside the container.

Example: Running a Container with Persistent Data

docker run -d -v $(pwd)/data:/usr/share/nginx/html --name my_website nginx

This binds the data directory from the host to the Nginx container.

5. Choosing Between Volumes and Bind Mounts

  • Use Volumes for portable, managed storage within Docker.

  • Use Bind Mounts when direct access to host files is needed.

6. Conclusion

Docker Volumes and Bind Mounts provide powerful ways to persist container data. Volumes offer better integration with Docker, while Bind Mounts provide flexibility for interacting with host files directly.

Docker Networking | Bridge vs Host vs Overlay |Secure containers with custom bridge network

1. Introduction

Docker provides multiple networking options that allow containers to communicate efficiently while maintaining security and isolation. The key network types include Bridge, Host, and Overlay networks.

2. Types of Docker Networks

2.1 Bridge Network (Default)

  • Used when no specific network is defined.

  • Containers communicate via an internal bridge.

  • Ideal for standalone containers that need internal communication.

Creating a Bridge Network

docker network create my_bridge_network

Running a Container in a Custom Bridge Network

docker run -d --name my_container --network my_bridge_network nginx

Connecting an Existing Container

docker network connect my_bridge_network my_container

2.2 Host Network

  • The container shares the host’s network stack.

  • No network isolation; improves performance but reduces security.

  • Best suited for performance-sensitive applications.

Running a Container Using the Host Network

docker run -d --network host nginx

2.3 Overlay Network

  • Used in Docker Swarm for multi-host communication.

  • Enables inter-container communication across nodes.

  • Requires Docker Swarm to be enabled.

Creating an Overlay Network

docker network create -d overlay my_overlay_network

Running a Service in an Overlay Network

docker service create --name my_service --network my_overlay_network nginx

3. Secure Containers with a Custom Bridge Network

By default, Docker's bridge network allows inter-container communication, which may pose security risks. Using a custom bridge network with controlled access enhances security.

Steps to Secure a Bridge Network

  1. Create an Isolated Bridge Network
docker network create --driver bridge my_secure_network
  1. Run Containers in the Secure Network
docker run -d --name secure_app --network my_secure_network nginx
  1. Restrict External Communication (Optional)
docker network disconnect bridge secure_app

4. Choosing the Right Network Type

Network TypeUse Case
BridgeDefault, standalone containers, internal communication
HostPerformance-intensive applications, no isolation needed
OverlayMulti-host, Docker Swarm, distributed applications
Custom BridgeSecure, isolated environment for microservices

5. Conclusion

Docker networking provides flexible communication between containers while maintaining security. Using a custom bridge network enhances security, while overlay networks are ideal for distributed applications. Understanding these options helps optimize container deployments.

Docker Interview Questions with Answers

1. What is Docker?

Answer: Docker is an open-source containerization platform that enables developers to package applications and dependencies into lightweight, portable containers. These containers run consistently across different environments.

2. How is Docker different from Virtual Machines (VMs)?

Answer:

  • VMs: Require a full guest OS, are heavyweight, and slow to start.

  • Docker Containers: Share the host OS kernel, are lightweight, and start quickly.

3. What are Docker images?

Answer: Docker images are immutable templates containing the application, dependencies, and configurations needed to run a container.

4. What is a Docker container?

Answer: A container is a runtime instance of a Docker image that runs isolated processes on a host machine.

5. What is Docker Compose?

Answer: Docker Compose is a tool for defining and running multi-container applications using a docker-compose.yml file.

6. What is Dockerfile?

Answer: A Dockerfile is a script containing a set of instructions to automate the creation of a Docker image.

7. What are Docker Volumes?

Answer: Docker Volumes are used for persistent data storage, allowing data to persist even after a container is removed.

8. How do you build a Docker image?

Answer:

docker build -t my_image .

9. How do you run a container?

Answer:

docker run -d --name my_container my_image

10. What are the different types of Docker networks?

Answer:

  • Bridge: Default, allows isolated communication between containers.

  • Host: Shares the host’s network.

  • Overlay: Used for multi-host communication in Docker Swarm.

11. How do you list all running containers?

Answer:

docker ps

12. How do you stop a running container?

Answer:

docker stop container_id

13. What is the difference between CMD and ENTRYPOINT in Dockerfile?

Answer:

  • CMD: Provides default instructions but can be overridden.

  • ENTRYPOINT: Specifies a command that always runs as the container starts.

14. How do you remove a Docker image?

Answer:

docker rmi image_id

15. How do you check Docker logs?

Answer:

docker logs container_id

16. What is the purpose of .dockerignore?

Answer: The .dockerignore file excludes unnecessary files (e.g., logs, .git) from being copied into the image, reducing image size.

17. What is Docker Swarm?

Answer: Docker Swarm is Docker’s native clustering and orchestration tool for managing a group of Docker nodes as a single system.

18. How do you scale services in Docker Swarm?

Answer:

docker service scale service_name=5

19. What is the difference between Docker CE and Docker EE?

Answer:

  • Docker CE (Community Edition): Free and open-source.

  • Docker EE (Enterprise Edition): Paid, with enterprise features like security and support.

20. How do you copy files from a running container?

Answer:

docker cp container_id:/path/to/file /destination/path

Conclusion

These questions cover fundamental to advanced Docker concepts that can help you prepare for technical interviews. Understanding these topics will enhance your ability to work with Docker in real-world projects.

0
Subscribe to my newsletter

Read articles from Arijit Das directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Arijit Das
Arijit Das