Docs
/
Docker Kubernetes
Chapter 3

03 — Container Management

Running Containers

# Basic run
docker run nginx

# Common flags
docker run \
  -d                          # Detached (background)
  --name web                  # Container name
  -p 8080:80                  # Host:Container port mapping
  -e NODE_ENV=production      # Environment variable
  -v /host/data:/data         # Volume mount
  --restart unless-stopped    # Restart policy
  --memory 512m               # Memory limit
  --cpus 1.5                  # CPU limit
  nginx:alpine

Lifecycle Commands

# Start / Stop / Restart
docker start <name|id>
docker stop <name|id>          # Graceful (SIGTERM, then SIGKILL after 10s)
docker kill <name|id>          # Force stop (SIGKILL)
docker restart <name|id>

# Remove
docker rm <name|id>            # Remove stopped container
docker rm -f <name|id>         # Force remove running container

# Inspect
docker inspect <name|id>       # Full JSON details
docker inspect --format '{{.NetworkSettings.IPAddress}}' <name>
docker stats                   # Live resource usage (CPU, memory, network)
docker top <name|id>           # Running processes inside container

Logs

docker logs <name|id>            # All logs
docker logs -f <name|id>         # Follow (tail -f)
docker logs --tail 100 <name|id> # Last 100 lines
docker logs --since 1h <name|id> # Last hour
docker logs -t <name|id>         # With timestamps

# Log drivers (configure in daemon.json or per-container)
docker run --log-driver json-file --log-opt max-size=10m --log-opt max-file=3 my-app

Executing Commands Inside Containers

# Interactive shell
docker exec -it <name|id> sh        # sh (alpine)
docker exec -it <name|id> bash      # bash (debian/ubuntu)

# Run specific command
docker exec <name|id> ls /app
docker exec <name|id> cat /app/config.json
docker exec <name|id> env           # View environment variables

# As a specific user
docker exec -u root <name|id> sh

Resource Limits

# Memory
docker run --memory 256m my-app              # Hard limit
docker run --memory 256m --memory-swap 512m  # Hard + swap

# CPU
docker run --cpus 1.5 my-app                 # 1.5 CPU cores
docker run --cpu-shares 512 my-app           # Relative weight (default 1024)

# Combined
docker run -d \
  --memory 512m \
  --cpus 2 \
  --pids-limit 100 \
  my-app
# Monitor resource usage
docker stats
# CONTAINER   CPU %   MEM USAGE / LIMIT   MEM %   NET I/O       BLOCK I/O
# web         2.5%    128MiB / 512MiB      25%     1.2MB / 500kB 0B / 0B

Restart Policies

PolicyBehavior
noNever restart (default)
on-failureRestart only on non-zero exit code
on-failure:5Restart on failure, max 5 attempts
alwaysAlways restart (even on docker stop, restarts on daemon start)
unless-stoppedLike always but not after manual docker stop
docker run -d --restart unless-stopped --name api my-app

# Update restart policy of running container
docker update --restart always <name>

Copying Files

# Container → Host
docker cp <name>:/app/logs/error.log ./error.log

# Host → Container
docker cp ./config.json <name>:/app/config.json

Container Cleanup

# Remove stopped containers
docker container prune

# Remove unused images
docker image prune
docker image prune -a          # All unused (not just dangling)

# Remove unused volumes
docker volume prune

# Remove everything unused
docker system prune            # Containers + networks + dangling images
docker system prune -a         # + all unused images
docker system prune --volumes  # + unused volumes

# Check disk usage
docker system df

Key Takeaways

  • Use -d for background, -p for ports, -e for env vars, -v for volumes
  • docker exec -it <id> sh to debug inside running containers
  • Set memory and CPU limits to prevent containers from consuming all resources
  • Use --restart unless-stopped for production containers
  • docker logs -f for real-time log streaming; --tail and --since for filtering
  • Run docker system prune -a --volumes periodically to reclaim disk space
  • docker stats for live resource monitoring