<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: E-Learning Sherdil</title>
    <description>The latest articles on DEV Community by E-Learning Sherdil (@elearning_sherdil_783bbb).</description>
    <link>https://dev.to/elearning_sherdil_783bbb</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3964965%2F93f4560a-e89f-48d7-afa6-dfabad7708c7.png</url>
      <title>DEV Community: E-Learning Sherdil</title>
      <link>https://dev.to/elearning_sherdil_783bbb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/elearning_sherdil_783bbb"/>
    <language>en</language>
    <item>
      <title>AWS vs Azure vs GCP (2026): Which Cloud Certification Should You Get First?</title>
      <dc:creator>E-Learning Sherdil</dc:creator>
      <pubDate>Sat, 06 Jun 2026 11:19:07 +0000</pubDate>
      <link>https://dev.to/elearning_sherdil_783bbb/aws-vs-azure-vs-gcp-2026-which-cloud-certification-should-you-get-first-132</link>
      <guid>https://dev.to/elearning_sherdil_783bbb/aws-vs-azure-vs-gcp-2026-which-cloud-certification-should-you-get-first-132</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;This article was originally published on &lt;a href="https://elearning.sherdil.org/pages/aws-vs-azure-vs-gcp-certification" rel="noopener noreferrer"&gt;Sherdil E-Learning&lt;/a&gt;.&lt;/strong&gt; I'm republishing it here so the dev.to community can benefit too.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Choosing between &lt;strong&gt;AWS, Azure, and Google Cloud&lt;/strong&gt; is the biggest decision every aspiring cloud professional makes. The wrong choice costs months of study time and puts you in a smaller job market. The right one accelerates your career.&lt;/p&gt;

&lt;p&gt;This guide compares the three platforms on what actually matters in 2026 — market share, job volume, certification cost and difficulty, freelance demand, and the kind of work you'll actually do once hired. It's written for fresh graduates, working professionals planning a switch, and freelancers selling cloud services internationally.&lt;/p&gt;




&lt;h2&gt;
  
  
  At-a-glance comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;AWS&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Azure&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;GCP&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Global market share&lt;/strong&gt; (Q4 2025)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;31%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;25%&lt;/td&gt;
&lt;td&gt;11%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Entry-level cert&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud Practitioner (CLF-C02)&lt;/td&gt;
&lt;td&gt;AZ-900 Fundamentals&lt;/td&gt;
&lt;td&gt;Cloud Digital Leader&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Entry cert cost (USD)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$100&lt;/td&gt;
&lt;td&gt;~$99&lt;/td&gt;
&lt;td&gt;~$99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Associate-level cert&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Solutions Architect Associate&lt;/td&gt;
&lt;td&gt;AZ-104 Administrator&lt;/td&gt;
&lt;td&gt;Associate Cloud Engineer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Maximum job options, freelance&lt;/td&gt;
&lt;td&gt;Corporate / enterprise / gov&lt;/td&gt;
&lt;td&gt;Data, ML, premium freelance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Difficulty of first exam&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Beginner-friendly&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Easiest&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Slightly harder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Freelance rate (Upwork, 2026)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$25–$50/hr&lt;/td&gt;
&lt;td&gt;$25–$45/hr&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$35–$70/hr&lt;/strong&gt; (scarcity)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  AWS: the safest first pick for most candidates
&lt;/h2&gt;

&lt;p&gt;AWS holds &lt;strong&gt;31% of the global cloud infrastructure market&lt;/strong&gt; as of Q4 2025 (Synergy Research). That scale shows up directly in job listings — &lt;strong&gt;AWS-specific roles outnumber Azure roles roughly 2:1 and GCP roles roughly 5:1&lt;/strong&gt; in active 2026 postings. Most multinational employers, software houses, and freelance clients on Upwork default to AWS, so an AWS certification opens the widest range of doors.&lt;/p&gt;

&lt;p&gt;The recommended path for beginners is the &lt;strong&gt;AWS Certified Cloud Practitioner (CLF-C02)&lt;/strong&gt; — around $100 USD, foundational coverage of AWS services, pricing, and the shared responsibility model. The next step is the &lt;strong&gt;AWS Solutions Architect Associate (SAA-C03)&lt;/strong&gt;, one of the most globally recognised cloud certifications and a common credential for remote international roles.&lt;/p&gt;

&lt;p&gt;For a structured path, the &lt;a href="https://elearning.sherdil.org/courses/aws-solutions-architect" rel="noopener noreferrer"&gt;Sherdil AWS 3-in-1 Training Bundle&lt;/a&gt; covers Cloud Practitioner, Solutions Architect Associate, and SysOps Administrator together.&lt;/p&gt;




&lt;h2&gt;
  
  
  Azure: the enterprise and government choice
&lt;/h2&gt;

&lt;p&gt;Azure is the cloud of choice for organisations that already run Microsoft software — &lt;strong&gt;banks, telecoms, large government departments, and any multinational standardised on Microsoft 365 and Active Directory&lt;/strong&gt;. If you want a stable corporate-sector role rather than freelance or startup work, Azure is often the stronger pick.&lt;/p&gt;

&lt;p&gt;The entry point is the &lt;strong&gt;AZ-900 Azure Fundamentals&lt;/strong&gt; exam — widely considered the &lt;strong&gt;easiest cloud certification on the market&lt;/strong&gt;. After AZ-900, &lt;strong&gt;AZ-104 (Azure Administrator Associate)&lt;/strong&gt; is the credential that employers actually filter resumes by. For security-focused roles, &lt;strong&gt;AZ-500&lt;/strong&gt; is the natural follow-up.&lt;/p&gt;




&lt;h2&gt;
  
  
  GCP: the data, AI, and premium-freelance specialist
&lt;/h2&gt;

&lt;p&gt;Google Cloud is the smallest of the three by market share (&lt;strong&gt;11% globally&lt;/strong&gt;, Synergy Research Q4 2025) but it punches above its weight in two areas: &lt;strong&gt;data engineering with BigQuery&lt;/strong&gt;, and &lt;strong&gt;ML workloads via Vertex AI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;GCP-certified professionals are rare, which keeps competition low and freelance rates high — &lt;strong&gt;typically 20–40% above the AWS equivalent on Upwork&lt;/strong&gt; for data and ML work.&lt;/p&gt;

&lt;p&gt;The two entry points are &lt;strong&gt;Cloud Digital Leader&lt;/strong&gt; (non-technical, conceptual) and &lt;strong&gt;Associate Cloud Engineer&lt;/strong&gt; (hands-on, better if you already have IT background). The &lt;strong&gt;Professional Cloud Architect&lt;/strong&gt; certification, once you're ready, is consistently ranked among the &lt;strong&gt;highest-paying IT certifications globally&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Freelance rate snapshot (Upwork, 2026)
&lt;/h2&gt;

&lt;p&gt;For certified engineers competing on Upwork in 2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Typical hourly range (USD)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$25–$50/hr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Azure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$25–$45/hr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;GCP&lt;/strong&gt; (data + ML)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$35–$70/hr&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;GCP's scarcity premium is real — fewer certified professionals in the market means consistently higher rates for the engineers who hold the credential.&lt;/p&gt;




&lt;h2&gt;
  
  
  Which one should you pick first?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Want maximum job options + international freelance?&lt;/strong&gt; → &lt;strong&gt;Start with AWS.&lt;/strong&gt; Largest job volume, biggest Upwork market, broadest tooling ecosystem. Cloud Practitioner is a gentle first exam.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Want corporate-sector / enterprise / government work?&lt;/strong&gt; → &lt;strong&gt;Start with Azure.&lt;/strong&gt; AZ-900 is the easiest cloud certification to pass. AZ-104 opens the most interview doors at the next level. Especially strong if your target employer already runs Microsoft 365.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interested in data engineering, ML, or Kubernetes-heavy DevOps?&lt;/strong&gt; → &lt;strong&gt;Start with GCP.&lt;/strong&gt; Fewer GCP-certified candidates means highest remote-work premium. Google Cloud has stronger native tooling for data and ML workloads.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No strong preference?&lt;/strong&gt; → &lt;strong&gt;AWS is the lower-risk pick.&lt;/strong&gt; Most likely to lead to a first job. Concepts transfer cleanly to Azure and GCP if you expand later.&lt;/p&gt;




&lt;h2&gt;
  
  
  The multicloud advantage
&lt;/h2&gt;

