1. Docker Basics#

        flowchart LR
    Client[Docker Client] -->|REST API| Daemon[Docker Daemon]
    Daemon --> Images[(Images)]
    Daemon --> Containers[Containers]
    Daemon --> Volumes[(Volumes)]
    Daemon --> Networks[Networks]
    Daemon -->|pull/push| Registry[Registry]
    

Architecture#

Docker uses a client-server architecture. The Docker daemon (dockerd) manages images, containers, networks, and volumes. The Docker client (docker) sends commands to the daemon via REST API.

Installation#

Ubuntu#

# Remove old versions
sudo apt-get remove docker docker-engine docker.io containerd runc

# Install prerequisites
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

# Add Docker GPG key and repo
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Install Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Post-install: run without sudo
sudo usermod -aG docker $USER
newgrp docker

macOS#

# Using Homebrew
brew install --cask docker
# Or download Docker Desktop from https://www.docker.com/products/docker-desktop

Core Concepts#

Concept

Description

Image

Read-only template with instructions for creating a container

Container

Runnable instance of an image

Volume

Persistent data storage

Network

Communication channel between containers

Registry

Storage for Docker images (Docker Hub, Harbor, etc.)

Container Lifecycle#

        stateDiagram-v2
    [*] --> Created: docker create
    Created --> Running: docker start
    Running --> Paused: docker pause
    Paused --> Running: docker unpause
    Running --> Stopped: docker stop
    Stopped --> Running: docker start
    Stopped --> Removed: docker rm
    Running --> Removed: docker rm -f
    Removed --> [*]
    

Essential Commands#

Image Management#

# Pull an image
docker pull nginx:1.25-alpine

# List images
docker images

# Build an image
docker build -t myapp:1.0 .

# Remove an image
docker rmi myapp:1.0

# Prune unused images
docker image prune -a

Container Operations#

# Run a container (detached, with port mapping and name)
docker run -d --name web -p 8080:80 nginx:1.25-alpine

# List running containers
docker ps

# List all containers (including stopped)
docker ps -a

# View logs
docker logs -f web

# Execute command in running container
docker exec -it web /bin/sh

# Inspect container details
docker inspect web

# View resource usage
docker stats web

# Stop and remove
docker stop web
docker rm web

Volume Management#

# Create a named volume
docker volume create mydata

# Run with volume mount
docker run -d --name db \
  -v mydata:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=secret \
  mysql:8.0

# Bind mount (host directory)
docker run -d --name web \
  -v $(pwd)/html:/usr/share/nginx/html:ro \
  -p 8080:80 nginx:1.25-alpine

# List volumes
docker volume ls

# Remove unused volumes
docker volume prune

Network Management#

# Create a network
docker network create mynet

# Run containers on the same network
docker run -d --name db --network mynet mysql:8.0
docker run -d --name app --network mynet -p 8080:8080 myapp:1.0

# Containers on the same network can reach each other by name
# e.g., app can connect to db:3306

# List networks
docker network ls

# Inspect network
docker network inspect mynet

Practical Examples#

Run Nginx#

docker run -d --name nginx \
  -p 80:80 \
  -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro \
  -v $(pwd)/html:/usr/share/nginx/html:ro \
  nginx:1.25-alpine

Run MySQL#

docker run -d --name mysql \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=rootpass \
  -e MYSQL_DATABASE=mydb \
  -e MYSQL_USER=app \
  -e MYSQL_PASSWORD=apppass \
  -v mysql_data:/var/lib/mysql \
  mysql:8.0

Run Redis#

docker run -d --name redis \
  -p 6379:6379 \
  -v redis_data:/data \
  redis:7-alpine redis-server --appendonly yes

Image Layers#

Docker images are built in layers. Each instruction in a Dockerfile creates a new layer. Layers are cached and shared between images, which saves disk space and speeds up builds.

# View image layers
docker history nginx:1.25-alpine

# View image size
docker images --format "{{.Repository}}:{{.Tag}} {{.Size}}"

Cleanup#

# Remove all stopped containers
docker container prune

# Remove all unused resources (containers, networks, images, volumes)
docker system prune -a --volumes

# Check disk usage
docker system df