Home› DevOps› Complete Guide
Complete Guide

Complete DevOps Tutorial

Modern software doesn't just get written — it gets deployed, monitored and scaled. This guide covers all 304 DevOps tutorials on TheCodeForge, including Docker, Kubernetes, CI/CD, AWS and Linux.

Learning Roadmap
Beginner → Learn Linux, bash scripting and basic networking
Intermediate → Work with Docker, CI/CD pipelines and cloud fundamentals
Advanced → Master Kubernetes, infrastructure as code and production monitoring
304
Topics
76
Beginner
142
Intermediate
86
Advanced
Jump to section
Linux (19)Git (53)Docker (25)Kubernetes (15)CI/CD (15)Cloud (13)AWS (14)Monitoring (9)Ansible (24)Google Cloud (4)AutoSys (30)Jenkins (39)Airflow (37)Platform (1)Productivity (1)Networking (5)

DevOps is not a tool set, and the fastest way to see that is to notice which knowledge survives a job change. The kubectl flags do not. What does is the ability to reason about a system you did not build: to trace a request through every hop, to tell a saturation problem from a configuration problem, and to know what changed.

Almost every incident reduces to four questions. What changed? Where in the request path does it break? Is the failure resource exhaustion or misconfiguration? And what is the fastest safe mitigation while you diagnose? Everything in this track is in service of answering those faster.

Containers are processes, and that explains the error messages

A container is a normal Linux process with namespaces limiting what it can see and cgroups limiting what it can consume. There is no guest kernel. Internalising that one fact answers most container questions before they are asked: why startup is instant, why you cannot run a different kernel, why isolation is weaker than a virtual machine's, and why a process died at exactly its memory limit.

It also reframes image building. A layer is a filesystem diff, cached by the instruction that produced it, so ordering decides your build times: anything that changes rarely goes first. And a secret in any layer is in the image permanently, even if a later layer deletes the file — the earlier layer still contains it.

dockerfile
# Dependencies first: this layer is cached until the manifest changes
FROM node:22-slim AS deps
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev

# Source last: the layer that changes on every commit
FROM node:22-slim
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .

# Run unprivileged, and forward signals properly so SIGTERM reaches the app
USER node
CMD ["node", "server.js"]
In practiceA container that ignores SIGTERM is killed hard after the grace period, dropping in-flight requests on every deploy. Two causes cover most of it: a shell-form CMD that makes the shell PID 1 and swallows the signal, and an application with no shutdown handler. Use exec form and handle the signal.

The five Kubernetes failures, and what actually tells you which

StateMeansRead this
CrashLoopBackOffThe process starts and exits repeatedlykubectl logs --previous — the crashed container, not the replacement
ImagePullBackOffThe image cannot be fetcheddescribe pod events: wrong tag, missing pull secret, registry permission
OOMKilledExceeded the container memory limitdescribe pod. Size the runtime's heap below the cgroup limit — total memory is more than heap
PendingNo node satisfies requests, taints or affinitydescribe pod scheduling events
Service up, no trafficThe endpoint list is emptykubectl get endpoints — selector mismatch, or readiness never passes

Liveness and readiness probes are worth separating properly, because conflating them causes outages. Readiness controls whether traffic is sent; liveness controls whether the container is restarted. A liveness probe that checks a downstream dependency will restart your healthy pods during that dependency's outage — turning someone else's incident into yours.

Debug outside in, and mitigate before you diagnose

Under pressure the temptation is to start where you last found a bug. A repeatable outside-in order is faster and far less likely to send you down a familiar but wrong path: establish the blast radius, check what changed, then walk the request path hop by hop asking whether the request arrives and whether it is answered.

And separate mitigation from diagnosis. Rolling back a deploy, shifting traffic or scaling up restores service while you investigate with the pressure off. Diagnosing first while users are affected is the most common reason a ten-minute incident becomes an hour-long one.

bash
# 1. What changed? Almost always the highest-yield question.
kubectl rollout history deploy/api
git log --oneline --since="2 hours ago"

# 2. Mitigate, then investigate
kubectl rollout undo deploy/api

# 3. Walk the path: DNS -> TCP -> TLS -> HTTP
dig +short api.internal
nc -vz api.internal 443
curl -w 'dns %{time_namelookup} tcp %{time_connect} ttfb %{time_starttransfer}\n' \
     -o /dev/null -s https://api.internal/health

# 4. Saturation: CPU, memory, file descriptors, connections
kubectl top pods
ss -s

Pipelines and infrastructure as code

