Docker Fundamentals for Developers
Docker revolutionized how we build, ship, and run applications. Here's everything you need to get started.
Installation
macOS
brew install --cask dockerLinux (Ubuntu)
sudo apt update
sudo apt install docker.io docker-compose
sudo systemctl enable docker
sudo usermod -aG docker $USEREssential Commands
Images
# Pull an image
docker pull node:20-alpine
# List images
docker images
# Remove image
docker rmi image_name
# Remove unused images
docker image pruneContainers
# Run container
docker run -d -p 3000:3000 --name my-app node:20-alpine
# List running containers
docker ps
# List all containers
docker ps -a
# Stop container
docker stop my-app
# Remove container
docker rm my-app
# View logs
docker logs -f my-app
# Execute command in container
docker exec -it my-app shDockerfile
Node.js Application
# Use official Node.js image
FROM node:20-alpine
# Set working directory
WORKDIR /app
# Copy package files
COPY package*.json ./
# Install dependencies
RUN npm ci --only=production
# Copy application code
COPY . .
# Build application
RUN npm run build
# Expose port
EXPOSE 3000
# Start application
CMD ["npm", "start"]Multi-Stage Build
# Build stage
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Production stage
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
EXPOSE 3000
CMD ["npm", "start"]Build Image
docker build -t my-app:1.0 .Docker Compose
docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=development
- DATABASE_URL=postgres://user:pass@db:5432/mydb
volumes:
- .:/app
- /app/node_modules
depends_on:
- db
- redis
db:
image: postgres:15-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
postgres_data:Compose Commands
# Start services
docker-compose up -d
# Stop services
docker-compose down
# View logs
docker-compose logs -f
# Rebuild
docker-compose up -d --build
# Remove volumes too
docker-compose down -v.dockerignore
node_modules
npm-debug.log
Dockerfile
.dockerignore
.git
.gitignore
.env
README.md
dist
coverageNetworking
# Create network
docker network create my-network
# Run container on network
docker run -d --network my-network --name api my-api
# Containers can communicate by name
# api:3000 from another container on same networkVolumes
# Create volume
docker volume create my-data
# Mount volume
docker run -v my-data:/app/data my-app
# Mount local directory
docker run -v $(pwd):/app my-appUseful Tips
Clean Up Everything
docker system prune -a --volumesView Resource Usage
docker statsCopy Files
# From container to host
docker cp container:/app/file.txt ./file.txt
# From host to container
docker cp ./file.txt container:/app/file.txtDocker makes your development environment consistent and deployments predictable. Start containerizing your applications today!