&lt;p&gt;The best mid-career strategy in 2026 is &lt;strong&gt;not&lt;/strong&gt; to stop at one certification. Companies increasingly run &lt;strong&gt;two or even all three major clouds simultaneously&lt;/strong&gt; to avoid vendor lock-in and to use the best service from each.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Engineers fluent in multiple clouds earn 20–40% more than single-cloud specialists at the senior level&lt;/strong&gt; (Stack Overflow Developer Survey 2025).&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://elearning.sherdil.org/bundles/cloud-pro-starter-pack" rel="noopener noreferrer"&gt;Sherdil Cloud Pro Starter Pack&lt;/a&gt; covers AWS, Azure, and GCP foundations in a single track for candidates who want all three options open from the start.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Which cloud certification is easiest to pass?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;AZ-900 Azure Fundamentals&lt;/strong&gt; is widely accepted as the easiest. &lt;strong&gt;AWS Cloud Practitioner&lt;/strong&gt; is also beginner-friendly. Both can be passed in &lt;strong&gt;four to eight weeks&lt;/strong&gt; of part-time study with no prior IT background. GCP certifications tend to require a bit more technical fluency upfront.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long does it take to get certified?
&lt;/h3&gt;

&lt;p&gt;With one to two hours of daily study, most beginners pass a foundational certification in &lt;strong&gt;four to eight weeks&lt;/strong&gt;. Associate-level certifications (Solutions Architect Associate, AZ-104, Associate Cloud Engineer) typically need &lt;strong&gt;three to six months&lt;/strong&gt; including hands-on lab practice.&lt;/p&gt;

&lt;h3&gt;
  
  
  How much do these certifications cost?
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Certification&lt;/th&gt;
&lt;th&gt;Cost (USD)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AWS Cloud Practitioner&lt;/td&gt;
&lt;td&gt;~$100&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS Solutions Architect Associate&lt;/td&gt;
&lt;td&gt;~$150&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AZ-900&lt;/td&gt;
&lt;td&gt;~$99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AZ-104&lt;/td&gt;
&lt;td&gt;~$165&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GCP Cloud Digital Leader&lt;/td&gt;
&lt;td&gt;~$99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GCP Associate Cloud Engineer&lt;/td&gt;
&lt;td&gt;~$125&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All three vendors run periodic discounts and free certification vouchers through their training programmes — worth checking before booking.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I get a cloud job without a degree?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Yes.&lt;/strong&gt; Cloud certifications are industry credentials that most employers value as much as or more than a traditional degree, particularly for first or second jobs. A strong GitHub portfolio with &lt;strong&gt;two or three deployed projects&lt;/strong&gt; (a static site on S3, a small API on EC2 behind a load balancer, an Azure Functions workflow) plus &lt;strong&gt;one certification&lt;/strong&gt; is the minimum-viable application package for entry-level cloud roles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Will AI tools replace cloud engineers?
&lt;/h3&gt;

&lt;p&gt;AI assistants speed up specific tasks — writing Terraform, generating IAM policies, debugging CloudWatch logs — but cloud-engineering job postings have &lt;strong&gt;grown, not shrunk&lt;/strong&gt;, in 2025 and 2026. The shift is towards engineers who &lt;strong&gt;use AI tools effectively&lt;/strong&gt; rather than away from the role itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I work remotely for international companies?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Yes — and this is one of the highest-leverage paths available.&lt;/strong&gt; Cloud engineers with an AWS or GCP certification regularly land remote roles paying in USD or EUR. Usual requirements: strong written English, a verifiable GitHub portfolio, an Upwork or LinkedIn profile with at least two completed client projects, and at least &lt;strong&gt;four working hours of overlap&lt;/strong&gt; with Europe or US East Coast.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is it worth getting certified in 2026?
&lt;/h3&gt;

&lt;p&gt;Demand for certified cloud professionals continues to &lt;strong&gt;outpace supply globally&lt;/strong&gt; — Gartner forecasts the global cloud services market to reach roughly &lt;strong&gt;$1.3 trillion by 2027&lt;/strong&gt;. A first cloud certification in 2026 is one of the highest-return training investments available to IT professionals.&lt;/p&gt;




&lt;h2&gt;
  
  
  Next steps
&lt;/h2&gt;

&lt;p&gt;The right cloud certification for you is the one that matches the work you actually want to do — &lt;strong&gt;not&lt;/strong&gt; the one with the largest market share or the highest theoretical salary. Use the decision framework above, pick one, and start.&lt;/p&gt;

&lt;p&gt;For a structured deep-dive, the &lt;a href="https://elearning.sherdil.org/pages/aws-vs-azure-vs-gcp-certification" rel="noopener noreferrer"&gt;AWS, Azure &amp;amp; GCP 3-in-1 Training Bundle&lt;/a&gt; is the most common starting point at Sherdil. For candidates who want all three platforms covered, the &lt;strong&gt;Cloud Pro Starter Pack&lt;/strong&gt; covers AWS, Azure, and GCP foundations in one track.&lt;/p&gt;




&lt;h2&gt;
  
  
  About the author
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Muhammad Usman Khan&lt;/strong&gt; is a Lead Cloud Instructor at &lt;a href="https://elearning.sherdil.org" rel="noopener noreferrer"&gt;Sherdil E-Learning&lt;/a&gt;, holding the Alibaba Cloud ACP certification along with AWS and Azure credentials. He is an expert trainer in AWS and Google Cloud, having delivered &lt;strong&gt;1,500+ hours of training across 12+ countries&lt;/strong&gt; and completed 50+ multi-cloud projects.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;💬 &lt;strong&gt;Found this useful?&lt;/strong&gt; Drop a ❤️ or a 🦄, and let me know in the comments which path you chose — AWS for breadth, Azure for enterprise, or GCP for the data/ML premium?&lt;/p&gt;

&lt;p&gt;📖 &lt;strong&gt;Full original article (with PKR salary tables and Pakistan-specific market data):&lt;/strong&gt; &lt;a href="https://elearning.sherdil.org/pages/aws-vs-azure-vs-gcp-certification" rel="noopener noreferrer"&gt;elearning.sherdil.org/pages/aws-vs-azure-vs-gcp-certification&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>aws</category>
      <category>azure</category>
      <category>gcp</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Docker for Beginners (2026): From Zero to Your First Dockerfile</title>
      <dc:creator>E-Learning Sherdil</dc:creator>
      <pubDate>Fri, 05 Jun 2026 14:49:05 +0000</pubDate>
      <link>https://dev.to/elearning_sherdil_783bbb/docker-for-beginners-2026-from-zero-to-your-first-dockerfile-4b8d</link>
      <guid>https://dev.to/elearning_sherdil_783bbb/docker-for-beginners-2026-from-zero-to-your-first-dockerfile-4b8d</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;This article was originally published on &lt;a href="https://elearning.sherdil.org/pages/docker-tutorial-pakistan-beginners" rel="noopener noreferrer"&gt;Sherdil E-Learning&lt;/a&gt;.&lt;/strong&gt; I'm republishing it here so the dev.to community can benefit too.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you're a developer or IT professional looking for a practical Docker tutorial, this guide walks you through everything you need to go from zero containers to a working Dockerfile. Docker has changed how modern applications are built, shipped, and deployed — it's now a baseline skill for almost every DevOps and backend role.&lt;/p&gt;

&lt;p&gt;This guide covers what Docker is, why it matters for your career, how to install it on Windows, Ubuntu, and macOS, the core concepts you need to know, hands-on commands you can run today, your first Dockerfile, and where Docker fits in the modern DevOps stack.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Docker?
&lt;/h2&gt;

&lt;p&gt;You build a web application on your laptop. It runs fine. Your teammate pulls the code on their machine and it crashes. The reason is almost always environment differences — different Node versions, missing system libraries, a Python module installed globally on your machine but not theirs.&lt;/p&gt;

&lt;p&gt;Docker solves this by packaging your application along with everything it needs — code, runtime, system tools, libraries, and settings — into a single isolated unit called a &lt;strong&gt;container&lt;/strong&gt;. The container runs identically on any machine that has Docker installed: your laptop, a teammate's laptop, a CI runner, a production server, or a cloud platform.&lt;/p&gt;

&lt;p&gt;The shorter version: &lt;strong&gt;a virtual machine ships a whole operating system per application; Docker ships just the application and its dependencies, with the host operating system shared underneath.&lt;/strong&gt; That difference makes containers start in seconds rather than minutes and weigh megabytes rather than gigabytes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Docker is a high-return skill in 2026
&lt;/h2&gt;

&lt;p&gt;Four practical reasons Docker pays off fast:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Near-default requirement in DevOps and backend job listings.&lt;/strong&gt; Reviewing Q1 2026 listings, roughly two-thirds of DevOps roles and over half of backend developer roles list Docker as a required or preferred skill — many ATS pipelines filter resumes by it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High freelance rates.&lt;/strong&gt; Containerising legacy applications, setting up CI/CD pipelines, and refactoring monoliths into microservices are typical Upwork projects paying &lt;strong&gt;$25 to $60 per hour&lt;/strong&gt; for engineers who can deliver a working Docker bundle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prerequisite for the major cloud platforms.&lt;/strong&gt; AWS ECS, Azure Container Instances, and Google Cloud Run all run Docker containers under the hood, so any production cloud work eventually requires Docker fluency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You cannot meaningfully learn Kubernetes without Docker first.&lt;/strong&gt; Kubernetes orchestrates Docker containers. Every cluster you deploy on is running images you built and pushed to a registry. &lt;strong&gt;Docker is step one of the modern DevOps career path.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Docker vs virtual machines
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Virtual Machine&lt;/th&gt;
&lt;th&gt;Docker Container&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What ships&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full guest OS + app&lt;/td&gt;
&lt;td&gt;App + dependencies only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OS overhead&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One full OS per VM&lt;/td&gt;
&lt;td&gt;Shared host OS kernel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Startup time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Seconds&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gigabytes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Megabytes&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Density&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~10–20 per host&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Hundreds per host&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Use case&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Isolating whole OSes / kernels&lt;/td&gt;
&lt;td&gt;Isolating applications&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Core Docker concepts you need to know
&lt;/h2&gt;

