Complete Docker Framework Learning Tutorial
1. Introduction to Docker
1.1 What Docker Is
Docker is an open-source platform for containerization. It allows developers and IT
operations teams to package applications and dependencies into a standardized unit called
a container, ensuring that applications run reliably across different environments.
Key advantages of Docker:
Consistency across environments (Dev → Test → Prod)
Isolation of applications and dependencies
Lightweight compared to traditional virtual machines (VMs)
Portability across operating systems and cloud platforms
Rapid deployment and scaling
Think of Docker as a shipping container for software: once you package an application with
all its dependencies, it can run anywhere without “it works on my machine” issues.
1.2 Why Docker Exists
Before Docker, developers and operations faced challenges such as:
Application compatibility issues
Conflicting dependencies
Complex deployments
Inefficient resource utilization
Slow scaling of services
Docker solves these by abstracting the operating system layer, providing isolated
environments that share the host kernel, and offering tools for building, running, and
orchestrating containers.
1.3 Difference Between Containers and Virtual Machines
Feature Virtual Machines (VM) Docker Containers
Resource Utilization Heavy, each VM runs full OS Lightweight, share host OS kernel
Startup Time Minutes Seconds
Isolation High (hardware-level) Moderate (OS-level)
Portability Limited Highly portable
Storage Large Small
Running multiple OS Microservices, Dev/Test
Example Use Case
environments deployments
Containers are not a replacement for VMs, but a complementary technology, particularly
for microservices and cloud-native architectures.
2. Docker Architecture
Docker’s architecture has several key components:
2.1 Docker Engine
Docker Engine is the core component that enables container creation, execution, and
management. It consists of:
Docker Daemon (dockerd): Runs on the host, manages containers, images, and
networks.
Docker CLI: Command-line interface to interact with the daemon.
REST API: Allows programmatic interaction with the Docker daemon.
2.2 Docker Images
Read-only templates for creating containers.
Contain the application code, runtime, libraries, and dependencies.
Built from Dockerfiles.
2.3 Docker Containers
Lightweight, executable units created from images.
Include everything an application needs to run.
Can be started, stopped, moved, or deleted easily.
2.4 Docker Registry
Repository to store and distribute Docker images.
Docker Hub is the default public registry.
Private registries can be used for enterprise-level applications.
2.5 Docker Compose
Tool for defining and running multi-container applications.
Uses [Link] to define services, networks, and volumes.
3. Docker Installation
Docker supports multiple platforms:
3.1 Installation on Linux
1. Update package information:
sudo apt-get update
2. Install prerequisites:
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
3. Add Docker’s official GPG key:
curl -fsSL [Link] | sudo apt-key add -
4. Set up the Docker repository:
sudo add-apt-repository "deb [arch=amd64] [Link] $
(lsb_release -cs) stable"
5. Install Docker Engine:
sudo apt-get update
sudo apt-get install docker-ce
3.2 Installation on Windows & Mac
Install Docker Desktop.
Supports Windows 10/11 Pro (Hyper-V or WSL2).
For Mac, runs natively with lightweight VM.
3.3 Verifying Installation
docker --version
docker run hello-world
hello-world confirms the engine is working properly.
4. Docker Images and Containers
4.1 Docker Images
Built using a Dockerfile.
Layered architecture: each instruction creates a new layer.
Layers are cached, reducing build times.
4.2 Creating a Dockerfile
Example:
# Base image
FROM python:3.11-slim
# Set working directory
WORKDIR /app
# Copy dependencies
COPY [Link] .
# Install dependencies
RUN pip install --no-cache-dir -r [Link]
# Copy application code
COPY . .
# Command to run
CMD ["python", "[Link]"]
4.3 Building an Image
docker build -t my-python-app .
4.4 Running a Container
docker run -d -p 5000:5000 my-python-app
-d: Detached mode
-p: Map host port to container port
4.5 Listing Images and Containers
docker images # List images
docker ps # Running containers
docker ps -a # All containers
4.6 Stopping and Removing Containers
docker stop <container_id>
docker rm <container_id>
docker rmi <image_id>
5. Docker Networking
Containers can communicate in different ways:
5.1 Network Types
Bridge Network (default): Isolated network for containers on a single host.
Host Network: Container shares host network stack.
Overlay Network: Enables multi-host container communication (used in
Swarm/Kubernetes).
None Network: Container has no networking.
5.2 Exposing Ports
docker run -d -p 8080:80 nginx
Maps container’s port 80 to host’s port 8080.
5.3 Linking Containers (Legacy)
--link flag connects containers, now replaced by user-defined networks.
6. Docker Volumes and Storage
6.1 Importance
Containers are ephemeral; data is lost if the container stops. Volumes provide persistent
storage.
6.2 Creating Volumes
docker volume create mydata
docker run -d -v mydata:/app/data my-python-app
mydata is a named volume.
Mount point inside container is /app/data.
6.3 Bind Mounts
Bind mounts link host directories to containers.
docker run -v /host/data:/app/data my-python-app
Useful for development workflows.
7. Docker Compose
Docker Compose simplifies multi-container applications.
7.1 Sample [Link]
version: "3.8"
services:
web:
build: ./web
ports:
- "5000:5000"
volumes:
- ./web:/app
depends_on:
- redis
redis:
image: "redis:alpine"
7.2 Commands
docker-compose up # Start all services
docker-compose down # Stop and remove containers
docker-compose logs # View logs
docker-compose build # Rebuild images
8. Docker Best Practices
1. Keep Images Small
o Use minimal base images (e.g., alpine).
o Avoid installing unnecessary packages.
2. Use Multi-Stage Builds
o Separate build and runtime environments.
o Reduce final image size.
3. Pin Versions
o Always specify exact image versions for consistency.
4. FROM python:3.11.2-slim
5. Limit Container Privileges
o Avoid running containers as root.
6. USER appuser
7. Optimize Layering
o Order Dockerfile commands to maximize cache reuse.
8. Use Volumes for Data
o Keep persistent data separate from ephemeral containers.
9. Logging and Monitoring
o Forward logs to central systems (ELK, Prometheus, etc.).
o Monitor container health using HEALTHCHECK.
9. Docker Security
Scan Images for vulnerabilities (docker scan <image>).
Use minimal images to reduce attack surface.
Limit container privileges.
Keep Docker daemon secure:
o Only allow trusted users.
o Enable TLS for remote access.
Apply namespaces and cgroups for resource isolation.
10. Docker in CI/CD Pipelines
Docker integrates seamlessly into continuous integration and deployment workflows:
10.1 Building Images Automatically
Jenkins, GitLab CI, GitHub Actions can build images on code push.
Example GitHub Actions snippet:
- name: Build Docker image
run: docker build -t my-app:${{ [Link] }} .
10.2 Testing in Containers
Spin up isolated environments for integration testing.
Containers ensure tests run identically across machines.
10.3 Deployment
Push images to Docker Hub or private registries.
Deploy to staging and production environments consistently.
11. Docker Swarm and Orchestration
11.1 Docker Swarm
Native orchestration tool for Docker.
Features:
o Cluster management
o Load balancing
o Scaling services
Commands:
docker swarm init
docker service create --name web --replicas 3 -p 80:80 nginx
docker service scale web=5
11.2 Kubernetes Integration
Kubernetes is a more advanced orchestration platform.
Docker containers are the unit of deployment in Kubernetes.
Docker Compose files can be converted into Kubernetes manifests.
12. Common Docker Commands
Command Purpose
docker build -t <name> . Build image from Dockerfile
docker run -d -p 80:80 <img> Run container in detached mode
docker ps List running containers
docker ps -a List all containers
docker stop <id> Stop container
docker rm <id> Remove container
docker rmi <image> Remove image
docker logs <id> View container logs
docker exec -it <id> bash Access container shell
docker-compose up Launch multi-container application
docker-compose down Stop multi-container application
13. Real-World Docker Use Cases
1. Microservices
o Each service runs in its own container.
o Containers communicate over networks, scale independently.
2. Dev/Test Environments
o Spin up reproducible environments.
o Avoid conflicts between developer machines.
3. Continuous Delivery
o Package application as a Docker image.
o Deploy same image across environments.
4. Cloud-Native Deployments
o Containers run consistently on AWS, Azure, or GCP.
o Integrates with orchestration and auto-scaling.
5. Legacy Application Modernization
o Containerize monolithic applications for easier deployment and management.
14. Troubleshooting Docker
Common issues and fixes:
1. Cannot connect to Docker daemon
sudo systemctl start docker
2. Port already in use
Check host port mapping:
docker ps
3. Container exits immediately
Check logs:
docker logs <container_id>
4. Image not found
Ensure image exists locally or pull from registry:
docker pull <image>
15. Learning Strategy for Docker
Step 1: Fundamentals
Understand containers, images, volumes, networks.
Practice with docker run, docker build, and docker logs.
Step 2: Dockerfile Mastery
Learn multi-stage builds.
Optimize image layering.
Understand environment variables, volumes, and entry points.
Step 3: Multi-Container Applications
Use Docker Compose.
Practice building a web + database setup.
Understand depends_on and network isolation.
Step 4: Security and Monitoring
Learn Docker security best practices.
Explore logging, monitoring, and resource management.
Step 5: CI/CD and Orchestration
Integrate Docker into pipelines.
Explore Docker Swarm or Kubernetes for orchestration.
16. Advanced Topics
16.1 Multi-Stage Dockerfile Example
# Build stage
FROM node:18 AS builder
WORKDIR /app
COPY [Link] .
RUN npm install
COPY . .
RUN npm run build
# Production stage
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
Keeps final image small.
Separates build dependencies from runtime.
16.2 Health Checks
HEALTHCHECK --interval=30s --timeout=5s \
CMD curl -f [Link] || exit 1
Monitors container health automatically.
16.3 Environment Variables
ENV NODE_ENV=production
Configure containers dynamically.
Can be overridden with docker run -e.
16.4 Logging Drivers
Default: JSON-file
Others: syslog, journald, fluentd, gelf, awslogs
17. Docker Ecosystem Tools
Docker Hub: Public image registry.
Docker Desktop: GUI and local environment management.
Docker Compose: Multi-container orchestration.
Docker Swarm: Cluster orchestration.
Docker Machine: Provision Docker hosts (legacy).
Docker Registry: Private image repository.
18. Conclusion
Docker is a fundamental technology for modern DevOps, microservices, and cloud-native
applications. By learning Docker, you gain the ability to:
Package applications reliably
Deploy consistently across environments
Scale applications efficiently
Integrate with CI/CD pipelines
Secure and monitor application lifecycles
Docker is not just a tool, but a paradigm shift. Understanding containerization fully unlocks
efficiency, portability, and reproducibility in software development and IT operations.