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.