π Each Dockerfile Line = One Layer
Docker images are layers. Understanding layers helps optimize builds. Cache, reuse, smaller images.
π How Layers Work
Dockerfile: FROM node:18 # Layer 1: Base image WORKDIR /app # Layer 2: Set working directory COPY package*.json ./ # Layer 3: Copy package files RUN npm install # Layer 4: Install dependencies COPY . . # Layer 5: Copy source RUN npm run build # Layer 6: Build CMD ["npm", "start"] # Layer 7: Command # Each layer is cached # Changing layer 5 invalidates layers 5, 6, 7 # But layers 1-4 are reused (cached) # View layers docker history myapp:latest # Optimize: Put frequently changed files LAST COPY package*.json ./ # Changes rarely RUN npm install # Cached COPY . . # Changes often (last)
π― Layer Optimization Tips
# 1. Combine RUN commands
RUN apt-get update && apt-get install -y \
git \
curl \
wget \
&& rm -rf /var/lib/apt/lists/*
# 2. Use multi-stage builds
FROM node:18 AS builder
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
# 3. Leverage cache
COPY package*.json ./
RUN npm install
COPY . . # Changes here doesn't invalidate npm install layer
# 4. Use .dockerignore
# Exclude node_modules, .git, etc. from build context
# 5. Use smaller base images
# node:18-alpine (170MB) vs node:18 (950MB)
π‘ Commands
- docker history image:tag (show layers)
- docker build –no-cache (rebuild without cache)
- docker image prune -a (remove unused layers)
- docker system df (check disk usage by layers)
“Build took 5 minutes each time. Reordered layers, used cache. Build time dropped to 30 seconds. Understanding layers is essential for Docker.”