&lt;p&gt;Five terms come up constantly in Docker work. Get comfortable with these and the rest of the ecosystem makes sense.&lt;/p&gt;

&lt;h3&gt;
  
  
  Docker image
&lt;/h3&gt;

&lt;p&gt;A read-only template that contains everything needed to run an application: the code, runtime, libraries, environment variables, and configuration files. Images are built from instructions in a Dockerfile and stored on your machine or in a registry like Docker Hub.&lt;/p&gt;

&lt;h3&gt;
  
  
  Docker container
&lt;/h3&gt;

&lt;p&gt;A running instance of an image. When you run an image, Docker creates a container from it. You can start, stop, restart, and delete containers without affecting the underlying image. &lt;strong&gt;Multiple containers can run from the same image.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Dockerfile
&lt;/h3&gt;

&lt;p&gt;A plain text file with step-by-step instructions for building an image. It specifies the base image (for example Ubuntu or Node.js), the commands to install dependencies, the files to copy in, and the command to run when the container starts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Docker Hub
&lt;/h3&gt;

&lt;p&gt;The largest public registry of Docker images. It hosts official images for Node.js, Python, MySQL, Nginx, Redis, and almost every other common piece of infrastructure. You pull these as base images and build on top of them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Docker Compose
&lt;/h3&gt;

&lt;p&gt;A tool for defining and running multi-container applications. Instead of running each container manually, you create a &lt;code&gt;docker-compose.yml&lt;/code&gt; file that defines all the containers (web server, database, cache, etc.), their relationships, and their networks. One command — &lt;code&gt;docker compose up&lt;/code&gt; — starts everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installing Docker, step by step
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Windows
&lt;/h3&gt;

&lt;p&gt;Download Docker Desktop from &lt;a href="https://docker.com/products/docker-desktop" rel="noopener noreferrer"&gt;docker.com/products/docker-desktop&lt;/a&gt;. Run the installer and enable &lt;strong&gt;WSL 2&lt;/strong&gt; when prompted. Restart your computer, then open Command Prompt or PowerShell and check the install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see Docker version 28 or newer. If you see a version number, Docker is installed correctly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ubuntu (official Docker apt repository)
&lt;/h3&gt;

&lt;p&gt;The Ubuntu-packaged &lt;code&gt;docker.io&lt;/code&gt; is often a major version behind. Install from the official repository instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; ca-certificates curl
&lt;span class="nb"&gt;sudo install&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; 0755 &lt;span class="nt"&gt;-d&lt;/span&gt; /etc/apt/keyrings
&lt;span class="nb"&gt;sudo &lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://download.docker.com/linux/ubuntu/gpg &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-o&lt;/span&gt; /etc/apt/keyrings/docker.asc
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;a+r /etc/apt/keyrings/docker.asc

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb [arch=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;dpkg &lt;span class="nt"&gt;--print-architecture&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; signed-by=/etc/apt/keyrings/docker.asc] &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
    https://download.docker.com/linux/ubuntu &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; /etc/os-release &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="nv"&gt;$VERSION_CODENAME&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; stable"&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/docker.list &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null

&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; docker-ce docker-ce-cli containerd.io &lt;span class="se"&gt;\&lt;/span&gt;
    docker-buildx-plugin docker-compose-plugin

&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; docker
docker &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For full reference and other Linux distributions, see the &lt;a href="https://docs.docker.com/engine/install/" rel="noopener noreferrer"&gt;official Docker Engine install guide&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  macOS
&lt;/h3&gt;

&lt;p&gt;Download Docker Desktop for Mac from &lt;a href="https://docker.com" rel="noopener noreferrer"&gt;docker.com&lt;/a&gt; and drag it into Applications. Open Docker Desktop, grant the required permissions, and confirm with &lt;code&gt;docker --version&lt;/code&gt;. &lt;strong&gt;On Apple Silicon Macs, Docker Desktop runs natively on ARM64.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Your first Docker container: hands-on tutorial
&lt;/h2&gt;

&lt;p&gt;Open a terminal and run your first container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run hello-world
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docker pulls the &lt;code&gt;hello-world&lt;/code&gt; image from Docker Hub and runs it. You'll see a message confirming the install is working.&lt;/p&gt;

&lt;p&gt;Now run something more useful — an Nginx web server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 &lt;span class="nt"&gt;--name&lt;/span&gt; my-web-server nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Breaking down the flags:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-d&lt;/code&gt; → run the container in the background (detached mode)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-p 8080:80&lt;/code&gt; → map port 8080 on your machine to port 80 inside the container&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--name&lt;/code&gt; → give the container a readable name&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nginx&lt;/code&gt; → the image to run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open &lt;code&gt;http://localhost:8080&lt;/code&gt; in a browser and you should see the Nginx welcome page.&lt;/p&gt;

&lt;p&gt;Useful follow-up commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# list running containers&lt;/span&gt;
docker ps

&lt;span class="c"&gt;# stop the container&lt;/span&gt;
docker stop my-web-server

&lt;span class="c"&gt;# remove the container&lt;/span&gt;
docker &lt;span class="nb"&gt;rm &lt;/span&gt;my-web-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Writing your first Dockerfile
&lt;/h2&gt;

&lt;p&gt;Let's containerise a simple Node.js application. In a new directory, create a file named &lt;code&gt;Dockerfile&lt;/code&gt; (no extension) with this content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:22-alpine&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "app.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reading the Dockerfile line by line:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;FROM node:22-alpine&lt;/code&gt; → start from the official Node.js 22 image, Alpine variant for small size&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WORKDIR /app&lt;/code&gt; → set the working directory inside the container to &lt;code&gt;/app&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;COPY package*.json ./&lt;/code&gt; → copy &lt;code&gt;package.json&lt;/code&gt; and &lt;code&gt;package-lock.json&lt;/code&gt; first (this enables layer caching for faster rebuilds)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RUN npm install&lt;/code&gt; → install dependencies inside the container&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;COPY . .&lt;/code&gt; → copy the rest of the application source&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;EXPOSE 3000&lt;/code&gt; → declare the port the container listens on&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CMD ["node", "app.js"]&lt;/code&gt; → the command Docker runs when the container starts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Build and run the image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; my-node-app &lt;span class="nb"&gt;.&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 &lt;span class="nt"&gt;--name&lt;/span&gt; my-app my-node-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full reference: &lt;a href="https://docs.docker.com/engine/reference/builder/" rel="noopener noreferrer"&gt;Dockerfile reference on docs.docker.com&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Docker in the real world: how modern teams use it
&lt;/h2&gt;

&lt;p&gt;Four of the most common production patterns you'll encounter:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-service web apps.&lt;/strong&gt; For e-commerce, SaaS, or marketplace applications, teams run separate containers for the web frontend, the API backend, the database, and the cache layer (Redis). &lt;strong&gt;Docker Compose wires them together&lt;/strong&gt;, and the same compose file works for local development, staging, and production with only environment-variable changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Freelance &amp;amp; client deliveries.&lt;/strong&gt; Delivering work as a Dockerised package — a &lt;code&gt;docker-compose.yml&lt;/code&gt; plus a README — means a client runs &lt;strong&gt;one command&lt;/strong&gt; (&lt;code&gt;docker compose up&lt;/code&gt;) and has your entire application working locally. This is a major differentiator on Upwork; engineers regularly win contracts specifically because their deliverable is a one-command Docker bundle rather than a tarball with a setup README.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Environment parity.&lt;/strong&gt; Software teams use Docker to keep development, testing, and production environments identical — which removes a large category of "works on my machine" bugs from the QA cycle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloud deployments.&lt;/strong&gt; AWS ECS, Azure Container Instances, and Google Cloud Run all accept Docker images directly. &lt;strong&gt;The image you build locally is the same image you push to production.&lt;/strong&gt; No "rebuild for prod" step, no environment drift.&lt;/p&gt;

&lt;p&gt;To deploy Docker containers on AWS, the &lt;a href="https://elearning.sherdil.org/courses/aws-solutions-architect" rel="noopener noreferrer"&gt;Sherdil AWS 3-in-1 Training Bundle&lt;/a&gt; covers ECS deployment alongside Cloud Practitioner and Solutions Architect content.&lt;/p&gt;




&lt;h2&gt;
  
  
  Docker commands cheat sheet
