free · study guide

Learn DevOps in order, not in circles.

A skill-level track through Docker, Linux, Git, Terraform, Kubernetes, AWS and CI/CD — each topic has a short tutorial, a command cheat sheet, a downloadable-preview PDF, and a quiz to check yourself. Start where you are.

Your progress0 / 10 topics

Start here if you're new to DevOps. These four topics cover the tools you'll touch every single day, before any cloud or orchestration.

>_
Linux & the command line
The interface behind every server you'll ever touch
⚡ 4-min read📄 2-page PDF📦 Code included
▸

Every server you'll manage — whether it's a bare EC2 instance or a container inside a Kubernetes pod — runs Linux under the hood. You don't need to memorize the kernel, but you need to be fast at navigating a filesystem, reading logs, and managing processes without a GUI.

Start with the filesystem. Everything in Linux is a file, including devices and processes. /etc holds configuration, /var/log holds logs, /home holds user data. Get comfortable moving around with cd, listing with ls -la, and reading with cat, less, and tail -f for live logs.

Permissions matter more than beginners expect. The classic "permission denied" is usually solved with chmod or chown, not by running everything as root — a habit that will bite you later in production.

Processes and resources. Learn ps aux, top or htop, and kill. When something's using too much CPU or memory, this is where you look first — before you ever touch Kubernetes.

ls -lalist files with permissions
cd /pathchange directory
tail -f file.logstream a log file live
chmod 644 fileset read/write permissions
ps aux | grep namefind a running process
kill -9 PIDforce-stop a process
df -hcheck disk space
1. Which command lets you watch a log file update in real time?
2. What does chmod control?

Full study PDF for Linux & the Command Line — watermarked, preview only.

Open PDF preview →
git
Git fundamentals
Version control every DevOps workflow depends on
⚡ 3-min read📄 2-page PDF📦 Code included
▸

Git isn't just for application code — your Terraform files, Kubernetes manifests, and CI/CD pipelines all live in Git too. Infrastructure as Code means your infrastructure changes go through the exact same review process as a code change.

Branches and pull requests are how teams avoid stepping on each other. Never commit directly to main on a real project — branch, commit, open a pull request, get it reviewed.

Commit messages matter more in infra repos than app repos, because a bad Terraform change can take down real infrastructure. Write commit messages that explain the "why," not just the "what."

git statussee what's changed
git checkout -b branchcreate and switch to a branch
git add . && git commit -m ""stage and commit changes
git push origin branchpush a branch upstream
git log --onelinecompact commit history
git revert commit_hashsafely undo a commit
1. What's the safest way to undo a bad commit that's already been pushed?

Full study PDF for Git Fundamentals — watermarked, preview only.

Open PDF preview →
🐳
Docker basics
Packaging an app so it runs the same everywhere
⚡ 4-min read📄 2-page PDF📦 Code included
▸

Docker solves one specific problem: "it works on my machine." A container packages your app with everything it needs — runtime, libraries, config — so it behaves identically on your laptop, in staging, and in production.

An image is a blueprint; a container is a running instance of that blueprint. You build an image once from a Dockerfile, then run as many containers from it as you need.

Keep images small. Use slim base images, multi-stage builds, and a .dockerignore file. A bloated image slows every deploy and widens your attack surface.

Containers are ephemeral by design. Don't store important data inside a container's writable layer — use volumes for anything that needs to persist.

docker build -t name .build an image from a Dockerfile
docker run -p 8080:80 namerun a container, map ports
docker pslist running containers
docker logs -f idstream container logs
docker exec -it id shshell into a running container
docker system pruneclean up unused images/containers
1. Where should you store data that needs to survive a container restart?

Full study PDF for Docker Basics — watermarked, preview only.

Open PDF preview →
☁
Cloud fundamentals (AWS)
The concepts before you touch the console
⚡ 4-min read📄 1-page PDF📦 Code included
▸

