Home / Notebooks / DevOps
DevOps
beginner

Docker Essentials

Quick reference for Docker commands and concepts

March 5, 2024
Updated regularly

Docker Essentials

Quick reference guide for Docker fundamentals.

Basic Concepts

What is Docker?

Docker is a platform for developing, shipping, and running applications in containers.

Key Benefits:

  • Consistent environments
  • Isolation
  • Portability
  • Resource efficiency
  • Installation

    Linux

    curl -fsSL https://get.docker.com -o get-docker.sh
    sudo sh get-docker.sh
    

    Verify Installation

    docker --version
    docker run hello-world
    

    Images

    Pull an Image

    docker pull nginx
    docker pull node:18-alpine
    

    List Images

    docker images
    docker images -a
    

    Remove Image

    docker rmi nginx
    docker rmi $(docker images -q)  # Remove all
    

    Build Image

    docker build -t myapp:1.0 .
    docker build -t myapp:latest --no-cache .
    

    Containers

    Run Container

    # Basic run (foreground mode - blocks terminal)
    docker run nginx
    
    # Detached mode (runs in background)
    docker run -d nginx
    
    # With port mapping (host:container)
    # Access nginx on http://localhost:8080
    docker run -d -p 8080:80 nginx
    
    # With custom name (easier to reference later)
    docker run -d --name my-nginx nginx
    
    # With environment variables
    docker run -d -e NODE_ENV=production node-app
    
    # Complete example (name + port + env)
    docker run -d \
      --name my-app \
      -p 3000:3000 \
      -e NODE_ENV=production \
      node-app
    

    List Containers

    docker ps              # Running containers
    docker ps -a           # All containers
    docker ps -q           # Container IDs only
    

    Stop/Start Container

    docker stop my-nginx
    docker start my-nginx
    docker restart my-nginx
    

    Remove Container

    docker rm my-nginx
    docker rm -f my-nginx  # Force remove running
    docker rm $(docker ps -aq)  # Remove all stopped
    

    Container Logs

    docker logs my-nginx
    docker logs -f my-nginx  # Follow logs
    docker logs --tail 100 my-nginx
    

    Execute Commands

    docker exec my-nginx ls /usr/share/nginx/html
    docker exec -it my-nginx bash
    docker exec -it my-nginx sh
    

    Dockerfile

    Basic Structure

    Step-by-step Dockerfile explanation:

    # 1. Choose a base image (lightweight Alpine Linux variant)
    FROM node:18-alpine
    
    # 2. Set working directory inside container
    WORKDIR /app
    
    # 3. Copy dependency files first (for better caching)
    COPY package*.json ./
    
    # 4. Install dependencies
    RUN npm install
    
    # 5. Copy application source code
    COPY . .
    
    # 6. Document which port the app uses
    EXPOSE 3000
    
    # 7. Define the command to run the app
    CMD ["npm", "start"]
    

    Why this order matters:

  • Dependencies change less often than code
  • Docker caches layers → faster rebuilds
  • Only changed layers are rebuilt
  • Multi-stage Build

    # Build stage
    FROM node:18-alpine AS builder
    WORKDIR /app
    COPY package*.json ./
    RUN npm install
    COPY . .
    RUN npm run build
    
    # Production stage
    FROM node:18-alpine
    WORKDIR /app
    COPY --from=builder /app/dist ./dist
    COPY package*.json ./
    RUN npm install --production
    EXPOSE 3000
    CMD ["node", "dist/main.js"]
    

    Docker Compose

    docker-compose.yml

    version: '3.8'
    
    services:
      web:
        build: .
        ports:
          - "3000:3000"
        environment:
          - NODE_ENV=production
        depends_on:
          - db
        volumes:
          - ./src:/app/src
    
      db:
        image: postgres:15
        environment:
          - POSTGRES_PASSWORD=secret
        volumes:
          - pgdata:/var/lib/postgresql/data
    
    volumes:
      pgdata:
    

    Compose Commands

    # Start services
    docker-compose up
    docker-compose up -d
    
    # Stop services
    docker-compose down
    docker-compose down -v  # Remove volumes
    
    # View logs
    docker-compose logs
    docker-compose logs -f web
    
    # Rebuild
    docker-compose build
    docker-compose up --build
    

    Volumes

    Create Volume

    docker volume create mydata
    docker volume ls
    docker volume inspect mydata
    

    Use Volume

    docker run -v mydata:/data nginx
    docker run -v $(pwd):/app node-app  # Bind mount
    

    Remove Volume

    docker volume rm mydata
    docker volume prune  # Remove unused
    

    Networks

    Create Network

    docker network create mynet
    docker network ls
    docker network inspect mynet
    

    Connect Container

    docker run -d --network mynet --name web nginx
    docker network connect mynet db
    

    Best Practices

    1. Use Official Images

    FROM node:18-alpine  # Official + minimal
    

    2. Multi-stage Builds

    Reduce final image size by copying only necessary files.

    3. Layer Caching

    # Copy dependencies first
    COPY package*.json ./
    RUN npm install
    
    # Then copy source
    COPY . .
    

    4. .dockerignore

    node_modules
    .git
    .env
    *.md
    

    5. Non-root User

    RUN addgroup -S appgroup && adduser -S appuser -G appgroup
    USER appuser
    

    6. Health Checks

    HEALTHCHECK --interval=30s --timeout=3s \
      CMD wget --quiet --tries=1 --spider http://localhost:3000/health || exit 1
    

    Cleanup Commands

    # Remove stopped containers
    docker container prune
    
    # Remove unused images
    docker image prune
    
    # Remove unused volumes
    docker volume prune
    
    # Remove everything
    docker system prune -a
    

    Common Issues

    Port Already in Use

    # Find process using port
    lsof -i :8080
    # Kill process or use different port
    

    Permission Denied

    sudo usermod -aG docker $USER
    # Logout and login again
    

    Out of Disk Space

    docker system prune -a --volumes
    

    Resources

  • Docker Documentation
  • Docker Hub
  • Best Practices
  • Topics

    DockerDevOpsContainers

    Found This Helpful?

    If you have questions or suggestions for improving these notes, I'd love to hear from you.