&lt;/h2&gt;

&lt;p&gt;The commands you'll use almost daily once you start building images:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker run &amp;lt;image&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create and start a new container from an image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker ps&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List running containers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker ps -a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List all containers (including stopped)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker stop &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stop a running container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker start &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start a stopped container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker rm &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remove a container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker images&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List local images&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker rmi &amp;lt;image&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remove a local image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker pull &amp;lt;image&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Download an image from Docker Hub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker push &amp;lt;image&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Upload an image to a registry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker build -t &amp;lt;name&amp;gt; .&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Build an image from the Dockerfile in current directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker logs &amp;lt;name&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;View logs from a container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker exec -it &amp;lt;name&amp;gt; sh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Open a shell inside a running container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker compose up&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start everything in &lt;code&gt;docker-compose.yml&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker compose down&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Stop and remove everything from compose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker system prune&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Clean up unused images, containers, and networks&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Full command reference: &lt;a href="https://docs.docker.com/engine/reference/commandline/cli/" rel="noopener noreferrer"&gt;Docker CLI reference&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is Docker free to use?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Docker Engine is open-source and completely free.&lt;/strong&gt; Docker Desktop is free for personal use, education, and small businesses (under 250 employees and under $10M annual revenue). Larger commercial use requires a paid Docker subscription.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I learn Docker without knowing Linux?
&lt;/h3&gt;

&lt;p&gt;Basic Linux command-line familiarity is strongly advised. Most containers run Linux internally, and Docker commands are executed in a terminal. You don't need to be a Linux expert — comfort with &lt;code&gt;cd&lt;/code&gt;, &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;mkdir&lt;/code&gt;, &lt;code&gt;cat&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, and a text editor like &lt;code&gt;nano&lt;/code&gt; or &lt;code&gt;vim&lt;/code&gt; is enough to start.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long does it take to learn Docker?
&lt;/h3&gt;

&lt;p&gt;The basics (images, containers, Dockerfiles, Docker Compose) take &lt;strong&gt;two to three weeks with daily practice&lt;/strong&gt;. Becoming proficient enough for a junior DevOps role typically takes &lt;strong&gt;two to three months&lt;/strong&gt; including hands-on projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I learn Docker or Kubernetes first?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Always Docker first.&lt;/strong&gt; Kubernetes orchestrates Docker containers, so you need to understand containers before you can orchestrate them. A reasonable progression: one to two months on Docker, then four to six weeks on Kubernetes.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between &lt;code&gt;docker run&lt;/code&gt; and &lt;code&gt;docker compose up&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;docker run&lt;/code&gt; starts a &lt;strong&gt;single container&lt;/strong&gt;. &lt;code&gt;docker compose up&lt;/code&gt; starts &lt;strong&gt;everything defined in a &lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/strong&gt; — typically multiple containers (web, API, database, cache) wired together with networks and shared volumes. Use &lt;code&gt;docker run&lt;/code&gt; for quick tests and individual services; use Compose for any real application.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use Docker on Windows without WSL 2?
&lt;/h3&gt;

&lt;p&gt;Modern Docker Desktop on Windows requires &lt;strong&gt;WSL 2&lt;/strong&gt; (or Hyper-V) for its backend. WSL 2 is the recommended setup and works out of the box on Windows 10 (build 19041+) and Windows 11. There is no production-grade native Windows containers experience aimed at typical developer workloads.&lt;/p&gt;




&lt;h2&gt;
  
  
  Next steps: from Docker to a DevOps career
&lt;/h2&gt;

&lt;p&gt;Docker is the first major skill on the DevOps roadmap. After you're comfortable building and running containers, the natural progression is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes&lt;/strong&gt; — container orchestration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terraform&lt;/strong&gt; — infrastructure as code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One cloud platform&lt;/strong&gt; — AWS is the most common starting point&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a structured deep-dive, the &lt;a href="https://elearning.sherdil.org/pages/docker-tutorial-pakistan-beginners" rel="noopener noreferrer"&gt;Docker Tutorial for Beginners (Pakistan) at Sherdil E-Learning&lt;/a&gt; covers Docker in depth, then takes you through Kubernetes, CI/CD, AWS, and Terraform.&lt;/p&gt;




&lt;h2&gt;
  
  
  About the author
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Muhammad Usman Khan&lt;/strong&gt; is a Lead Cloud Instructor at &lt;a href="https://elearning.sherdil.org" rel="noopener noreferrer"&gt;Sherdil E-Learning&lt;/a&gt;, holding the Alibaba Cloud ACP certification along with AWS and Azure credentials. He is an expert trainer in AWS and Google Cloud, having delivered &lt;strong&gt;1,500+ hours of training across 12+ countries&lt;/strong&gt; and successfully completed 50+ multi-cloud projects.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;💬 &lt;strong&gt;Found this useful?&lt;/strong&gt; Drop a ❤️ or a 🦄, and let me know in the comments what you'd like the next deep-dive to cover — Docker Compose for multi-service apps, image optimization, or moving from Docker to Kubernetes?&lt;/p&gt;

&lt;p&gt;📖 &lt;strong&gt;Full original article (with diagrams + screenshots):&lt;/strong&gt; &lt;a href="https://elearning.sherdil.org/pages/docker-tutorial-pakistan-beginners" rel="noopener noreferrer"&gt;elearning.sherdil.org/pages/docker-tutorial-pakistan-beginners&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Kubernetes vs Docker (2026): What's the Difference and Which Should You Learn First?</title>
      <dc:creator>E-Learning Sherdil</dc:creator>
      <pubDate>Thu, 04 Jun 2026 12:40:02 +0000</pubDate>
      <link>https://dev.to/elearning_sherdil_783bbb/kubernetes-vs-docker-2026-whats-the-difference-and-which-should-you-learn-first-50l5</link>
      <guid>https://dev.to/elearning_sherdil_783bbb/kubernetes-vs-docker-2026-whats-the-difference-and-which-should-you-learn-first-50l5</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;This article was originally published on &lt;a href="https://elearning.sherdil.org/pages/kubernetes-vs-docker-difference" rel="noopener noreferrer"&gt;Sherdil E-Learning&lt;/a&gt;.&lt;/strong&gt; I'm republishing it here so the dev.to community can benefit too.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;strong&gt;Kubernetes vs Docker&lt;/strong&gt; question is one of the most common sources of confusion for developers entering DevOps. People hear both names constantly, see them used together in job listings, and assume they must be competitors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They are not.&lt;/strong&gt; Docker and Kubernetes do different jobs, and most modern infrastructure uses both.&lt;/p&gt;

&lt;p&gt;This guide explains what each tool actually does, how they fit together in a real deployment, the practical difference between Docker Compose and Kubernetes, and which one you should learn first.&lt;/p&gt;




&lt;h2&gt;
  
  
  Docker: the container creator
&lt;/h2&gt;

&lt;p&gt;Docker is a tool for &lt;strong&gt;building, running, and managing containers&lt;/strong&gt;. A container is a lightweight, portable package that contains an application together with its dependencies, runtime, system libraries, environment variables, and configuration files. The same container runs the same way on a laptop, a CI runner, a production server, or a cloud platform.&lt;/p&gt;

&lt;p&gt;In a typical Docker workflow you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write a &lt;strong&gt;Dockerfile&lt;/strong&gt; that describes how to build the image&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;docker build&lt;/code&gt; to produce the image&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;docker run&lt;/code&gt; to launch a container from it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For multiple containers (a web app plus a database, for example), you use &lt;strong&gt;Docker Compose&lt;/strong&gt; to define the whole set in a &lt;code&gt;docker-compose.yml&lt;/code&gt; file and start them with one command.&lt;/p&gt;

&lt;p&gt;Docker is excellent for individual containers and small multi-container applications. &lt;strong&gt;The limitation is scale.&lt;/strong&gt; What happens when you need a hundred containers across a dozen servers? When one container crashes at 3 a.m.? When you need to roll out a new version without downtime? Docker alone does not solve those problems.&lt;/p&gt;

&lt;p&gt;For the official reference, see &lt;a href="https://docs.docker.com" rel="noopener noreferrer"&gt;docs.docker.com&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Kubernetes: the orchestration layer above Docker
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt; (often shortened to &lt;strong&gt;K8s&lt;/strong&gt;) is an open-source platform that runs containers across many machines as a &lt;strong&gt;single coordinated system&lt;/strong&gt;. It was originally built at Google, based on their internal Borg cluster manager, and is now governed by the Cloud Native Computing Foundation (CNCF).&lt;/p&gt;