Before diving into Terraform or EKS, get the core AWS building blocks straight — most confusion later comes from skipping this.

  • Regions and Availability Zones — a region is a geographic area (e.g. us-east-1), made of isolated AZs. Spread resources across AZs for resilience.
  • VPC — your own private network inside AWS. Subnets, route tables, and gateways all live here.
  • IAM — controls who can do what. Almost every "access denied" error you'll debug in this career traces back to IAM.
  • EC2 vs managed services — EC2 is a raw virtual machine you manage yourself; most modern DevOps work leans on managed services (EKS, RDS, S3) to reduce operational burden.

Get comfortable reading an architecture diagram before you get comfortable clicking around the console — it'll save you from cargo-culting Terraform you don't understand.

aws configureset up CLI credentials
aws sts get-caller-identityconfirm which identity you're using
aws ec2 describe-instanceslist EC2 instances
aws s3 lslist S3 buckets
1. Most "access denied" errors in AWS trace back to which service?

Full study PDF for Cloud Fundamentals (AWS) — watermarked, preview only.

Open PDF preview →

Once the fundamentals are solid, this is where you start automating infrastructure and running real workloads.

tf
Terraform basics
Infrastructure as code, not click-ops
⚡ 5-min read📄 5-page PDF📦 Code included
▸

Terraform describes your infrastructure in code so it's repeatable, reviewable, and versioned — instead of clicking through a console and hoping someone remembers what they changed.

State is the part beginners underestimate. Terraform's state file is its source of truth about what exists. Never edit it by hand, and never leave it on a laptop — use a remote backend (S3 + DynamoDB locking is the standard AWS pattern) so your team shares one source of truth.

Always plan before you apply. terraform plan shows exactly what will change before it happens. Skipping this step is how people accidentally delete production databases.

Modules let you package reusable infrastructure patterns (a VPC, an EKS cluster) so you're not rewriting the same 200 lines for every environment.

terraform initinitialize working directory + providers
terraform planpreview changes before applying
terraform applyapply changes to real infra
terraform destroytear down managed resources
terraform fmtauto-format config files
terraform state listlist resources in state
1. Why use a remote backend for Terraform state instead of local?

Full study PDF for Terraform Basics — watermarked, preview only.

Open PDF preview →
⎈
Kubernetes fundamentals
Running containers at scale
⚡ 5-min read📄 5-page PDF📦 Code included
▸

Docker runs one container. Kubernetes runs thousands of them, reliably, across many machines — restarting what crashes, spreading load, and rolling out updates without downtime.

Pods are the smallest unit — usually one container each, though a pod can hold more. You rarely create pods directly; you describe a Deployment, and Kubernetes keeps the right number of pods running for you.

Services give a stable network identity to a moving set of pods. Pods die and get replaced constantly — a Service is what stays consistent so other things can find them.

CrashLoopBackOff is the error every beginner meets — it means your pod is starting, crashing, and Kubernetes is retrying with backoff. Always check kubectl logs and kubectl describe pod first, in that order.

kubectl get podslist pods in current namespace
kubectl describe pod namedetailed pod status + events
kubectl logs -f namestream pod logs
kubectl apply -f file.yamlapply a manifest
kubectl exec -it pod -- shshell into a pod
kubectl rollout restart deploy/namerestart a deployment
1. Your pod is stuck in CrashLoopBackOff. What's the first command to run?

Full study PDF for Kubernetes Fundamentals — watermarked, preview only.

Open PDF preview →
↻
CI/CD pipelines
Shipping changes without manual steps
⚡ 4-min read📄 5-page PDF📦 Code included
▸

Continuous Integration means every code change is automatically built and tested the moment it's pushed — catching problems in minutes, not weeks. Continuous Deployment takes it further and automatically ships changes that pass those checks.

A typical pipeline: push code → run tests → build a container image → push image to a registry → deploy to staging → (manual or automatic) promote to production.

