Docker Fundamentals for Developers

February 20, 2024 (1y ago)

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 docker

Linux (Ubuntu)

sudo apt update
sudo apt install docker.io docker-compose
sudo systemctl enable docker
sudo usermod -aG docker $USER

Essential 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 prune

Containers

# 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 sh

Dockerfile

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
coverage

Networking

# 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 network

Volumes

# 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-app

Useful Tips

Clean Up Everything

docker system prune -a --volumes

View Resource Usage

docker stats

Copy Files

# From container to host
docker cp container:/app/file.txt ./file.txt
 
# From host to container
docker cp ./file.txt container:/app/file.txt

Docker makes your development environment consistent and deployments predictable. Start containerizing your applications today!