&lt;p&gt;Kubernetes does not create containers — Docker (or another container runtime) does that. What Kubernetes does is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Decide where each container should run&lt;/strong&gt; across a cluster of machines&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Restart containers when they crash&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale them up or down&lt;/strong&gt; based on traffic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manage networking&lt;/strong&gt; between them&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Roll out new versions with zero downtime&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Route requests to healthy instances&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;According to the &lt;strong&gt;CNCF Annual Survey 2024&lt;/strong&gt;, &lt;strong&gt;84% of organisations&lt;/strong&gt; are now using or evaluating Kubernetes in production, making it the de facto standard for running containerised workloads at scale.&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href="https://kubernetes.io/docs/concepts/" rel="noopener noreferrer"&gt;kubernetes.io official Concepts documentation&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Side-by-side comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Docker&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary job&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Build, run, and package containers&lt;/td&gt;
&lt;td&gt;Orchestrate containers across a cluster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single host (mostly)&lt;/td&gt;
&lt;td&gt;Multi-host cluster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What it manages&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Images, containers, volumes, networks&lt;/td&gt;
&lt;td&gt;Pods, deployments, services, nodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Configuration language&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dockerfile, &lt;code&gt;docker-compose.yml&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;YAML manifests (kubectl)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-healing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No (manual restart)&lt;/td&gt;
&lt;td&gt;Yes (automatic)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auto-scaling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (built-in HPA)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zero-downtime deploys&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Not natively&lt;/td&gt;
&lt;td&gt;Yes (rolling updates)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Learning curve&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2–3 weeks to basics&lt;/td&gt;
&lt;td&gt;2–3 months to basics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;When to use&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Local dev, simple apps, CI&lt;/td&gt;
&lt;td&gt;Production at scale, microservices&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Docker is one tool. Kubernetes is a system. They are at different layers of the same stack.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Docker and Kubernetes work together in a real deployment
&lt;/h2&gt;