Keep pipelines fast. A 40-minute pipeline gets skipped, ignored, or bypassed under pressure. Parallelize test suites and cache dependencies aggressively.

Treat your pipeline config as code too — reviewed, versioned, and tested like everything else in the repo.

on: pushtrigger on every push (GitHub Actions)
on: pull_requesttrigger on PR open/update
jobs.build.stepsordered list of pipeline steps
needs: [build]declare job dependencies
1. Why is pipeline speed important beyond convenience?

Full study PDF for CI/CD Pipelines — watermarked, preview only.

Open PDF preview →

For engineers running production systems — this is about resilience, security, and scale, not just getting something working.

⎈+
Kubernetes networking & scaling
What happens under real traffic
⚡ 5-min read📄 1-page PDF📦 Code included
▸

At scale, the questions change from "does it run" to "does it survive a bad day." Networking and autoscaling are where that gets tested.

Ingress vs Service — a Service load-balances inside the cluster; an Ingress controller handles external HTTP(S) traffic, routing by host or path to the right Service, usually with TLS termination.

HPA (Horizontal Pod Autoscaler) scales pod count based on CPU, memory, or custom metrics. Pair it with resource requests and limits — without them, the scheduler is guessing, and the autoscaler has nothing reliable to measure.

Network policies default to allowing all pod-to-pod traffic — a security gap most teams don't close until an audit forces them to. Explicit-deny-by-default with targeted allow rules is the safer pattern in production.

kubectl top podslive CPU/memory usage per pod
kubectl get hpaview autoscaler status
kubectl get networkpolicylist active network policies
kubectl get ingresslist ingress routes
1. Without resource requests/limits set, what happens to the HPA?

Full study PDF for Kubernetes Networking & Scaling — watermarked, preview only.

Open PDF preview →
tf+
Terraform modules & state at scale
Managing infra across teams and environments
⚡ 5-min read📄 1-page PDF📦 Code included
▸

One giant Terraform state file for your entire company is a liability — a mistake anywhere can block changes everywhere, and applies get slower as state grows.

Split state by environment and blast radius. Separate state for networking, for each environment (dev/staging/prod), and for high-change-frequency components — so a bad apply in dev can never touch prod state.

Use workspaces carefully. Terraform workspaces are useful for near-identical environments, but many teams find separate state files with shared modules easier to reason about than workspaces at real scale.

Drift happens when someone changes infra outside Terraform (console click-ops, another tool). Run terraform plan regularly even with no code changes, to catch drift before it surprises you mid-incident.

terraform workspace listlist available workspaces
terraform state mvmove a resource within state
terraform importbring existing infra under management
terraform plan -refresh-onlydetect drift without changing infra
1. What's the main risk of one giant shared state file across your whole company?

Full study PDF for Terraform Modules & State at Scale — watermarked, preview only.

Open PDF preview →
🔒
IAM & cloud security
Least privilege, in practice
⚡ 4-min read📄 1-page PDF📦 Code included
▸

Most real security incidents in the cloud aren't exotic hacks — they're an overly broad IAM policy or a leaked key.

Least privilege means every role gets only the permissions it needs, nothing more. It's tedious to set up and it's the single biggest thing that limits damage when something does go wrong.

Never use long-lived access keys where you can avoid it. Use IAM roles with short-lived credentials — for CI/CD, OIDC federation lets your pipeline assume a role without storing any secret at all.

Secrets don't belong in code, ever — not in a repo, not in a Terraform variable file. Use a secrets manager (AWS Secrets Manager, Vault) and inject at runtime.

aws iam simulate-principal-policytest what a role can actually do
aws iam list-attached-role-policiesaudit a role's permissions
aws secretsmanager get-secret-valueretrieve a secret at runtime
1. What's the recommended way for a CI/CD pipeline to authenticate to AWS?

Full study PDF for IAM & Cloud Security — watermarked, preview only.

Open PDF preview →