A CI pipeline earns its keep through feedback speed and reproducibility. Fast, cheap checks first — lint, unit tests, type checks — so a broken commit fails in two minutes rather than twenty. Build the artefact once and promote that same artefact through environments; rebuilding per environment means the thing you tested is not the thing you shipped.

For infrastructure as code the recurring themes are state and drift. State belongs in a remote backend with locking and versioning, never in git — it holds resource IDs and often secrets, and git has no locking, so two concurrent applies conflict after the damage rather than before it. Plans should be reviewed like code, and manual console changes should be detected rather than assumed away.

Frequently Asked Questions

Do I need to learn Kubernetes to work in DevOps?
It is the common denominator across most job adverts, so practically yes — but the depth expected is lower than people assume. Know the core objects and their relationships, know the five failure states above, and know how to read events and logs. Operators, custom resources and scheduler internals are specialist territory.
What is the difference between DevOps and SRE?
Overlapping practice, different emphasis. SRE is more explicitly an engineering discipline around reliability — SLIs, SLOs, error budgets, incident response, capacity planning — and usually expects stronger coding. DevOps roles lean toward delivery pipelines, infrastructure as code and platform tooling.
How do I stop being paged for things that do not matter?
Alert on symptoms users experience, not on causes. High CPU is not an incident; elevated error rate or latency is. Every alert should be actionable, should link to a runbook, and should be deleted if nobody acted on it the last five times it fired. Alert fatigue is a bigger reliability risk than most of the things being alerted on.
Should everything be in containers?
No. Containers suit stateless services, batch work and anything needing consistent environments. Databases are frequently better as a managed service; a stateful workload in Kubernetes is a real operational commitment. A cron job on a single virtual machine is sometimes exactly the right answer, and saying so is a sign of judgement rather than a gap.
How much coding is expected?
Enough to write and test a non-trivial script unaided — parse logs, call an API, automate a workflow — usually in Python, Go or Bash. Infrastructure code is code: it should be reviewed, versioned and, where it matters, tested. Roles that build internal platforms expect considerably more.
What is the single highest-value habit?
Writing down what you did during an incident, as you do it, and turning it into a runbook afterwards. It shortens the next incident, it makes you replaceable in the good sense, and it converts individual experience into something the team owns. It is also what blameless postmortems are actually for.

Linux

Git

Introduction to Git Beginner Git Branching and Merging Intermediate Git Rebase vs Merge Intermediate Git Stash and Cherry-pick Intermediate Git Workflows — GitFlow Intermediate GitHub Pull Requests and Code Review Beginner Git Tags and Releases Intermediate Resolving Git Merge Conflicts Intermediate Git Hooks Explained Intermediate Git Clone: Clone a Repository Step by Step Beginner Git Pull: Fetch and Merge Remote Changes Beginner Git Checkout -b: Creating and Switching Branches Beginner Git Delete Local and Remote Branch Beginner Git Squash Commits: Combine Multiple Commits into One Intermediate Git Stash: Save and Restore Work in Progress Beginner Git Cherry Pick: Apply Commits Across Branches Intermediate Git Reset: Hard, Soft and Mixed Explained Intermediate Git Fetch vs Pull: What's the Difference Beginner Git Amend: Edit the Last Commit Beginner Git Init: Creating and Initializing Repositories Beginner Git Add, Commit and Status — The Core Workflow Beginner Git Revert: Safe Undo for Pushed Commits Intermediate Interactive Rebase: Squash, Reword, Edit and Reorder Commits Intermediate Git Bisect: Find the Commit That Introduced a Bug Intermediate Git Submodules: Managing Nested Repositories Advanced Git Internals: Objects, Trees, Blobs and the DAG Advanced Conventional Commits: Standardized Commit Messages Beginner Git Blame: Find Who Changed What and When Intermediate Git Worktree: Work on Multiple Branches Simultaneously Advanced Git Reflog: Recover Lost Commits and Branches Intermediate Git Merge Strategies: Recursive, Ours, Theirs and Octopus Advanced Signed Commits with GPG: Verify Your Identity in Git Intermediate Git LFS: Large File Storage for Git Repositories Intermediate GitHub Issues and Projects: Track Work Beyond Code Beginner GitHub Pages: Host Static Sites from Your Repository Beginner GitHub CLI: Manage Repositories from the Terminal Intermediate Forking and Contributing: The Open Source Workflow Beginner Trunk-Based Development: Merge to Main Multiple Times Daily Intermediate Semantic Release: Automated Versioning and Changelogs Advanced Branch Protection Rules: Secure Your Git Workflow Beginner Git Config and Aliases: Customize Your Git Experience Beginner Git Diff: Spot Changes Before They Become Incidents Beginner Git Log: Master Commit History Search and Filtering Beginner Git Push: Safe Publishing and Force-Push Recovery Beginner Git Remote: Manage Repository Connections Safely Beginner Git Show: Inspect Commits, Tags, and Files in Detail Beginner .gitignore: Prevent Secrets and Bloat From Entering Your Repo Beginner Git Failed to Push Some Refs Fix Beginner Git Detached HEAD Recovery Beginner Git Unrelated Histories Merge Fix Intermediate Git Remote Origin Already Exists Fix Beginner Git Pathspec Did Not Match Fix Beginner Git LF CRLF Warning Fix Beginner