&lt;p&gt;The clearest way to see how the two tools fit together is to walk through a real deployment pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write your application code&lt;/strong&gt; (Node.js, Python, Java, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a Dockerfile&lt;/strong&gt; that packages the application into a Docker image&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build the image&lt;/strong&gt; with &lt;code&gt;docker build&lt;/code&gt; and &lt;strong&gt;push it to a container registry&lt;/strong&gt; (Docker Hub, AWS ECR, Google Artifact Registry)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write Kubernetes manifests&lt;/strong&gt; — YAML files declaring how many copies of the container to run, how much CPU and memory each needs, which ports to expose, and how they connect to each other&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apply the manifests&lt;/strong&gt; to your cluster with &lt;code&gt;kubectl apply&lt;/code&gt;. Kubernetes pulls the Docker image from the registry and runs the specified number of containers (called &lt;strong&gt;pods&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes continuously monitors&lt;/strong&gt; those pods. If one crashes, Kubernetes restarts it. If traffic increases, it scales up automatically. If you push a new image version, it performs a rolling update with zero downtime.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In short: &lt;strong&gt;Docker builds and runs the container; Kubernetes decides where it runs, keeps it healthy, and scales it.&lt;/strong&gt; Complementary, not competing.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a Kubernetes manifest actually looks like
&lt;/h2&gt;

&lt;p&gt;A minimal Kubernetes Deployment manifest for a Node.js application running three replicas of a Docker image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-node-app&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-node-app&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-node-app&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-node-app&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-registry/my-node-app:1.0.0&lt;/span&gt;
          &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3000&lt;/span&gt;
          &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;100m"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;128Mi"&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
            &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;   &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;500m"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;256Mi"&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This single file tells Kubernetes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pull this Docker image&lt;/li&gt;
&lt;li&gt;Run &lt;strong&gt;three copies&lt;/strong&gt; of it&lt;/li&gt;
&lt;li&gt;Give each one &lt;strong&gt;between 100 and 500 millicores&lt;/strong&gt; of CPU and &lt;strong&gt;between 128 and 256 MB&lt;/strong&gt; of memory&lt;/li&gt;
&lt;li&gt;Expose &lt;strong&gt;port 3000&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Keep all three running. If one crashes, restart it. If a node goes down, reschedule its pods on another node.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's about 20 lines of YAML for a production-grade, self-healing, three-replica deployment. The same outcome with raw &lt;code&gt;docker run&lt;/code&gt; commands would be… let's just say "not happening."&lt;/p&gt;




&lt;h2&gt;
  
  
  A real-world example: e-commerce in production
&lt;/h2&gt;

&lt;p&gt;A typical e-commerce platform has several components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A frontend web app&lt;/li&gt;
&lt;li&gt;A product catalogue API&lt;/li&gt;
&lt;li&gt;A user authentication service&lt;/li&gt;
&lt;li&gt;A payment service&lt;/li&gt;
&lt;li&gt;A database&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each one is built and packaged with Docker into its own container image — the frontend in one image, the API in another, authentication in a third, and so on.&lt;/p&gt;

&lt;p&gt;In production, Kubernetes deploys all these images across a cluster of servers. It might run three replicas of the frontend, two of the API, two of authentication, and a single instance of the database with persistent storage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When Black Friday traffic spikes&lt;/strong&gt;, Kubernetes automatically scales the frontend to twenty replicas and the API to ten. &lt;strong&gt;When traffic falls&lt;/strong&gt;, it scales them back down. &lt;strong&gt;If the authentication service crashes&lt;/strong&gt;, Kubernetes restarts it within seconds without human intervention.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;local development&lt;/strong&gt;, the same team would typically run the same containers with Docker Compose on each developer's laptop — same images, simpler orchestration, single machine. This is the most common pattern in 2026: &lt;strong&gt;Docker Compose locally, Kubernetes in production.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Docker Compose vs Kubernetes: when to use each
&lt;/h2&gt;

&lt;p&gt;Docker Compose and Kubernetes both run multi-container applications, which is a frequent source of confusion. The practical distinction is &lt;strong&gt;scale and resilience&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use &lt;strong&gt;Docker Compose&lt;/strong&gt; when&lt;/th&gt;
&lt;th&gt;Use &lt;strong&gt;Kubernetes&lt;/strong&gt; when&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Developing locally&lt;/td&gt;
&lt;td&gt;Running in production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Running a small app on a single machine&lt;/td&gt;
&lt;td&gt;Scaling across multiple servers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prototyping a stack quickly&lt;/td&gt;
&lt;td&gt;Need automatic failover&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Building a CI test environment&lt;/td&gt;
&lt;td&gt;Running microservices that must communicate reliably&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simplicity matters more than resilience&lt;/td&gt;
&lt;td&gt;Zero-downtime rolling updates required&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Most teams in 2026 use &lt;strong&gt;both&lt;/strong&gt;: Docker Compose for local development, Kubernetes for staging and production. &lt;strong&gt;The container images are identical between environments — only the orchestration layer differs.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Which should you learn first?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Learn Docker first.&lt;/strong&gt; The case is straightforward:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Kubernetes runs Docker containers.&lt;/strong&gt; Without understanding how containers work, how images are built, how layers cache, how a process inside a container differs from a process on the host — Kubernetes concepts will not stick. Pods, deployments, services, and ConfigMaps all assume you already know what a container is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Time investment.&lt;/strong&gt; Docker takes &lt;strong&gt;two to three weeks&lt;/strong&gt; to learn the basics; Kubernetes takes &lt;strong&gt;two to three months&lt;/strong&gt;. Starting with Docker gives you early wins, builds confidence, and lets you ship real containerised applications before tackling the harder material.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Employability.&lt;/strong&gt; Most DevOps job listings require Docker; only some require Kubernetes. Docker is the broader employable skill at the entry level. For smaller freelance projects on Upwork, Docker Compose is often enough — you may not need Kubernetes for the first two to three years of your DevOps career.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The recommended order:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; (2–3 weeks) — images, containers, Dockerfiles&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Compose&lt;/strong&gt; (1 week) — multi-container apps&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes basics&lt;/strong&gt; (4–6 weeks) — pods, deployments, services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes in production&lt;/strong&gt; (ongoing) — Helm, operators, observability&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The &lt;a href="https://elearning.sherdil.org/courses/devops-cert-course-urdu" rel="noopener noreferrer"&gt;DevOps Engineer Course at Sherdil E-Learning&lt;/a&gt; follows this exact sequence with hands-on labs and a final project that deploys a multi-container application to a real Kubernetes cluster.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is Kubernetes replacing Docker?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;No.&lt;/strong&gt; The deprecation of &lt;em&gt;dockershim&lt;/em&gt; — Kubernetes's built-in adapter for the Docker engine — was announced in Kubernetes v1.20 (December 2020) and the code was removed in v1.24 (April 2022). This only changed how &lt;strong&gt;Kubernetes nodes&lt;/strong&gt; run containers internally (they now use &lt;strong&gt;containerd&lt;/strong&gt; or &lt;strong&gt;CRI-O&lt;/strong&gt; directly). It did not affect how developers build Docker images. You still write Dockerfiles, you still run &lt;code&gt;docker build&lt;/code&gt;, you still push to a registry. Kubernetes still runs your containers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use Kubernetes without Docker?
&lt;/h3&gt;

&lt;p&gt;Technically yes. Kubernetes can use alternative container runtimes like &lt;strong&gt;containerd&lt;/strong&gt; or &lt;strong&gt;CRI-O&lt;/strong&gt; directly. In practice, most developers still use Docker locally to build images, and Kubernetes then runs those images via its container runtime. You do not need to avoid Docker; it is the most ergonomic tool for the build side of the workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need both for freelancing?
&lt;/h3&gt;

&lt;p&gt;For most freelance projects on Upwork and Fiverr, &lt;strong&gt;Docker plus Docker Compose is sufficient&lt;/strong&gt;. Kubernetes becomes relevant for full-time DevOps and SRE roles at companies running production microservices, or for larger international consulting engagements. Start with Docker; add Kubernetes when a specific job needs it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I run Kubernetes on my laptop?
&lt;/h3&gt;

&lt;p&gt;Yes. The three common options are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Minikube&lt;/strong&gt; — a single-node cluster running in a VM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;kind&lt;/strong&gt; — Kubernetes running inside Docker containers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker Desktop's built-in single-node Kubernetes&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three are free and run fine on a modern laptop with &lt;strong&gt;8 GB of RAM or more&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  How much does managed Kubernetes cost on AWS, Azure, and GCP?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AWS EKS&lt;/strong&gt; — $0.10 per hour per cluster (~$73/month) plus the cost of the EC2 worker nodes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Azure AKS&lt;/strong&gt; — nothing for the control plane on the standard tier; you only pay for the worker VMs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google GKE Standard&lt;/strong&gt; — $0.10 per hour per cluster beyond the first cluster per billing account. &lt;strong&gt;GKE Autopilot&lt;/strong&gt; has a different per-pod pricing model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Always verify current prices on the vendor sites — pricing changes periodically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need Linux experience to learn Kubernetes?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Yes&lt;/strong&gt; — comfort with the Linux command line is effectively required. Most &lt;code&gt;kubectl&lt;/code&gt; workflows assume you can read logs, inspect processes, work with files, and write small shell scripts. If your Linux is shaky, plan &lt;strong&gt;two to four weeks of Linux practice&lt;/strong&gt; before starting on Kubernetes.&lt;/p&gt;

&lt;h3&gt;
  
  
  What certification should I aim for?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CKAD&lt;/strong&gt; (Certified Kubernetes Application Developer) and &lt;strong&gt;CKA&lt;/strong&gt; (Certified Kubernetes Administrator) are the two vendor-neutral credentials worth pursuing. Both are &lt;strong&gt;hands-on, practical exams&lt;/strong&gt; (not multiple choice), which makes them more credible to hiring managers than typical IT certifications. CKAD is the lighter entry point for developers; CKA is the deeper certification for SREs and platform engineers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Next steps
&lt;/h2&gt;

&lt;p&gt;The right order is &lt;strong&gt;Docker first, then Docker Compose, then Kubernetes&lt;/strong&gt;. Both tools are employable; together they are the foundation of every modern production deployment pipeline.&lt;/p&gt;

&lt;p&gt;For a structured deep-dive, the &lt;a href="https://elearning.sherdil.org/courses/devops-cert-course-urdu" rel="noopener noreferrer"&gt;DevOps Engineer Course at Sherdil E-Learning&lt;/a&gt; covers Docker, Docker Compose, Kubernetes, AWS, and Terraform in a single sequenced curriculum with hands-on labs.&lt;/p&gt;




&lt;h2&gt;
  
  
  About the author
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Muhammad Usman Khan&lt;/strong&gt; is a Lead Cloud Instructor at &lt;a href="https://elearning.sherdil.org" rel="noopener noreferrer"&gt;Sherdil E-Learning&lt;/a&gt;, holding the Alibaba Cloud ACP certification along with AWS and Azure credentials. He is an expert trainer in AWS and Google Cloud, having delivered &lt;strong&gt;1,500+ hours of training across 12+ countries&lt;/strong&gt; and successfully completed 50+ multi-cloud projects.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;💬 &lt;strong&gt;Found this useful?&lt;/strong&gt; Drop a ❤️ or a 🦄, and let me know in the comments what you'd like the next deep-dive to cover — Helm charts, Kubernetes networking, or your first production deployment with EKS/AKS/GKE?&lt;/p&gt;

&lt;p&gt;📖 &lt;strong&gt;Full original article:&lt;/strong&gt; &lt;br&gt;
&lt;a href="https://elearning.sherdil.org/pages/kubernetes-vs-docker-difference" rel="noopener noreferrer"&gt;elearning.sherdil.org/pages/kubernetes-vs-docker-difference&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>kubernetes</category>
      <category>docker</category>
      <category>devops</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Terraform Tutorial for Beginners: Infrastructure as Code</title>
      <dc:creator>E-Learning Sherdil</dc:creator>
      <pubDate>Wed, 03 Jun 2026 05:45:54 +0000</pubDate>
      <link>https://dev.to/elearning_sherdil_783bbb/terraform-tutorial-for-beginners-infrastructure-as-code-170o</link>
      <guid>https://dev.to/elearning_sherdil_783bbb/terraform-tutorial-for-beginners-infrastructure-as-code-170o</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;📌 &lt;strong&gt;This article was originally published on &lt;a href="https://elearning.sherdil.org/pages/terraform-tutorial-beginners-iac" rel="noopener noreferrer"&gt;Sherdil E-Learning&lt;/a&gt;.&lt;/strong&gt; I'm republishing it here so the dev.to community can benefit too.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you have ever clicked through the AWS console, Azure portal, or GCP dashboard to create cloud resources, you know the pain: it's slow, hard to repeat reliably across staging and production, and easy to get wrong. &lt;strong&gt;Infrastructure as Code (IaC)&lt;/strong&gt; solves this problem, and &lt;strong&gt;Terraform&lt;/strong&gt; is the most widely used IaC tool in industry.&lt;/p&gt;

&lt;p&gt;This guide takes you from "what is IaC" to running your first Terraform deployment on AWS, then walks through a working VPC + EC2 example you can adapt for production. It also covers the BUSL / OpenTofu split from 2023 that every Terraform learner in 2026 should understand.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Infrastructure as Code?
&lt;/h2&gt;

&lt;p&gt;Infrastructure as code is the practice of managing cloud resources — servers, databases, networks, storage, security groups — through &lt;strong&gt;configuration files&lt;/strong&gt; rather than manual clicks in a web console. You describe the infrastructure you want in text files, store those files in Git, and let an IaC tool create and update the real resources to match.&lt;/p&gt;

&lt;p&gt;The practical benefits compound:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repeatability&lt;/strong&gt; — the same files produce the same infrastructure every time, which removes the "I forgot to open port 443" class of mistake.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit log built in&lt;/strong&gt; — Git history becomes the audit log for every change, and pull requests become the review process.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed&lt;/strong&gt; — a complete environment (VPC, subnets, instances, load balancer, database) can spin up in minutes instead of hours of console work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-documenting&lt;/strong&gt; — the configuration files double as documentation: anyone joining the team can read the Terraform code and understand exactly what is deployed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reusable patterns&lt;/strong&gt; — once you have written a module for, say, a standard VPC, you can reuse it across every project with different inputs.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What is Terraform — and a note on OpenTofu
&lt;/h2&gt;

&lt;p&gt;Terraform is an open-source-style infrastructure-as-code tool originally created by HashiCorp in 2014. It uses a declarative configuration language called &lt;strong&gt;HCL (HashiCorp Configuration Language)&lt;/strong&gt; and supports hundreds of cloud and SaaS providers through a shared provider model.&lt;/p&gt;

&lt;p&gt;One thing every Terraform learner in 2026 should know: in &lt;strong&gt;August 2023&lt;/strong&gt;, HashiCorp changed Terraform's license from MPL 2.0 to the &lt;strong&gt;Business Source License (BUSL)&lt;/strong&gt;, which restricts commercial competitive use. In response, the &lt;strong&gt;OpenTofu&lt;/strong&gt; project was forked from Terraform 1.5.5, kept the MPL 2.0 license, and is now maintained by the Linux Foundation.&lt;/p&gt;

&lt;p&gt;OpenTofu is a drop-in replacement: same HCL syntax, same workflow, same provider ecosystem.&lt;/p&gt;

&lt;p&gt;For learners, the practical difference is small. &lt;strong&gt;Terraform has more name recognition with employers&lt;/strong&gt;, so start with Terraform for employability. If your future employer prefers OpenTofu, the switch is trivial. The rest of this tutorial works for both.&lt;/p&gt;

&lt;p&gt;Official sites: &lt;a href="https://terraform.io" rel="noopener noreferrer"&gt;terraform.io&lt;/a&gt; for Terraform; &lt;a href="https://opentofu.org" rel="noopener noreferrer"&gt;opentofu.org&lt;/a&gt; for OpenTofu.&lt;/p&gt;




&lt;h2&gt;
  
  
  Terraform vs other IaC tools
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Terraform&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-cloud (AWS, Azure, GCP, Alibaba, +hundreds)&lt;/td&gt;
&lt;td&gt;HCL (declarative)&lt;/td&gt;
&lt;td&gt;Teams working across more than one cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS CloudFormation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AWS only&lt;/td&gt;
&lt;td&gt;YAML / JSON&lt;/td&gt;
&lt;td&gt;AWS-only shops wanting tight native integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pulumi&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-cloud&lt;/td&gt;
&lt;td&gt;Python, TypeScript, Go, C#&lt;/td&gt;
&lt;td&gt;Teams that want a real programming language for infra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ansible&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Configuration management&lt;/td&gt;
&lt;td&gt;YAML&lt;/td&gt;
&lt;td&gt;Configuring software on existing servers (different category)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Terraform's biggest advantage is &lt;strong&gt;multi-cloud support&lt;/strong&gt; — same syntax, every provider. CloudFormation is AWS-only and tightly integrated. Pulumi appeals to teams that want a real programming language. Ansible occupies a different category — it's better for configuring software on existing servers than provisioning the servers themselves.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Terraform works: write, plan, apply
&lt;/h2&gt;

&lt;p&gt;Terraform's daily workflow is three commands. Once you know what each one does, the rest of the tool makes sense.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Write
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;.tf&lt;/code&gt; files (Terraform configuration files) that describe the infrastructure you want — resources like virtual machines, databases, networks, IAM roles. Each file is just plain text in HCL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Plan
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform plan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Terraform reads your configuration files, compares them to the current state of your infrastructure, and shows you exactly what it will &lt;strong&gt;create, modify, or destroy — before changing anything&lt;/strong&gt;. This is your safety net.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Apply
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Terraform executes the changes shown in the plan, calling the cloud provider's API to create, update, or delete resources to match your configuration.&lt;/p&gt;

&lt;p&gt;There's also &lt;code&gt;terraform destroy&lt;/code&gt;, which removes everything Terraform created — useful for tearing down test environments to avoid charges.&lt;/p&gt;




&lt;h2&gt;
  
  
  Core Terraform concepts
&lt;/h2&gt;

&lt;p&gt;Five concepts come up constantly. Get comfortable with these and the rest of Terraform becomes a matter of looking up provider-specific resource names.&lt;/p&gt;

&lt;h3&gt;
  
  
  Providers
&lt;/h3&gt;

&lt;p&gt;Plugins that let Terraform interact with specific cloud platforms or services. The AWS provider talks to the AWS API, the Azure provider talks to the Azure API, and so on. You declare which provider you need and Terraform downloads the right plugin during &lt;code&gt;terraform init&lt;/code&gt;. Browse the full catalogue at &lt;a href="https://registry.terraform.io" rel="noopener noreferrer"&gt;registry.terraform.io&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;p&gt;The building blocks of your infrastructure. Each resource block defines one component — an EC2 instance, an S3 bucket, an IAM role, a VPC. The first label on a resource block is the &lt;strong&gt;type&lt;/strong&gt; (e.g. &lt;code&gt;aws_s3_bucket&lt;/code&gt;), the second is a &lt;strong&gt;name&lt;/strong&gt; you choose for referring to this resource elsewhere in your code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Variables
&lt;/h3&gt;

&lt;p&gt;Variables make your code reusable. Instead of hard-coding values like the AWS region or instance size, you declare variables and pass values at apply time. The same Terraform code can then deploy a small dev environment or a large production environment by changing only the variable values.&lt;/p&gt;

&lt;h3&gt;
  
  
  State
&lt;/h3&gt;

&lt;p&gt;Terraform maintains a state file (&lt;code&gt;terraform.tfstate&lt;/code&gt;) that records what infrastructure Terraform currently manages. The state file maps your configuration to real-world resources, so Terraform knows what to update, what to leave alone, and what to destroy.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;State management is the single most important production concern.&lt;/strong&gt; Never commit &lt;code&gt;terraform.tfstate&lt;/code&gt; to Git, and use a remote backend (S3, Azure Blob, Terraform Cloud) for any team work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Modules
&lt;/h3&gt;

&lt;p&gt;Reusable packages of Terraform configuration. Think of a module as a function: you define one standard VPC setup, then call that module across staging, production, and every new project with different inputs. The Terraform Registry hosts thousands of open-source modules.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your first Terraform project: a hands-on walkthrough
&lt;/h2&gt;

&lt;p&gt;Before you start you need three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;An &lt;strong&gt;AWS account&lt;/strong&gt; with Free Tier access (sign up at &lt;a href="https://aws.amazon.com" rel="noopener noreferrer"&gt;aws.amazon.com&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS CLI&lt;/strong&gt; installed and configured with your access keys (run &lt;code&gt;aws configure&lt;/code&gt; after install).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terraform&lt;/strong&gt; installed — download from &lt;a href="https://terraform.io" rel="noopener noreferrer"&gt;terraform.io&lt;/a&gt; or install via your package manager.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 1: Create a project directory
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;my-first-terraform &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;my-first-terraform
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Write a configuration file
&lt;/h3&gt;

&lt;p&gt;Create a file called &lt;code&gt;main.tf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="s2"&gt;"aws"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;region&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"us-east-1"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_s3_bucket"&lt;/span&gt; &lt;span class="s2"&gt;"my_bucket"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;bucket&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"my-first-terraform-bucket-replace-this-name"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This tells Terraform to use the AWS provider in &lt;code&gt;us-east-1&lt;/code&gt; and create an S3 bucket. &lt;strong&gt;Replace the bucket name with something globally unique&lt;/strong&gt; — S3 bucket names must be unique across all of AWS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Initialise Terraform
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This downloads the AWS provider plugin. Run it once per project, plus again when you add new providers or change provider versions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Preview the changes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform plan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Terraform shows what it will do. In this case: &lt;code&gt;1 to add, 0 to change, 0 to destroy&lt;/code&gt; — creating one new S3 bucket. &lt;strong&gt;Always read the plan output before applying.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Apply the changes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Type &lt;code&gt;yes&lt;/code&gt; when prompted. Terraform creates the S3 bucket. Verify it in the AWS S3 console.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Clean up
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;terraform destroy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Removes the S3 bucket so you don't incur any charges. Type &lt;code&gt;yes&lt;/code&gt; to confirm. This matters: Terraform makes it easy to create real resources accidentally, so &lt;strong&gt;always destroy what you don't need&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  A working VPC and EC2 example
&lt;/h2&gt;

&lt;p&gt;A more realistic configuration that creates a VPC, an Internet Gateway, a public subnet with routing, a security group, and an EC2 instance that is actually reachable from the internet on port 80. The AMI is fetched dynamically so the example doesn't rot when AWS publishes a new Amazon Linux image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="s2"&gt;"aws"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;region&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"us-east-1"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Look up the latest Amazon Linux 2023 AMI dynamically&lt;/span&gt;
&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="s2"&gt;"aws_ami"&lt;/span&gt; &lt;span class="s2"&gt;"amazon_linux"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;most_recent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;owners&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"amazon"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

  &lt;span class="nx"&gt;filter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;name&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"name"&lt;/span&gt;
    &lt;span class="nx"&gt;values&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"al2023-ami-*-x86_64"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_vpc"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;cidr_block&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10.0.0.0/16"&lt;/span&gt;
  &lt;span class="nx"&gt;enable_dns_hostnames&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"main-vpc"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_internet_gateway"&lt;/span&gt; &lt;span class="s2"&gt;"main"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;vpc_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="nx"&gt;tags&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"main-igw"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_subnet"&lt;/span&gt; &lt;span class="s2"&gt;"public"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;vpc_id&lt;/span&gt;                  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="nx"&gt;cidr_block&lt;/span&gt;              &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10.0.1.0/24"&lt;/span&gt;
  &lt;span class="nx"&gt;map_public_ip_on_launch&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nx"&gt;tags&lt;/span&gt;                    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"public-subnet"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_route_table"&lt;/span&gt; &lt;span class="s2"&gt;"public"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;vpc_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;

  &lt;span class="nx"&gt;route&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;cidr_block&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"0.0.0.0/0"&lt;/span&gt;
    &lt;span class="nx"&gt;gateway_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_internet_gateway&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_route_table_association"&lt;/span&gt; &lt;span class="s2"&gt;"public"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;subnet_id&lt;/span&gt;      &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="nx"&gt;route_table_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_route_table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_security_group"&lt;/span&gt; &lt;span class="s2"&gt;"web"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;vpc_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_vpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;

  &lt;span class="nx"&gt;ingress&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;from_port&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
    &lt;span class="nx"&gt;to_port&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
    &lt;span class="nx"&gt;protocol&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tcp"&lt;/span&gt;
    &lt;span class="nx"&gt;cidr_blocks&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"0.0.0.0/0"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;egress&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;from_port&lt;/span&gt;   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="nx"&gt;to_port&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="nx"&gt;protocol&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"-1"&lt;/span&gt;
    &lt;span class="nx"&gt;cidr_blocks&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"0.0.0.0/0"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"aws_instance"&lt;/span&gt; &lt;span class="s2"&gt;"web"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ami&lt;/span&gt;                    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;aws_ami&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amazon_linux&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="nx"&gt;instance_type&lt;/span&gt;          &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t2.micro"&lt;/span&gt;
  &lt;span class="nx"&gt;subnet_id&lt;/span&gt;              &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;aws_subnet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;public&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="nx"&gt;vpc_security_group_ids&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;aws_security_group&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="nx"&gt;tags&lt;/span&gt;                   &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"web-server"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice how resources reference each other:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Internet Gateway attaches to the VPC (&lt;code&gt;aws_vpc.main.id&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;The route table sits inside the VPC and forwards &lt;code&gt;0.0.0.0/0&lt;/code&gt; traffic to the gateway.&lt;/li&gt;
&lt;li&gt;The route table is then associated with the public subnet so instances in that subnet can reach the internet.&lt;/li&gt;
&lt;li&gt;The EC2 instance lives in the public subnet and uses the security group that allows port 80 inbound from anywhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Terraform works out the correct creation order automatically based on these references.&lt;/p&gt;




&lt;h2&gt;
  
  
  Best practices for beginners
&lt;/h2&gt;

&lt;p&gt;Five habits to build from your first project, in order of how much pain they save you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Always run &lt;code&gt;terraform plan&lt;/code&gt; before &lt;code&gt;terraform apply&lt;/code&gt;.&lt;/strong&gt; Read the plan output carefully, particularly look for any &lt;code&gt;destroy&lt;/code&gt; actions you didn't expect. One wrong configuration change can drop a production database. Treat plan output as a contract.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Use variables instead of hard-coded values.&lt;/strong&gt; Region, instance type, environment name, CIDR blocks, tags — none of these should be hard-coded. Create a separate &lt;code&gt;.tfvars&lt;/code&gt; file for each environment (&lt;code&gt;dev.tfvars&lt;/code&gt;, &lt;code&gt;staging.tfvars&lt;/code&gt;, &lt;code&gt;prod.tfvars&lt;/code&gt;) and pass the right one at apply time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Use a remote backend for state.&lt;/strong&gt; Once more than one person works on the codebase, store &lt;code&gt;terraform.tfstate&lt;/code&gt; in S3 (or Azure Blob, or Terraform Cloud) with state locking via DynamoDB. &lt;strong&gt;Never commit the state file to Git&lt;/strong&gt; — it contains secrets in plain text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Extract reusable patterns into modules.&lt;/strong&gt; The first time you write a VPC, write it as plain resources. The second time, extract it into a module. By the third project you will save hours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Tag every resource.&lt;/strong&gt; At minimum tag with environment (&lt;code&gt;dev&lt;/code&gt; / &lt;code&gt;staging&lt;/code&gt; / &lt;code&gt;prod&lt;/code&gt;), owner, and cost-centre. Untagged resources become impossible to attribute and trim when the AWS bill grows.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is Terraform free?
&lt;/h3&gt;

&lt;p&gt;The Terraform CLI is free to download and use. Since August 2023 it is licensed under the &lt;strong&gt;Business Source License (BUSL)&lt;/strong&gt; rather than fully open-source, which restricts commercial competitive use but not normal day-to-day work. Terraform Cloud has a free tier for small teams (up to 500 resources) and paid tiers for larger organisations. If you specifically want a fully open-source IaC tool, &lt;strong&gt;OpenTofu&lt;/strong&gt; is the MPL-licensed fork.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do I need to know programming to use Terraform?
&lt;/h3&gt;

&lt;p&gt;No general-purpose programming is required. HCL is a configuration language, closer to JSON or YAML than to Python. If you can read and edit a JSON file, you can write Terraform. The mental model for variables, references, and modules will take a week or two but doesn't require previous coding experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I learn Terraform or CloudFormation first?
&lt;/h3&gt;

&lt;p&gt;If you work exclusively with AWS, either tool is fine. If you work with multiple cloud providers, or want the broadest job market, learn Terraform. Most DevOps job listings that mention IaC list Terraform first. Some AWS-only shops still use CloudFormation for tighter integration with AWS services.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is OpenTofu and should I use it instead of Terraform?
&lt;/h3&gt;

&lt;p&gt;OpenTofu is a Linux Foundation-maintained fork of Terraform 1.5.5, created in September 2023 after HashiCorp moved Terraform to the BUSL license. It keeps the MPL 2.0 open-source license and is largely a drop-in replacement — same HCL syntax, same workflow, same provider ecosystem. For learning, start with Terraform because more employers list it by name. Switching to OpenTofu later is straightforward if your company prefers it.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I store Terraform state safely?
&lt;/h3&gt;

&lt;p&gt;Never commit &lt;code&gt;terraform.tfstate&lt;/code&gt; to Git — it can contain secrets in plain text. For team work, use a remote backend: &lt;strong&gt;S3 with DynamoDB-based state locking&lt;/strong&gt; is the most common AWS pattern; &lt;strong&gt;Terraform Cloud&lt;/strong&gt; is the easiest if you want a managed solution; &lt;strong&gt;Azure Blob Storage&lt;/strong&gt; and &lt;strong&gt;Google Cloud Storage&lt;/strong&gt; work for Azure and GCP-centric teams. Configure the backend block in your Terraform configuration and run &lt;code&gt;terraform init&lt;/code&gt; to migrate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I use Terraform with Azure and GCP, not just AWS?
&lt;/h3&gt;

&lt;p&gt;Yes — Terraform's biggest strength is &lt;strong&gt;multi-cloud support&lt;/strong&gt;. The Azure provider (&lt;code&gt;azurerm&lt;/code&gt;), Google Cloud provider (&lt;code&gt;google&lt;/code&gt;), Alibaba Cloud provider (&lt;code&gt;alicloud&lt;/code&gt;), and hundreds of others all use the same workflow. The configuration syntax is the same; only the resource names change.&lt;/p&gt;

&lt;h3&gt;
  
  
  How long does it take to learn Terraform?
&lt;/h3&gt;

&lt;p&gt;You can deploy your first Terraform configuration in &lt;strong&gt;one to two weeks&lt;/strong&gt; of part-time study. Becoming proficient with modules, remote state, workspaces, and production patterns takes &lt;strong&gt;two to three months&lt;/strong&gt;. The &lt;strong&gt;Terraform Associate certification&lt;/strong&gt; typically takes four to six weeks of preparation on top of basic familiarity.&lt;/p&gt;




&lt;h2&gt;
  
  
  Next steps
&lt;/h2&gt;

&lt;p&gt;The order I recommend at Sherdil:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get comfortable with the six-step S3 walkthrough above.&lt;/li&gt;
&lt;li&gt;Build the VPC + EC2 example end-to-end.&lt;/li&gt;
&lt;li&gt;Learn variables and modules.&lt;/li&gt;
&lt;li&gt;Set up a remote backend.&lt;/li&gt;
&lt;li&gt;Book the &lt;strong&gt;HashiCorp Certified: Terraform Associate (003)&lt;/strong&gt; exam — multiple-choice, ~$70 USD, the entry-level cert employers recognise.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a structured deep-dive, the &lt;a href="https://elearning.sherdil.org/pages/terraform-tutorial-beginners-iac" rel="noopener noreferrer"&gt;Mastering Terraform Course at Sherdil E-Learning&lt;/a&gt; covers everything above in depth plus the production-pattern material needed for the Terraform Associate exam. For learners who want IaC in the context of a full DevOps stack, the &lt;a href="https://elearning.sherdil.org/courses/devops-cert-course-urdu" rel="noopener noreferrer"&gt;DevOps Engineer Course&lt;/a&gt; sequences Terraform alongside Docker, Kubernetes, AWS, and CI/CD.&lt;/p&gt;




&lt;h2&gt;
  
  
  About the author
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Muhammad Usman Khan&lt;/strong&gt; is a Lead Cloud Instructor at &lt;a href="https://elearning.sherdil.org" rel="noopener noreferrer"&gt;Sherdil E-Learning&lt;/a&gt;, holding the Alibaba Cloud ACP certification along with AWS and Azure credentials. He is an expert trainer in AWS and Google Cloud, having delivered &lt;strong&gt;1,500+ hours of training across 12+ countries&lt;/strong&gt; and successfully completed 50+ multi-cloud projects.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;💬 &lt;strong&gt;Found this useful?&lt;/strong&gt; Drop a ❤️ or a 🦄, and let me know in the comments what you'd like the next deep-dive to cover — remote backends, modules, or a Terraform Cloud walkthrough?&lt;/p&gt;

&lt;p&gt;📖 &lt;strong&gt;Full original article:&lt;/strong&gt; &lt;br&gt;
&lt;a href="https://elearning.sherdil.org/pages/terraform-tutorial-beginners-iac" rel="noopener noreferrer"&gt;elearning.sherdil.org/pages/terraform-tutorial-beginners-iac&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>terraform</category>
      <category>devops</category>
      <category>aws</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
