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:
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:
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