Docker

Kubernetes

CI/CD

Cloud

AWS

Monitoring

Ansible

Google Cloud

AutoSys

Jenkins

Introduction to Jenkins Beginner Jenkins Installation and Setup Beginner Jenkins Upgrading Intermediate Jenkins Architecture: Controller and Agent Beginner Jenkins Freestyle Jobs Beginner Jenkins Freestyle Job Tutorial Beginner Jenkins Plugins Beginner Jenkins Pipeline Basics Intermediate Jenkinsfile: Declarative Pipeline Intermediate Jenkins Pipeline Unit Testing Advanced Jenkins Scripted Pipeline and Groovy Intermediate Jenkins Pipeline Stages and Parallel Execution Intermediate Jenkins Shared Libraries Advanced Jenkins Multibranch Pipeline Intermediate Jenkins GitHub Integration and Webhooks Intermediate Trigger Jenkins Pipeline with GitHub Webhook Intermediate Jenkins Maven Build Intermediate Jenkins Artifact Management Intermediate Jenkins Docker Integration Intermediate Jenkins Kubernetes Deployment Advanced Jenkins SonarQube Quality Gates Intermediate Jenkins Credentials and Secrets Management Intermediate Jenkins Security and RBAC Advanced Jenkins Distributed Builds and Agents Advanced Jenkins Configuration as Code (JCasC) Advanced Jenkins Job DSL Advanced Jenkins Monitoring with Prometheus Advanced Jenkins Performance Tuning Advanced Jenkins High Availability Advanced Jenkins Pipeline Best Practices Advanced Jenkins Security Best Practices Advanced Jenkins Supply Chain Security Advanced Jenkins Backup and Restore Advanced Jenkins Kubernetes Integration Advanced Jenkins Groovy Scripting for Pipelines Advanced Jenkins REST API & CLI Automation Advanced Jenkins Email Notification Setup Intermediate Jenkins Environment Variables Reference Intermediate Jenkins Build Triggers Intermediate

Airflow

Introduction to Apache Airflow Beginner Airflow Installation and Setup Beginner Airflow DAGs Explained Beginner Airflow Operators Basics Beginner Airflow Scheduling and Catchup Intermediate Airflow Task Lifecycle and Retries Intermediate Airflow XComs for Data Passing Intermediate Airflow TaskFlow API Intermediate Airflow Connections and Hooks Intermediate Airflow Variables and Pools Intermediate Airflow Branching and Trigger Rules Intermediate Airflow Sensors Intermediate Airflow Conditional Execution Intermediate Airflow ETL Pipeline End to End Intermediate Airflow Providers Explained Intermediate Airflow Snowflake Integration Advanced Airflow dbt ELT Orchestration Advanced Airflow Dynamic DAGs and Task Mapping Advanced Airflow Backfill and Catchup in Depth Advanced Airflow Datasets and Assets Scheduling Advanced Airflow Executors Explained Advanced Airflow Docker Compose Setup Intermediate Airflow Celery Executor Setup Advanced Airflow on Kubernetes Advanced Airflow Configuration and Environment Advanced Airflow High Availability Setup Advanced Airflow Testing with Pytest Advanced Airflow CI/CD Deployment Advanced Airflow Monitoring and Logging Advanced Airflow Performance Tuning Advanced Airflow Security RBAC and Secrets Advanced Airflow Data Quality Gates Advanced Airflow Deferrable Operators and Triggerer Advanced Airflow Object Storage Workflows Advanced Airflow Human in the Loop Approvals Advanced Airflow vs Prefect vs Dagster Advanced Airflow in Production Capstone Advanced

Platform

Productivity

Networking

Interview prep
→DevOps Interview Questions
Also Explore
Rust 26 tutorials → CS Fundamentals 76 tutorials → Cloud 12 tutorials → Observability 10 tutorials → Security 16 tutorials → Testing 12 tutorials →
Start from the beginning

Every tutorial starts with a plain-English analogy — then real code, then interview questions.

Browse DevOps Tutorials →