<?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: Omkar Sharma</title>
    <description>The latest articles on DEV Community by Omkar Sharma (@omkarsharma2821).</description>
    <link>https://dev.to/omkarsharma2821</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%2F2968429%2F05debf70-4923-4a9a-89a7-19649e0a516d.png</url>
      <title>DEV Community: Omkar Sharma</title>
      <link>https://dev.to/omkarsharma2821</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/omkarsharma2821"/>
    <language>en</language>
    <item>
      <title>Guide For Starting Terraform</title>
      <dc:creator>Omkar Sharma</dc:creator>
      <pubDate>Sun, 30 Aug 2026 10:57:48 +0000</pubDate>
      <link>https://dev.to/omkarsharma2821/guide-for-starting-terraform-3hi6</link>
      <guid>https://dev.to/omkarsharma2821/guide-for-starting-terraform-3hi6</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpewweiq99n226ntk4gha.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpewweiq99n226ntk4gha.png" alt="omkarsharma2821" width="799" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Without Infrastructure as Code, creating infrastructure is a task. With Terraform, it becomes a repeatable process.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Imagine you are asked to create infrastructure for a new application/project.&lt;/p&gt;

&lt;p&gt;You need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A VPC&lt;/li&gt;
&lt;li&gt;Subnets&lt;/li&gt;
&lt;li&gt;Route tables&lt;/li&gt;
&lt;li&gt;Security groups&lt;/li&gt;
&lt;li&gt;EC2 instances&lt;/li&gt;
&lt;li&gt;Load balancers&lt;/li&gt;
&lt;li&gt;Databases&lt;/li&gt;
&lt;li&gt;IAM roles&lt;/li&gt;
&lt;li&gt;Monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You open the cloud console and start creating everything manually.&lt;/p&gt;

&lt;p&gt;The first environment takes a few hours.&lt;/p&gt;

&lt;p&gt;Then someone asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can we create the same infrastructure for staging?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So you start again.&lt;/p&gt;

&lt;p&gt;Then production.&lt;/p&gt;

&lt;p&gt;Then another region.&lt;/p&gt;

&lt;p&gt;Then six months later, someone asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What exactly did we change in the infrastructure?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And now the real problem begins.&lt;/p&gt;

&lt;p&gt;You might remember some of it.&lt;/p&gt;

&lt;p&gt;Maybe you have documentation.&lt;/p&gt;

&lt;p&gt;Maybe someone took screenshots.&lt;/p&gt;

&lt;p&gt;Maybe you have a spreadsheet.&lt;/p&gt;

&lt;p&gt;Or maybe you simply say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I don't remember. I created it manually."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is where &lt;strong&gt;Terraform&lt;/strong&gt; changes the way we think about infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Terraform?
&lt;/h2&gt;

&lt;p&gt;Terraform is an &lt;strong&gt;Infrastructure as Code (IaC)&lt;/strong&gt; tool that allows you to define and manage infrastructure using configuration files instead of manually creating resources through a cloud console.&lt;/p&gt;

&lt;p&gt;Instead of saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Go to AWS → VPC → Create → Subnet → Create → Security Group → Create..."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You define what you want in code.&lt;/p&gt;

&lt;p&gt;For example:&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;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="s2"&gt;"ami-xxxxxxxx"&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;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;Terraform reads this configuration and creates the infrastructure for you.&lt;/p&gt;

&lt;p&gt;The important part isn't just that Terraform creates an EC2 instance.&lt;/p&gt;

&lt;p&gt;The important part is that &lt;strong&gt;your infrastructure is now represented as code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And code can be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Version controlled&lt;/li&gt;
&lt;li&gt;Reviewed&lt;/li&gt;
&lt;li&gt;Reused&lt;/li&gt;
&lt;li&gt;Tested&lt;/li&gt;
&lt;li&gt;Shared&lt;/li&gt;
&lt;li&gt;Automated&lt;/li&gt;
&lt;li&gt;Recreated&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's where the real value comes from.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Happens If We Don't Use Terraform?
&lt;/h2&gt;

&lt;p&gt;Let's look at the traditional approach.&lt;/p&gt;

&lt;p&gt;Suppose a company has three environments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Development
     ↓
Staging
     ↓
Production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Someone manually creates resources in each environment.&lt;/p&gt;

&lt;p&gt;Over time, small differences start appearing.&lt;/p&gt;

&lt;p&gt;Development might have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EC2: t3.micro
Security Group: Port 80, 22
Subnet: 10.0.1.0/24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Staging might have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EC2: t3.small
Security Group: Port 80, 443, 22
Subnet: 10.0.2.0/24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Production might have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EC2: t3.medium
Security Group: Port 80, 443
Subnet: 10.0.10.0/24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some differences are intentional.&lt;/p&gt;

&lt;p&gt;Others might simply be mistakes.&lt;/p&gt;

&lt;p&gt;This creates the famous problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"It works in my environment."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The application may work in development but fail in staging because the environments aren't configured the same way.&lt;/p&gt;

&lt;p&gt;Terraform helps solve this by making the infrastructure configuration &lt;strong&gt;repeatable and standardized&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Save Time
&lt;/h2&gt;

&lt;p&gt;One of the biggest benefits of Terraform is simple:&lt;/p&gt;

&lt;h2&gt;
  
  
  Automation saves time.
&lt;/h2&gt;

&lt;p&gt;Imagine manually creating:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 VPC&lt;/li&gt;
&lt;li&gt;4 subnets&lt;/li&gt;
&lt;li&gt;2 route tables&lt;/li&gt;
&lt;li&gt;3 security groups&lt;/li&gt;
&lt;li&gt;5 EC2 instances&lt;/li&gt;
&lt;li&gt;1 load balancer&lt;/li&gt;
&lt;li&gt;1 database&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Doing this manually can take considerable time.&lt;/p&gt;

&lt;p&gt;Now imagine you need the same infrastructure again.&lt;/p&gt;

&lt;p&gt;With Terraform, you don't start from zero.&lt;/p&gt;

&lt;p&gt;You can reuse your configuration.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;Instead of repeatedly clicking through the cloud console, you let Terraform perform the repetitive work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Write once. Deploy many times.
&lt;/h3&gt;

&lt;h2&gt;
  
  
  2. Reduce Human Errors
&lt;/h2&gt;

&lt;p&gt;Humans make mistakes.&lt;/p&gt;

&lt;p&gt;It's normal.&lt;/p&gt;

&lt;p&gt;Maybe someone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Selects the wrong subnet&lt;/li&gt;
&lt;li&gt;Opens the wrong security group port&lt;/li&gt;
&lt;li&gt;Chooses the wrong instance type&lt;/li&gt;
&lt;li&gt;Attaches the wrong route table&lt;/li&gt;
&lt;li&gt;Forgets to enable encryption&lt;/li&gt;
&lt;li&gt;Creates a resource in the wrong region&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One small mistake in infrastructure can cause a major problem.&lt;/p&gt;

&lt;p&gt;Terraform doesn't eliminate every possible mistake, but it significantly reduces &lt;strong&gt;manual configuration errors&lt;/strong&gt; by making infrastructure configuration explicit and repeatable.&lt;/p&gt;

&lt;p&gt;Instead of relying on memory:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I think I configured production the same way."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You have code that defines exactly what should exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Environment Consistency
&lt;/h2&gt;

&lt;p&gt;This is one of my favorite benefits of Infrastructure as Code.&lt;/p&gt;

&lt;p&gt;Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Development
     ↓
Staging
     ↓
Production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without IaC, each environment can slowly become different.&lt;/p&gt;

&lt;p&gt;With Terraform, you can define a standard infrastructure architecture and reuse it across environments.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;terraform/
│
├── modules/
│   ├── network/
│   ├── compute/
│   └── database/
│
├── environments/
│   ├── dev/
│   ├── staging/
│   └── production/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact values can differ between environments, but the infrastructure structure can remain consistent.&lt;/p&gt;

&lt;p&gt;This helps eliminate:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"It works on my machine."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And moves toward:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"It works because every environment follows the same infrastructure definition."&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4. Repetitive Tasks Become Automation
&lt;/h2&gt;

&lt;p&gt;Think about how many times DevOps engineers perform the same tasks.&lt;/p&gt;

&lt;p&gt;Create a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VPC&lt;/li&gt;
&lt;li&gt;Subnet&lt;/li&gt;
&lt;li&gt;Security group&lt;/li&gt;
&lt;li&gt;IAM role&lt;/li&gt;
&lt;li&gt;EC2 instance&lt;/li&gt;
&lt;li&gt;Load balancer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Doing these things repeatedly is not a great use of engineering time.&lt;/p&gt;

&lt;p&gt;Terraform turns repetitive infrastructure tasks into reusable code.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Click
Click
Click
Configure
Verify
Repeat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You move toward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Code
   ↓
Plan
   ↓
Apply
   ↓
Infrastructure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your time can then be spent on more valuable engineering problems instead of repetitive clicking.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Write Once, Deploy Many
&lt;/h2&gt;

&lt;p&gt;This is where Terraform becomes extremely powerful.&lt;/p&gt;

&lt;p&gt;Suppose you've created a network architecture using Terraform.&lt;/p&gt;

&lt;p&gt;You can reuse it for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Development
Staging
Production
DR
Testing
New Region
New Project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don't need to recreate everything manually.&lt;/p&gt;

&lt;p&gt;You can parameterize your configuration using variables.&lt;/p&gt;

&lt;p&gt;For example:&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;variable&lt;/span&gt; &lt;span class="s2"&gt;"environment"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"instance_type"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then different environments can provide different values.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dev        → t3.micro
staging    → t3.small
production → t3.medium
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The infrastructure logic remains reusable.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Infrastructure Changes Become Trackable
&lt;/h2&gt;

&lt;p&gt;Here's another major problem with manually created infrastructure:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Who changed what?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Imagine someone modifies a production security group.&lt;/p&gt;

&lt;p&gt;You discover the change two weeks later.&lt;/p&gt;

&lt;p&gt;Who changed it?&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;When?&lt;/p&gt;

&lt;p&gt;What was the previous configuration?&lt;/p&gt;

&lt;p&gt;With Terraform, your infrastructure configuration can live in Git.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Git Repository
      │
      ├── Commit 1
      ├── Commit 2
      ├── Commit 3
      └── Commit 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now infrastructure changes can go through the same process as application code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer
   ↓
Change Terraform code
   ↓
Git commit
   ↓
Pull Request
   ↓
Code Review
   ↓
Terraform Plan
   ↓
Terraform Apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Infrastructure becomes part of your software development lifecycle.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Terraform Plan: See Before You Change
&lt;/h2&gt;

&lt;p&gt;One of the most useful Terraform commands is:&lt;br&gt;
&lt;/p&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;It shows what Terraform intends to change before actually making those changes.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Plan: 2 to add, 1 to change, 0 to destroy.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you an opportunity to review infrastructure changes before applying them.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I clicked something and now production changed."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You get:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Here is exactly what Terraform plans to change."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That makes infrastructure changes much more predictable.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Easier Infrastructure Maintenance
&lt;/h2&gt;

&lt;p&gt;Infrastructure isn't something you create once and forget.&lt;/p&gt;

&lt;p&gt;It changes constantly.&lt;/p&gt;

&lt;p&gt;You might need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upgrade an instance&lt;/li&gt;
&lt;li&gt;Add a subnet&lt;/li&gt;
&lt;li&gt;Modify security rules&lt;/li&gt;
&lt;li&gt;Add a load balancer&lt;/li&gt;
&lt;li&gt;Change database configuration&lt;/li&gt;
&lt;li&gt;Add monitoring&lt;/li&gt;
&lt;li&gt;Update networking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without IaC, these changes can become difficult to track.&lt;/p&gt;

&lt;p&gt;With Terraform, you modify the configuration.&lt;/p&gt;

&lt;p&gt;For example:&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;instance_type&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t3.micro"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can become:&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;instance_type&lt;/span&gt; &lt;span class="err"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"t3.medium"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Terraform can determine the required change.&lt;/p&gt;

&lt;p&gt;Your infrastructure configuration becomes the source of truth for the desired state.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Easier Disaster Recovery
&lt;/h2&gt;

&lt;p&gt;Imagine your infrastructure is accidentally deleted.&lt;/p&gt;

&lt;p&gt;If everything was created manually, rebuilding it could take hours or even days.&lt;/p&gt;

&lt;p&gt;If your infrastructure is defined in Terraform:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Terraform Code
      ↓
terraform apply
      ↓
Infrastructure recreated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can recreate the infrastructure from the configuration.&lt;/p&gt;

&lt;p&gt;Of course, production recovery also requires proper backups, state management, secrets management, data recovery strategies, and testing.&lt;/p&gt;

&lt;p&gt;Terraform isn't a backup system.&lt;/p&gt;

&lt;p&gt;But it can make &lt;strong&gt;rebuilding infrastructure&lt;/strong&gt; dramatically easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Save Engineering Cost
&lt;/h2&gt;

&lt;p&gt;Terraform itself doesn't magically make your cloud bill cheaper.&lt;/p&gt;

&lt;p&gt;But it can help reduce costs indirectly.&lt;/p&gt;

&lt;p&gt;How?&lt;/p&gt;

&lt;h3&gt;
  
  
  Less manual work
&lt;/h3&gt;

&lt;p&gt;Engineers spend less time repeatedly creating infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fewer configuration mistakes
&lt;/h3&gt;

&lt;p&gt;Incorrect configurations can lead to unnecessary resource usage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Easier cleanup
&lt;/h3&gt;

&lt;p&gt;Temporary environments can be destroyed when they're no longer needed.&lt;br&gt;
&lt;/p&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;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Testing Environment
       ↓
Create
       ↓
Run Tests
       ↓
No longer needed
       ↓
terraform destroy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is much better than leaving forgotten resources running and discovering them later on the cloud bill.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Infrastructure Lifecycle Becomes Simple
&lt;/h2&gt;

&lt;p&gt;Terraform can help manage the infrastructure lifecycle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Provision
    ↓
Maintain
    ↓
Modify
    ↓
Scale
    ↓
Destroy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Provision
&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;Create infrastructure.&lt;/p&gt;

&lt;h3&gt;
  
  
  Maintain
&lt;/h3&gt;

&lt;p&gt;Modify Terraform configuration and apply changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Destroy
&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;Remove infrastructure that is no longer required.&lt;/p&gt;

&lt;p&gt;The entire lifecycle can be managed through code.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Multi-Cloud Infrastructure
&lt;/h2&gt;

&lt;p&gt;Another major advantage is that Terraform supports many infrastructure providers.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             Terraform
                 │
       ┌─────────┼─────────┐
       ↓         ↓         ↓
      AWS       Azure      GCP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use Terraform to manage resources across different providers.&lt;/p&gt;

&lt;p&gt;This doesn't mean you should always use multiple clouds.&lt;/p&gt;

&lt;p&gt;It simply means your infrastructure tooling doesn't have to be tied to a single cloud platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  13. Terraform Fits Naturally Into CI/CD
&lt;/h2&gt;

&lt;p&gt;Terraform becomes even more powerful when combined with CI/CD.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer
    ↓
Git Push
    ↓
CI/CD Pipeline
    ↓
terraform fmt
    ↓
terraform validate
    ↓
terraform plan
    ↓
Approval
    ↓
terraform apply
    ↓
Infrastructure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now infrastructure changes can follow an automated workflow.&lt;/p&gt;

&lt;p&gt;You don't necessarily need someone sitting in front of the cloud console.&lt;/p&gt;

&lt;h2&gt;
  
  
  Terraform Isn't Just About Creating Resources
&lt;/h2&gt;

&lt;p&gt;This is probably the most important point.&lt;/p&gt;

&lt;p&gt;Terraform isn't valuable simply because it can create an EC2 instance.&lt;/p&gt;

&lt;p&gt;You could create an EC2 instance manually.&lt;/p&gt;

&lt;p&gt;You could also use a cloud CLI.&lt;/p&gt;

&lt;p&gt;The real value is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Terraform turns infrastructure into code.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And once infrastructure becomes code, you gain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Version Control
       +
Automation
       +
Consistency
       +
Reusability
       +
Reviewability
       +
Repeatability
       +
Reduced Human Error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the real benefit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manual Infrastructure vs Terraform
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Manual Approach&lt;/th&gt;
&lt;th&gt;Terraform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Click through console&lt;/td&gt;
&lt;td&gt;Infrastructure as Code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repetitive work&lt;/td&gt;
&lt;td&gt;Automation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Higher human error&lt;/td&gt;
&lt;td&gt;Consistent configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difficult to reproduce&lt;/td&gt;
&lt;td&gt;Easily reproducible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Harder to track changes&lt;/td&gt;
&lt;td&gt;Git version control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Environment drift&lt;/td&gt;
&lt;td&gt;Standardized environments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual documentation&lt;/td&gt;
&lt;td&gt;Code acts as documentation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Difficult to scale&lt;/td&gt;
&lt;td&gt;Reusable configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual cleanup&lt;/td&gt;
&lt;td&gt;&lt;code&gt;terraform destroy&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Harder collaboration&lt;/td&gt;
&lt;td&gt;Code review + Git&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time-consuming&lt;/td&gt;
&lt;td&gt;Faster provisioning&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  But Should Everything Be Terraform?
&lt;/h2&gt;

&lt;p&gt;Not necessarily.&lt;/p&gt;

&lt;p&gt;Terraform is powerful, but it's not a magic solution for everything.&lt;/p&gt;

&lt;p&gt;You still need to think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Terraform state management&lt;/li&gt;
&lt;li&gt;Secrets management&lt;/li&gt;
&lt;li&gt;State locking&lt;/li&gt;
&lt;li&gt;Module design&lt;/li&gt;
&lt;li&gt;Provider versions&lt;/li&gt;
&lt;li&gt;Access control&lt;/li&gt;
&lt;li&gt;CI/CD security&lt;/li&gt;
&lt;li&gt;Infrastructure testing&lt;/li&gt;
&lt;li&gt;Cloud architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And you should avoid blindly putting every manual action into Terraform.&lt;/p&gt;

&lt;p&gt;The goal isn't:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Use Terraform because everyone uses Terraform."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The goal is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Use Infrastructure as Code when repeatability, consistency, automation, and controlled infrastructure changes matter.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Real Shift
&lt;/h2&gt;

&lt;p&gt;Without Infrastructure as Code, the process often looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Human
  ↓
Cloud Console
  ↓
Manual Configuration
  ↓
Infrastructure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With Terraform:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Engineer
    ↓
Terraform Code
    ↓
Git
    ↓
Review
    ↓
Terraform Plan
    ↓
Terraform Apply
    ↓
Infrastructure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's a fundamental change in how infrastructure is managed.&lt;/p&gt;

&lt;p&gt;So instead of infrastructure being something that engineers &lt;strong&gt;manually build&lt;/strong&gt;, Terraform allows infrastructure to become something engineers &lt;strong&gt;define, review, reproduce, and automate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And that's why Infrastructure as Code has become such an important part of modern DevOps.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Write once. Review once. Deploy repeatedly.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;✍️ &lt;strong&gt;Author&lt;/strong&gt;: &lt;em&gt;Omkar Sharma&lt;/em&gt;&lt;br&gt;&lt;br&gt;
📬 &lt;em&gt;Feel free to connect on &lt;a href="https://www.linkedin.com/in/omkarsharmaa/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or explore more on &lt;a href="https://github.com/omkarsharma2821" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>ai</category>
      <category>automation</category>
      <category>aws</category>
    </item>
    <item>
      <title>Docker Hub Was the Default Registry for Me. But This Time, I Tried Amazon ECR.</title>
      <dc:creator>Omkar Sharma</dc:creator>
      <pubDate>Sun, 23 Aug 2026 18:14:04 +0000</pubDate>
      <link>https://dev.to/omkarsharma2821/docker-hub-was-the-default-registry-for-me-but-this-time-i-tried-amazon-ecr-2a19</link>
      <guid>https://dev.to/omkarsharma2821/docker-hub-was-the-default-registry-for-me-but-this-time-i-tried-amazon-ecr-2a19</guid>
      <description>&lt;p&gt;Docker Hub had always been my go-to registry whenever I worked with Docker.&lt;/p&gt;

&lt;p&gt;But this time, while deploying a Weather Application on AWS, I thought — &lt;strong&gt;why not try Amazon ECR?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since I was already deploying the application on ECS with Fargate, keeping the container image within AWS felt like a good opportunity to explore ECR, especially with its integration with ECS and AWS IAM.&lt;/p&gt;

&lt;p&gt;So, I decided to give it a try.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source Code → EC2 → Docker → ECR → ECS Fargate&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here’s how the journey went.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Launch and Configure EC2
&lt;/h3&gt;

&lt;p&gt;After launching and connecting to the Ubuntu EC2 instance, install and verify the tools required to build and deploy the application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcwtpnridnaxk91i7jglg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcwtpnridnaxk91i7jglg.png" alt=" " width="800" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Install Docker
&lt;/h4&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 &lt;span class="nb"&gt;install &lt;/span&gt;docker.io &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Installs Docker on the Ubuntu EC2 instance.&lt;/p&gt;

&lt;h4&gt;
  
  
  Verify Docker Installation
&lt;/h4&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;Checks whether Docker is installed and displays the installed version.&lt;/p&gt;

&lt;h4&gt;
  
  
  Check Running Containers
&lt;/h4&gt;



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

&lt;/div&gt;



&lt;p&gt;Lists the currently running Docker containers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr2fvtsm3hko7a5ri4p36.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr2fvtsm3hko7a5ri4p36.png" alt=" " width="799" height="87"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Give the Current User Docker Permissions
&lt;/h4&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;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; newgrp docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adds the current user to the Docker group and applies the new group membership immediately, allowing Docker commands to run without &lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Verify Docker Permissions
&lt;/h4&gt;



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

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ypaklebkj8oywje9zav.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ypaklebkj8oywje9zav.png" alt=" " width="800" height="93"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Confirms that the current user can run Docker commands without requiring &lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Install AWS CLI
&lt;/h4&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 &lt;span class="nb"&gt;install &lt;/span&gt;awscli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Installs the AWS Command Line Interface for interacting with AWS services from the EC2 instance.&lt;/p&gt;

&lt;h4&gt;
  
  
  Verify AWS CLI Installation
&lt;/h4&gt;



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

&lt;/div&gt;



&lt;p&gt;Checks whether the AWS CLI is installed correctly and displays its installed version.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Pull and Dockerize the Weather Application
&lt;/h3&gt;

&lt;p&gt;After configuring the EC2 instance, pull the application source code from GitHub and prepare it for containerization.&lt;/p&gt;

&lt;h4&gt;
  
  
  Clone the Repository
&lt;/h4&gt;

&lt;p&gt;Clone the application repository onto the EC2 instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/omkarsharma2821/Weather-App-for-AWS.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3jas37jlxpzp35jwjhxx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3jas37jlxpzp35jwjhxx.png" alt=" " width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Downloads the application source code from GitHub to the EC2 instance.&lt;/p&gt;

&lt;h4&gt;
  
  
  Navigate to the Application Directory
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;Weather-App-for-AWS/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Moves into the application directory where the source code and Dockerfile are located.&lt;/p&gt;

&lt;h4&gt;
  
  
  Inspect the Application
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lists the application files and directories to verify that the repository was cloned successfully.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv7xruh3u86xzb5a0uqwt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv7xruh3u86xzb5a0uqwt.png" alt=" " width="800" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Build the Docker Image
&lt;/h4&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;--build-arg&lt;/span&gt; &lt;span class="nv"&gt;VITE_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"YOUR_API_KEY"&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; weather-app &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The command &lt;code&gt;docker build --build-arg VITE_API_KEY="YOUR_API_KEY" -t weather-app .&lt;/code&gt; builds a Docker image using the &lt;code&gt;Dockerfile&lt;/code&gt; in the current directory (&lt;code&gt;.&lt;/code&gt;), while &lt;code&gt;--build-arg VITE_API_KEY="YOUR_API_KEY"&lt;/code&gt; passes the &lt;code&gt;VITE_API_KEY&lt;/code&gt; value to the Docker build process so that the Vite application can use it during &lt;code&gt;npm run build&lt;/code&gt;; &lt;code&gt;-t weather-app&lt;/code&gt; gives the resulting Docker image the name &lt;code&gt;weather-app&lt;/code&gt;, which can then be used to run, tag, and push the image to Amazon ECR.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm2gh7top65dezy0lvuye.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm2gh7top65dezy0lvuye.png" alt=" " width="800" height="683"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Verify the Docker Image
&lt;/h4&gt;



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

&lt;/div&gt;



&lt;p&gt;Lists the available Docker images and confirms that the &lt;code&gt;weather-app&lt;/code&gt; image was created successfully.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0bh0n872y7dnutdmotm9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0bh0n872y7dnutdmotm9.png" alt=" " width="800" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Run the Container
&lt;/h4&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; 3000:80--name weather-app weather-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Starts the weather application as a background container and maps the application's port to the EC2 instance.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Replace &lt;code&gt;3000:80&lt;/code&gt; with the port used by your application.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Verify the Running Container
&lt;/h4&gt;



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

&lt;/div&gt;



&lt;p&gt;Confirms that the weather application container is running successfully.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh6g20nee1079onqt8pm8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh6g20nee1079onqt8pm8.png" alt=" " width="800" height="53"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Test the Application
&lt;/h4&gt;

&lt;p&gt;The application can now be tested using the EC2 instance's public IP and the exposed port:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://&amp;lt;EC2-PUBLIC-IP&amp;gt;:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This confirms that the application works correctly inside the Docker container before pushing the image to Amazon ECR.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjk2bxvq5e69ia7t6s0il.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjk2bxvq5e69ia7t6s0il.png" alt=" " width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Create an ECR Repository and Push the Docker Image
&lt;/h3&gt;

&lt;p&gt;Once the Docker image has been built and tested on the EC2 instance, the next step is to store the image in &lt;strong&gt;Amazon Elastic Container Registry (ECR)&lt;/strong&gt;. ECR provides a private container registry where the Docker image can be securely stored and later pulled by Amazon ECS.&lt;/p&gt;

&lt;h4&gt;
  
  
  Create the ECR Repository
&lt;/h4&gt;

&lt;p&gt;Create a private ECR repository from the AWS Management Console.&lt;/p&gt;

&lt;p&gt;Navigate to:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Console → ECR → Repositories → Create repository&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Give the repository a name, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;weather-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep the repository private and create it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffhrk657mf71pkapw56z5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffhrk657mf71pkapw56z5.png" alt=" " width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Authenticate Docker with Amazon ECR
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh82w98siy12bgos0g4sb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh82w98siy12bgos0g4sb.png" alt=" " width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Ensure the IAM user/role has ECR permissions, especially &lt;code&gt;ecr:GetAuthorizationToken&lt;/code&gt;, before authenticating Docker with ECR.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This creates an ECR-compatible tag for the local &lt;code&gt;weather-app&lt;/code&gt; image.&lt;/p&gt;

&lt;h4&gt;
  
  
  Push the Image to ECR
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F70f8cgs2r8vz9se11m3e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F70f8cgs2r8vz9se11m3e.png" alt=" " width="800" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Verify the Image
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo50p6mpu4zb0204jrnlq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo50p6mpu4zb0204jrnlq.png" alt=" " width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, the application image is available in ECR and ready to be deployed through &lt;strong&gt;Amazon ECS with AWS Fargate&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Create ECS Cluster and Deploy Using Fargate
&lt;/h3&gt;

&lt;p&gt;Once the Docker image is available in Amazon ECR, the next step is to deploy the containerized weather application using &lt;strong&gt;Amazon ECS with AWS Fargate&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Create an ECS Cluster
&lt;/h4&gt;

&lt;p&gt;Navigate to:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AWS Console → ECS → Clusters → Create Cluster&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a cluster and select the &lt;strong&gt;AWS Fargate&lt;/strong&gt; infrastructure option.&lt;/p&gt;

&lt;p&gt;Give the cluster a suitable name, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;weather-app-cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdw1x8s6iwx54lm6jnpbu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdw1x8s6iwx54lm6jnpbu.png" alt=" " width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An ECS cluster provides a logical grouping of ECS services and tasks.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why Fargate?
&lt;/h4&gt;

&lt;p&gt;AWS Fargate is a serverless compute engine for containers. It allows ECS to run containers without requiring you to provision or manage EC2 instances for the container workloads.&lt;/p&gt;

&lt;p&gt;In this deployment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ECS = Container orchestration
Fargate = Compute used to run the containers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ECS manages the tasks and services, while Fargate provides the underlying compute capacity.&lt;/p&gt;

&lt;h4&gt;
  
  
  Create an ECS Task Definition
&lt;/h4&gt;

&lt;p&gt;Navigate to:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ECS → Task Definitions → Create new task definition&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Configure the task definition with the required application settings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Funwawf19i1hjvujpkg34.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Funwawf19i1hjvujpkg34.png" alt=" " width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Create an ECS Service
&lt;/h4&gt;

&lt;p&gt;After creating the task definition, create an ECS service inside the previously created cluster.&lt;/p&gt;

&lt;p&gt;Navigate to:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ECS → Clusters → weather-app-cluster → Create Service&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Select:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Launch type: Fargate
Task definition: weather-app
Desired tasks: 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The desired task count determines how many copies of the container ECS should keep running.&lt;/p&gt;

&lt;h4&gt;
  
  
  Configure Networking
&lt;/h4&gt;

&lt;p&gt;Select the VPC and subnets where the Fargate task will run.&lt;/p&gt;

&lt;p&gt;Configure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VPC:&lt;/strong&gt; Application VPC&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subnets:&lt;/strong&gt; Required subnets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security Group:&lt;/strong&gt; Application security group&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public IP:&lt;/strong&gt; Enable if the application needs to be directly accessible from the internet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The security group should allow inbound traffic on the application's required port.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type: Custom TCP
Port: 3000
Source: Required traffic source
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a production architecture, the application would typically be placed in private subnets and exposed through an &lt;strong&gt;Application Load Balancer (ALB)&lt;/strong&gt; rather than assigning a public IP directly to the task.&lt;/p&gt;

&lt;h4&gt;
  
  
  Deploy the Service
&lt;/h4&gt;

&lt;p&gt;Review the configuration and create the ECS service.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb7lgyj0gwtms5qn930qc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb7lgyj0gwtms5qn930qc.png" alt=" " width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjx8ejlkzrw18fi9t9ef9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjx8ejlkzrw18fi9t9ef9.png" alt=" " width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ECS will then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pull the Docker image from ECR.&lt;/li&gt;
&lt;li&gt;Provision the required Fargate compute.&lt;/li&gt;
&lt;li&gt;Start the container.&lt;/li&gt;
&lt;li&gt;Attach the configured networking and security group.&lt;/li&gt;
&lt;li&gt;Keep the desired number of tasks running.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once the task reaches the &lt;strong&gt;RUNNING&lt;/strong&gt; state, the weather application is successfully deployed on ECS using Fargate.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feid0b7nl78pdo5j85906.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feid0b7nl78pdo5j85906.png" alt=" " width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;✍️ &lt;strong&gt;Author&lt;/strong&gt;: &lt;em&gt;Omkar Sharma&lt;/em&gt;&lt;br&gt;&lt;br&gt;
📬 &lt;em&gt;Feel free to connect on &lt;a href="https://www.linkedin.com/in/omkarsharmaa/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or explore more on &lt;a href="https://github.com/omkarsharma2821" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>containers</category>
      <category>cluster</category>
      <category>aws</category>
      <category>docker</category>
    </item>
    <item>
      <title>Jenkins CI/CD Pipeline for a Dockerized Node.js Application: Manual Trigger vs Automatic Trigger Using GitHub Webhooks</title>
      <dc:creator>Omkar Sharma</dc:creator>
      <pubDate>Sat, 23 May 2026 08:32:33 +0000</pubDate>
      <link>https://dev.to/omkarsharma2821/jenkins-cicd-pipeline-for-a-dockerized-nodejs-application-manual-trigger-vs-automatic-trigger-1j5b</link>
      <guid>https://dev.to/omkarsharma2821/jenkins-cicd-pipeline-for-a-dockerized-nodejs-application-manual-trigger-vs-automatic-trigger-1j5b</guid>
      <description>&lt;p&gt;Have you ever pushed code to GitHub and wished your application could automatically build and deploy itself without logging into a server or clicking a button in Jenkins? In this article, you'll learn how to build a complete CI/CD pipeline for a Dockerized Node.js application using Jenkins, starting with manual deployments and progressing to fully automated deployments using GitHub webhooks.&lt;/p&gt;

&lt;p&gt;We will cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating a Jenkins pipeline&lt;/li&gt;
&lt;li&gt;Building a Docker image&lt;/li&gt;
&lt;li&gt;Deploying a container&lt;/li&gt;
&lt;li&gt;Triggering builds manually&lt;/li&gt;
&lt;li&gt;Triggering builds automatically&lt;/li&gt;
&lt;li&gt;GitHub Personal Access Tokens&lt;/li&gt;
&lt;li&gt;Fine-grained vs Classic Tokens&lt;/li&gt;
&lt;li&gt;Jenkins credentials&lt;/li&gt;
&lt;li&gt;GitHub webhooks&lt;/li&gt;
&lt;li&gt;Required Jenkins plugins&lt;/li&gt;
&lt;li&gt;Common errors and troubleshooting
The goal is to understand not only how to configure everything but also why each component is needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Node.js Application Repo URL- &lt;a href="https://github.com/omkarsharma2821/Node.js-App-Deploy-Github-Action" rel="noopener noreferrer"&gt;https://github.com/omkarsharma2821/Node.js-App-Deploy-Github-Action&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;

&lt;p&gt;The complete flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer
    |
    | Git Push
    v
GitHub Repository
    |
    | Webhook
    v
Jenkins
    |
    | Build Docker Image
    v
Docker
    |
    | Run Container
    v
Application Running
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without webhooks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer
    |
    | Git Push
    v
GitHub Repository

Jenkins Build Now (Manual Trigger)
    |
    v
Build and Deploy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With webhooks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer
    |
    | Git Push
    v
GitHub Repository
    |
    v
Webhook
    |
    v
Jenkins
    |
    v
Build and Deploy Automatically
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before starting, ensure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ubuntu Server&lt;/li&gt;
&lt;li&gt;Jenkins installed&lt;/li&gt;
&lt;li&gt;Docker installed&lt;/li&gt;
&lt;li&gt;Git installed&lt;/li&gt;
&lt;li&gt;GitHub repository&lt;/li&gt;
&lt;li&gt;Node.js application with Dockerfile
Verify installations:
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Installing Docker on Jenkins Server
&lt;/h2&gt;

&lt;p&gt;Install Docker:&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 update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;docker.io &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable Docker:&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;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;docker
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify:&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;h2&gt;
  
  
  Allow Jenkins to Use Docker
&lt;/h2&gt;

&lt;p&gt;By default Jenkins cannot execute Docker commands.&lt;/p&gt;

&lt;p&gt;Add Jenkins user to Docker group:&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;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker jenkins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Jenkins:&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;systemctl restart jenkins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify:&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;su - jenkins
docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If Docker works without sudo, Jenkins is ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the Pipeline
&lt;/h2&gt;

&lt;p&gt;Initially we created a Jenkins pipeline that manually clones the repository.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt;

    &lt;span class="n"&gt;stages&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Clone Repository'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;'''
                    mkdir -p devops
                    cd devops
                    rm -rf Node.js-App-Deploy-Github-Action
                    git clone -b main https://github.com/username/repository.git
                '''&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Build Image'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;'''
                    cd devops/Node.js-App-Deploy-Github-Action
                    docker build -t node-app .
                '''&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Deploy'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;'''
                    docker run -d -p 8000:8080 node-app
                '''&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This works, but every deployment requires manually clicking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build Now
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Problem with Multiple Deployments
&lt;/h2&gt;

&lt;p&gt;Suppose the application is already running.&lt;/p&gt;

&lt;p&gt;Running:&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; 8000:8080 node-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;again will fail because port 8000 is already occupied.&lt;/p&gt;

&lt;p&gt;Error:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bind for 0.0.0.0:8000 failed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Better Deployment Approach
&lt;/h2&gt;

&lt;p&gt;Before starting a new container, remove the old one.&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="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; node-app-container &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then start a new 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 &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; node-app-container &lt;span class="nt"&gt;-p&lt;/span&gt; 8000:8080 node-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Understanding docker rm -f node-app-container || true
&lt;/h2&gt;

&lt;p&gt;Let's break it down.&lt;/p&gt;

&lt;h2&gt;
  
  
  docker rm
&lt;/h2&gt;

&lt;p&gt;Removes a 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 &lt;span class="nb"&gt;rm &lt;/span&gt;node-app-container
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Works only if container is stopped.&lt;/p&gt;

&lt;h3&gt;
  
  
  -f
&lt;/h3&gt;

&lt;p&gt;Force remove.&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="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; node-app-container
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stops container&lt;/li&gt;
&lt;li&gt;Removes container&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  ||
&lt;/h3&gt;

&lt;p&gt;OR operator.&lt;/p&gt;

&lt;p&gt;Syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;command1 &lt;span class="o"&gt;||&lt;/span&gt; command2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If command1 fails, command2 executes.&lt;/p&gt;

&lt;h3&gt;
  
  
  true
&lt;/h3&gt;

&lt;p&gt;Always returns success.&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;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exit code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Final Meaning
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; node-app-container &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If container exists:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Remove it
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If container doesn't exist:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ignore error and continue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prevents Jenkins from failing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manual Triggering
&lt;/h2&gt;

&lt;p&gt;The simplest approach is manual execution.&lt;/p&gt;

&lt;p&gt;Navigate to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Jenkins Job
|
└── Build Now
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy to understand&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Good for learning&lt;br&gt;
Disadvantages:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Requires human intervention&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Not real CI/CD&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Automatic Triggering
&lt;/h2&gt;

&lt;p&gt;The goal of CI/CD is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Code Push
    |
    v
Automatic Build
    |
    v
Automatic Deployment
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where GitHub webhooks come into play.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Required Jenkins Plugins&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Install the following Jenkins plugins before configuring the CI/CD pipeline:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;1. Git Plugin&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Enables Jenkins to interact with Git repositories.&lt;/li&gt;
&lt;li&gt;Allows Jenkins to clone repositories, fetch changes, and checkout specific branches.&lt;/li&gt;
&lt;li&gt;Required for integrating Jenkins with GitHub repositories.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;2. GitHub Plugin&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Provides integration between Jenkins and GitHub.&lt;/li&gt;
&lt;li&gt;Allows Jenkins to communicate with GitHub repositories and services.&lt;/li&gt;
&lt;li&gt;Supports GitHub-related features within Jenkins.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;3. GitHub Integration Plugin&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Enables GitHub webhook support.&lt;/li&gt;
&lt;li&gt;Allows Jenkins to automatically trigger builds when code is pushed to GitHub.&lt;/li&gt;
&lt;li&gt;Essential for implementing automated CI/CD workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;4. Pipeline Plugin&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Enables support for Jenkins Pipelines.&lt;/li&gt;
&lt;li&gt;Allows execution of Jenkinsfiles written in Declarative or Scripted Pipeline syntax.&lt;/li&gt;
&lt;li&gt;Required for defining CI/CD workflows as code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;5. Credentials Plugin&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Provides secure storage for sensitive information.&lt;/li&gt;
&lt;li&gt;Allows storing:

&lt;ul&gt;
&lt;li&gt;GitHub Personal Access Tokens (PATs)&lt;/li&gt;
&lt;li&gt;Usernames and passwords&lt;/li&gt;
&lt;li&gt;SSH keys&lt;/li&gt;
&lt;li&gt;API tokens&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Prevents hardcoding secrets in Jenkins jobs and pipelines.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;GitHub Authentication&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When Jenkins needs to access a GitHub repository, authentication requirements depend on the repository type.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Public Repository&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Can typically be cloned without authentication.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/username/repository.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Private Repository&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Requires authentication.&lt;/li&gt;
&lt;li&gt;GitHub no longer supports account passwords for Git operations.&lt;/li&gt;
&lt;li&gt;A Personal Access Token (PAT) must be used instead of a password.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Why Use a Personal Access Token (PAT)?&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;More secure than passwords.&lt;/li&gt;
&lt;li&gt;Allows granular permission control.&lt;/li&gt;
&lt;li&gt;Can be revoked without affecting your GitHub account password.&lt;/li&gt;
&lt;li&gt;Recommended by GitHub for all Git operations requiring authentication.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Classic Personal Access Token
&lt;/h2&gt;

&lt;p&gt;Older token type.&lt;/p&gt;

&lt;p&gt;Advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Easy to configure&lt;br&gt;
Disadvantages:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Broad permissions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Less secure&lt;br&gt;
Example scopes:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;repo
workflow
admin:repo_hook
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Fine-Grained Personal Access Token
&lt;/h2&gt;

&lt;p&gt;Newer and recommended approach.&lt;/p&gt;

&lt;p&gt;Advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository-level access&lt;/li&gt;
&lt;li&gt;Better security&lt;/li&gt;
&lt;li&gt;Granular permissions
Example:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Repository Access:
Only selected repositories
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Permissions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Contents: Read and Write
Metadata: Read
Webhooks: Read and Write
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Fine-Grained vs Classic Token
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Fine-Grained&lt;/th&gt;
&lt;th&gt;Classic&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Lower&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repository Scope&lt;/td&gt;
&lt;td&gt;Specific&lt;/td&gt;
&lt;td&gt;Broad&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permission Control&lt;/td&gt;
&lt;td&gt;Granular&lt;/td&gt;
&lt;td&gt;Broad&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recommended&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Legacy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For modern projects, prefer Fine-Grained tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding GitHub Token to Jenkins
&lt;/h2&gt;

&lt;p&gt;Navigate to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Manage Jenkins
|
Credentials
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Select:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Global Credentials
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Choose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Add Credentials
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kind:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Username with Password
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Username: GitHub Username
Password: Personal Access Token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ID:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;github-creds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pipeline Script vs Pipeline Script from SCM
&lt;/h2&gt;

&lt;p&gt;Many beginners get confused here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pipeline Script
&lt;/h2&gt;

&lt;p&gt;Pipeline stored inside Jenkins UI.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Quick setup&lt;br&gt;
Disadvantages:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Not version controlled&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Difficult to maintain&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pipeline Script from SCM
&lt;/h2&gt;

&lt;p&gt;Pipeline stored in GitHub repository.&lt;/p&gt;

&lt;p&gt;Repository structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project/
|
|-- Dockerfile
|-- package.json
|-- app.js
|-- Jenkinsfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jenkins automatically downloads Jenkinsfile.&lt;/p&gt;

&lt;p&gt;Advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Version controlled&lt;/li&gt;
&lt;li&gt;Industry standard&lt;/li&gt;
&lt;li&gt;Easier maintenance
Recommended approach.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Configuring Pipeline from SCM
&lt;/h2&gt;

&lt;p&gt;Create Jenkins job.&lt;/p&gt;

&lt;p&gt;Select:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pipeline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Under Definition:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pipeline script from SCM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;SCM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repository URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/username/repository.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;*/main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Script Path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Jenkinsfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating GitHub Webhook
&lt;/h2&gt;

&lt;p&gt;Navigate to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GitHub Repository
|
Settings
|
Webhooks
|
Add Webhook
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Payload URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://JENKINS_PUBLIC_IP:8080/github-webhook/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Content Type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;application/json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Event:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Just the push event
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save webhook.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuring Jenkins Trigger
&lt;/h2&gt;

&lt;p&gt;Open job configuration.&lt;/p&gt;

&lt;p&gt;Under Build Triggers:&lt;/p&gt;

&lt;p&gt;Select:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GitHub hook trigger for GITScm polling
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing the Webhook
&lt;/h2&gt;

&lt;p&gt;Push code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"testing webhook"&lt;/span&gt;
git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GitHub Push
    |
    v
Webhook
    |
    v
Jenkins
    |
    v
Pipeline Starts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No manual click required.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Troubleshooting
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Webhook Returns 404
&lt;/h2&gt;

&lt;p&gt;Cause:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Wrong webhook URL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Correct:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://SERVER-IP:8080/github-webhook/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Webhook Returns 403
&lt;/h2&gt;

&lt;p&gt;Cause:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authentication or security issue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub plugin&lt;/li&gt;
&lt;li&gt;GitHub integration plugin&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Webhook Returns 200 But Build Doesn't Start
&lt;/h2&gt;

&lt;p&gt;Common cause:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pipeline Script instead of Pipeline Script from SCM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Repository mapping issue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Dockerfile Not Found
&lt;/h2&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;unable to evaluate symlinks in Dockerfile path
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cause:&lt;/p&gt;

&lt;p&gt;Wrong working directory.&lt;/p&gt;

&lt;p&gt;Check:&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;pwd
ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify Dockerfile location.&lt;/p&gt;

&lt;h2&gt;
  
  
  Permission Denied While Running Docker
&lt;/h2&gt;

&lt;p&gt;Cause:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Jenkins not in docker group
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fix:&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;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker jenkins
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart jenkins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Final Jenkinsfile
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt;

    &lt;span class="n"&gt;stages&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Build Image'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;'''
                    docker build -t node-app .
                '''&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Deploy'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;'''
                    docker rm -f node-app-container || true
                    docker run -d --name node-app-container -p 8000:8080 node-app
                '''&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;A Jenkins pipeline can be triggered manually or automatically. Manual triggering is useful for learning and testing, but real CI/CD begins when code pushes automatically trigger builds and deployments.&lt;/p&gt;

&lt;p&gt;The recommended production approach is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Store the Jenkinsfile in GitHub.&lt;/li&gt;
&lt;li&gt;Use Pipeline Script from SCM.&lt;/li&gt;
&lt;li&gt;Configure GitHub credentials using a Personal Access Token.&lt;/li&gt;
&lt;li&gt;Enable GitHub webhook integration.&lt;/li&gt;
&lt;li&gt;Use Docker for packaging and deployment.&lt;/li&gt;
&lt;li&gt;Remove old containers before deploying new versions.
With this setup, every code push automatically builds a Docker image, deploys a fresh container, and updates the application without requiring any manual intervention.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;✍️ &lt;strong&gt;Author&lt;/strong&gt;: &lt;em&gt;Omkar Sharma&lt;/em&gt;&lt;br&gt;&lt;br&gt;
📬 &lt;em&gt;Feel free to connect on &lt;a href="https://www.linkedin.com/in/omkarsharmaa/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or explore more on &lt;a href="https://github.com/omkarsharma2821" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>jenkins</category>
      <category>docker</category>
      <category>github</category>
      <category>devops</category>
    </item>
    <item>
      <title>Deploy Node.js &amp; Express Application Using CI/CD (GitHub Actions + Docker)</title>
      <dc:creator>Omkar Sharma</dc:creator>
      <pubDate>Sat, 11 Apr 2026 11:09:46 +0000</pubDate>
      <link>https://dev.to/omkarsharma2821/deploy-nodejs-express-application-using-cicd-github-actions-docker-1fag</link>
      <guid>https://dev.to/omkarsharma2821/deploy-nodejs-express-application-using-cicd-github-actions-docker-1fag</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ps32jmakv6wuq4qn4d5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ps32jmakv6wuq4qn4d5.png" alt="Omkar Sharma" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Flow before deep dive
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Developer pushes code to GitHub&lt;/li&gt;
&lt;li&gt;GitHub Actions triggers pipeline&lt;/li&gt;
&lt;li&gt;Pipeline connects to EC2 via SSH&lt;/li&gt;
&lt;li&gt;Pulls latest code&lt;/li&gt;
&lt;li&gt;Rebuilds Docker image&lt;/li&gt;
&lt;li&gt;Runs container using Docker Compose&lt;/li&gt;
&lt;li&gt;Application is live on EC2 public IP&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Node.js (v16+) and npm installed on local machine&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Git installed on local machine and basic commands knowledge&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Docker installed on local machine&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;GitHub account&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AWS account&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Basic cloud/devops knowledge&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1. Create a Simple Node.js + Express Application
&lt;/h2&gt;

&lt;p&gt;Initialize a Node.js project:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Install required dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;express
npm &lt;span class="nb"&gt;install&lt;/span&gt; @types/express &lt;span class="nt"&gt;--save-dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Update &lt;code&gt;package.json&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Add the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node-app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node index.js"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Create &lt;code&gt;index.js&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&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;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello from the server!&lt;/span&gt;&lt;span class="dl"&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;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Server is running on port &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&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;h2&gt;
  
  
  4. Create a Dockerfile
&lt;/h2&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; 8080&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; [ "node" , "index" ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Build Docker Image
&lt;/h2&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; node-app &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Explanation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docker build&lt;/code&gt; → Builds a Docker image&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-t node-app&lt;/code&gt; → Tags the image with the name &lt;code&gt;node-app&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.&lt;/code&gt; → Refers to the current directory (build context)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Purpose of &lt;code&gt;.&lt;/code&gt; (dot):&lt;/strong&gt;&lt;br&gt;
It tells Docker to use the current folder as the context, meaning all files in this directory are available to the Docker daemon during build.&lt;/p&gt;
&lt;h2&gt;
  
  
  6. Run the Container
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Before running below command make sure docker engine is running state........ for testing trying to run container before creating compose file after creating compose file we dont need to run container manually just compose up commmand will take care of everything&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&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:8080 &lt;span class="nt"&gt;--rm&lt;/span&gt; node-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Explanation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-d&lt;/code&gt; → Runs container in detached mode&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-p 8080:8080&lt;/code&gt; → Maps host port 8080 to container port 8080&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--rm&lt;/code&gt; → Automatically removes the container when it stops&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Purpose of &lt;code&gt;--rm&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevents accumulation of stopped containers&lt;/li&gt;
&lt;li&gt;Keeps the system clean&lt;/li&gt;
&lt;li&gt;Useful for temporary/testing containers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. Test Using curl
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4kubj59fa3vovhn8kr2n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4kubj59fa3vovhn8kr2n.png" alt="Omkar Sharma" width="800" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;curl is a command-line tool used to transfer data to and from a server using URLs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Expected output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hello from the server!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  8. Create Docker Compose File
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;docker-compose.yml&lt;/code&gt;:&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;services&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="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
      &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&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="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:8080"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run the Application
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;In browser test the application &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mayfok9id1v7u88l5qo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7mayfok9id1v7u88l5qo.png" alt="omkar sharma" width="595" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Stop the Application
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify Again
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  9. Push Code to GitHub
&lt;/h2&gt;

&lt;p&gt;Check my github repo for this task - &lt;a href="https://github.com/omkarsharma2821" rel="noopener noreferrer"&gt;omkarsharma2821&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Initialize Git and push code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git init
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Initial commit"&lt;/span&gt;

git branch &lt;span class="nt"&gt;-M&lt;/span&gt; main

git remote add origin &amp;lt;your-repo-url&amp;gt;

git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  10. Create an EC2 Instance (Ubuntu)
&lt;/h2&gt;

&lt;p&gt;Once the instance is created, connect via SSH and run:&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 update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Importance of Update &amp;amp; Upgrade
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Updates package list from repositories&lt;/li&gt;
&lt;li&gt;Installs latest security patches&lt;/li&gt;
&lt;li&gt;Fixes vulnerabilities&lt;/li&gt;
&lt;li&gt;Ensures system stability before installing new software&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  11. Install Docker &amp;amp; Docker Compose
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option 1: Install from Ubuntu Repository
&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;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;docker.io &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;docker-compose &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option 2: Install from Official Docker Website
&lt;/h3&gt;

&lt;p&gt;Recommended for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Latest stable version&lt;/li&gt;
&lt;li&gt;Better performance and features&lt;/li&gt;
&lt;li&gt;Production environments&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  12. Run Application on EC2
&lt;/h2&gt;

&lt;p&gt;Clone your repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &amp;lt;your-repo-url&amp;gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;repo-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Test Application
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://&amp;lt;EC2-PUBLIC-IP&amp;gt;:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;make sure you have allowed port no. 8080 in the instance security group to get the response.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  13. Setup GitHub Actions (CI/CD)
&lt;/h2&gt;

&lt;p&gt;Create workflow file:&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="s"&gt;.github/workflows/deploy.yml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&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;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy Node App&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&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;Checkout Code&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&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;Deploy via SSH&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;appleboy/ssh-action@v1.0.3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_HOST }}&lt;/span&gt;
          &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_USERNAME }}&lt;/span&gt;
          &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.SSH_KEY }}&lt;/span&gt;
          &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;set -e&lt;/span&gt;

            &lt;span class="s"&gt;cd /home/ubuntu/node-app/Node.js-App-Deploy-Github-Action&lt;/span&gt;

            &lt;span class="s"&gt;echo "Pulling latest code..."&lt;/span&gt;
            &lt;span class="s"&gt;git pull origin main&lt;/span&gt;

            &lt;span class="s"&gt;echo "Stopping existing containers..."&lt;/span&gt;
            &lt;span class="s"&gt;docker compose down&lt;/span&gt;

            &lt;span class="s"&gt;echo "Removing unused images..."&lt;/span&gt;
            &lt;span class="s"&gt;docker image prune -f&lt;/span&gt;

            &lt;span class="s"&gt;echo "Building and starting containers..."&lt;/span&gt;
            &lt;span class="s"&gt;docker compose up -d --build&lt;/span&gt;

            &lt;span class="s"&gt;echo "Deployment completed successfully"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;**set -e**&lt;br&gt;
Stops execution if any command fails&lt;br&gt;
Prevents partial deployments&lt;br&gt;
**Cleanup Step**&lt;br&gt;
docker image prune -f&lt;br&gt;
Prevents disk space issues over time&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  14. Generate SSH Keys
&lt;/h2&gt;

&lt;p&gt;On local machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa &lt;span class="nt"&gt;-b&lt;/span&gt; 4096
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Setup
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Copy public key to EC2:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_rsa.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste it into:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ssh"&gt;&lt;code&gt;&lt;span class="err"&gt;~/.&lt;/span&gt;&lt;span class="k"&gt;ssh&lt;/span&gt;/authorized_keys
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Add private key to GitHub:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Go to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GitHub → Repo → Settings → Secrets → Actions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhobdvgqlo8sbungtoqd2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhobdvgqlo8sbungtoqd2.png" alt="Omkar Sharma" width="800" height="239"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="err"&gt;SSH_KEY&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;your-key&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt;SSH_HOST&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;public-ip&lt;/span&gt; &lt;span class="err"&gt;of&lt;/span&gt; &lt;span class="err"&gt;ec2&amp;gt;&lt;/span&gt;
&lt;span class="err"&gt;SSH_USERNAME&lt;/span&gt; &lt;span class="err"&gt;-&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;root&lt;/span&gt; &lt;span class="err"&gt;or&lt;/span&gt; &lt;span class="err"&gt;ubuntu&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;✍️ &lt;strong&gt;Author&lt;/strong&gt;: &lt;em&gt;Omkar Sharma&lt;/em&gt;&lt;br&gt;&lt;br&gt;
📬 &lt;em&gt;Feel free to connect on &lt;a href="https://www.linkedin.com/in/omkarsharmaa/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or explore more on &lt;a href="https://github.com/omkarsharma2821" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>cicd</category>
      <category>aws</category>
      <category>githubactions</category>
    </item>
    <item>
      <title>Evolution of Deployment: From Bare Metal to Kubernetes (K8s Explained)</title>
      <dc:creator>Omkar Sharma</dc:creator>
      <pubDate>Sat, 21 Mar 2026 12:03:04 +0000</pubDate>
      <link>https://dev.to/omkarsharma2821/evolution-of-deployment-from-bare-metal-to-kubernetes-k8s-explained-1n04</link>
      <guid>https://dev.to/omkarsharma2821/evolution-of-deployment-from-bare-metal-to-kubernetes-k8s-explained-1n04</guid>
      <description>&lt;p&gt;Building an application is one challenge, but deploying it efficiently and scaling it for real-world users is an entirely different game.&lt;/p&gt;

&lt;p&gt;Over the years, deployment strategies have evolved significantly—from physical servers to modern container orchestration tools like Kubernetes. In this blog, we will understand this journey step by step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Application Development
&lt;/h2&gt;

&lt;p&gt;Let’s assume a developer builds an application using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The choice of tech stack depends on the developer’s comfort and project requirements.&lt;/p&gt;

&lt;p&gt;Once the application is ready on the local machine, the next step is deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Traditional Deployment (Bare Metal Servers)
&lt;/h2&gt;

&lt;p&gt;To make the application publicly accessible, the developer needs a server.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feocpkb3oqatp7jsot0tu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feocpkb3oqatp7jsot0tu.png" alt="Omkar Sharma" width="800" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Options:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Buy a physical server (&lt;strong&gt;Bare Metal&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;Rent a server from a third-party provider&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Process:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Deploy application on server&lt;/li&gt;
&lt;li&gt;Purchase a domain&lt;/li&gt;
&lt;li&gt;Map domain to server’s static IP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the application is live 🎉&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges in Traditional Deployment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Environment Consistency
&lt;/h3&gt;

&lt;p&gt;The application should behave the same in production as it does locally.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Famous problem: &lt;em&gt;“It works on my machine”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Scaling Issues
&lt;/h3&gt;

&lt;p&gt;As traffic grows, scaling becomes necessary.&lt;/p&gt;

&lt;h4&gt;
  
  
  Vertical Scaling:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk9vvx8wvbn4shed1tlpp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk9vvx8wvbn4shed1tlpp.png" alt="Omkar Sharma" width="800" height="700"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increase RAM (4GB → 16GB)&lt;/li&gt;
&lt;li&gt;Increase CPU cores&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Problems:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Expensive&lt;/li&gt;
&lt;li&gt;Manual effort required&lt;/li&gt;
&lt;li&gt;Limited scalability&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 3: Cloud Computing Revolution
&lt;/h2&gt;

&lt;p&gt;Cloud providers like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS&lt;/li&gt;
&lt;li&gt;Azure&lt;/li&gt;
&lt;li&gt;GCP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;transformed how applications are deployed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmtulsuvvpezptpzm5xqq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmtulsuvvpezptpzm5xqq.png" alt="Omkar Sharma" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No need to manage physical infrastructure&lt;/li&gt;
&lt;li&gt;Deploy applications from anywhere&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ready-to-use services:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Load Balancers&lt;/li&gt;
&lt;li&gt;CDN&lt;/li&gt;
&lt;li&gt;DNS (Route 53)&lt;/li&gt;
&lt;li&gt;Managed Databases (PostgreSQL, Redis)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Auto Scaling in Cloud
&lt;/h3&gt;

&lt;p&gt;Cloud platforms introduced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Auto Scaling Groups (ASG)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Policy-based scaling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now scaling becomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic&lt;/li&gt;
&lt;li&gt;Faster&lt;/li&gt;
&lt;li&gt;Cost-efficient&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Still a Problem: Environment Replication
&lt;/h2&gt;

&lt;p&gt;Even with cloud, consistency issues remain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local system → Windows&lt;/li&gt;
&lt;li&gt;Production → Linux&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Different OS and dependencies can break applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Virtualization (Virtual Machines)
&lt;/h2&gt;

&lt;p&gt;To solve consistency issues, &lt;strong&gt;Virtual Machines (VMs)&lt;/strong&gt; were introduced.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Each VM has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Its own OS&lt;/li&gt;
&lt;li&gt;Dependencies&lt;/li&gt;
&lt;li&gt;Application&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Advantages:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Consistent environments&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Disadvantages:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Heavy (includes full OS)&lt;/li&gt;
&lt;li&gt;Slow startup&lt;/li&gt;
&lt;li&gt;Resource intensive&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 5: Containerization (Docker Era)
&lt;/h2&gt;

&lt;p&gt;Containers improved virtualization.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Idea:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Package application + dependencies&lt;/li&gt;
&lt;li&gt;No full OS required&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Benefits:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Lightweight&lt;/li&gt;
&lt;li&gt;Fast startup&lt;/li&gt;
&lt;li&gt;Portable across environments&lt;/li&gt;
&lt;li&gt;Consistent behavior everywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Challenge: Managing Containers at Scale
&lt;/h2&gt;

&lt;p&gt;When applications grow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hundreds or thousands of containers are needed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Problems:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fij62v3a72dfkh7rl6zmc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fij62v3a72dfkh7rl6zmc.png" alt="Omkar Sharma" width="800" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to create containers?&lt;/li&gt;
&lt;li&gt;How to restart failed ones?&lt;/li&gt;
&lt;li&gt;How to manage networking?&lt;/li&gt;
&lt;li&gt;How to scale automatically?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Manual management becomes impossible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Google’s Internal Solution – Borg
&lt;/h2&gt;

&lt;p&gt;Google faced this challenge early due to massive traffic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Solution:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Built &lt;strong&gt;Borg&lt;/strong&gt; (around 2013–2014)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What Borg did:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Managed containers at scale&lt;/li&gt;
&lt;li&gt;Automated scheduling and recovery&lt;/li&gt;
&lt;li&gt;Handled failures efficiently&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 7: Kubernetes (K8s)
&lt;/h2&gt;

&lt;p&gt;Based on Borg’s experience, Google introduced &lt;strong&gt;Kubernetes&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Kubernetes?
&lt;/h3&gt;

&lt;p&gt;Kubernetes is an &lt;strong&gt;open-source container orchestration platform&lt;/strong&gt; that automates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deployment&lt;/li&gt;
&lt;li&gt;Scaling&lt;/li&gt;
&lt;li&gt;Management of containers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why the Name Kubernetes?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9r2hl9k69cc2i13wdk24.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9r2hl9k69cc2i13wdk24.png" alt="Omkar Sharma" width="800" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Derived from Greek word meaning &lt;strong&gt;“Helmsman” (ship pilot)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Represents managing containers like steering a ship&lt;/li&gt;
&lt;li&gt;Abbreviated as &lt;strong&gt;K8s&lt;/strong&gt; (8 letters between K and S)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Problem Solved&lt;/th&gt;
&lt;th&gt;Limitation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bare Metal&lt;/td&gt;
&lt;td&gt;Basic hosting&lt;/td&gt;
&lt;td&gt;Hard to scale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud&lt;/td&gt;
&lt;td&gt;Easy infrastructure&lt;/td&gt;
&lt;td&gt;Env consistency issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virtual Machines&lt;/td&gt;
&lt;td&gt;Consistent environments&lt;/td&gt;
&lt;td&gt;Heavy &amp;amp; slow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Containers&lt;/td&gt;
&lt;td&gt;Lightweight &amp;amp; portable&lt;/td&gt;
&lt;td&gt;Hard to manage at scale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kubernetes&lt;/td&gt;
&lt;td&gt;Full orchestration&lt;/td&gt;
&lt;td&gt;Learning curve&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The journey from bare metal servers to Kubernetes shows how deployment has evolved to handle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scalability&lt;/li&gt;
&lt;li&gt;Reliability&lt;/li&gt;
&lt;li&gt;Efficiency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Today, Kubernetes has become the &lt;strong&gt;industry standard&lt;/strong&gt; for managing containerized applications at scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  SEO Keywords (for better reach)
&lt;/h2&gt;

&lt;p&gt;Kubernetes explained, what is Kubernetes, container orchestration, Docker vs Kubernetes, evolution of deployment, cloud computing, DevOps tools, K8s tutorial, container management, microservices deployment&lt;/p&gt;




&lt;p&gt;✍️ &lt;strong&gt;Author&lt;/strong&gt;: &lt;em&gt;Omkar Sharma&lt;/em&gt;&lt;br&gt;&lt;br&gt;
📬 &lt;em&gt;Feel free to connect on &lt;a href="https://www.linkedin.com/in/omkarsharmaa/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or explore more on &lt;a href="https://github.com/omkarsharma2821" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>containers</category>
      <category>awscommunity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Complete Guide to Jenkins CI/CD Pipeline Setup on AWS EC2 (Ubuntu)</title>
      <dc:creator>Omkar Sharma</dc:creator>
      <pubDate>Fri, 27 Feb 2026 10:56:26 +0000</pubDate>
      <link>https://dev.to/omkarsharma2821/complete-guide-to-jenkins-cicd-pipeline-setup-on-aws-ec2-ubuntu-278f</link>
      <guid>https://dev.to/omkarsharma2821/complete-guide-to-jenkins-cicd-pipeline-setup-on-aws-ec2-ubuntu-278f</guid>
      <description>&lt;p&gt;Developers from the Application team write the code and push it to &lt;strong&gt;GitHub&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Now, instead of manually building and deploying the application, we use &lt;strong&gt;Jenkins&lt;/strong&gt; as a CI/CD tool to automate the entire process.&lt;/p&gt;

&lt;p&gt;Here’s how the flow works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Developers commit and push the code to &lt;strong&gt;GitHub&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Jenkins is connected to the repository using a webhook.
Whenever new code is pushed, Jenkins automatically triggers a pipeline.&lt;/li&gt;
&lt;li&gt;Jenkins pulls the latest code and starts the &lt;strong&gt;build process&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;During the build stage, &lt;strong&gt;Docker&lt;/strong&gt; is used to create a Docker image from that code.&lt;/li&gt;
&lt;li&gt;The Docker image is then pushed to a container registry (like Docker Hub or ECR).&lt;/li&gt;
&lt;li&gt;In the deployment stage, Jenkins deploys that image either:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;On an &lt;strong&gt;Amazon EC2&lt;/strong&gt; instance, or
&lt;/li&gt;
&lt;li&gt;On a &lt;strong&gt;Kubernetes&lt;/strong&gt; cluster.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Once the application is live, monitoring tools like &lt;strong&gt;Prometheus&lt;/strong&gt; are used to monitor application health, metrics, and performance.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft8degmf4msdmeuibddkh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft8degmf4msdmeuibddkh.png" alt="Omkar Sharma" width="800" height="681"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  In Simple Terms
&lt;/h3&gt;

&lt;p&gt;Jenkins acts as the brain of the CI/CD pipeline.&lt;br&gt;&lt;br&gt;
It automates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code integration (Continuous Integration)&lt;/li&gt;
&lt;li&gt;Testing and building&lt;/li&gt;
&lt;li&gt;Docker image creation&lt;/li&gt;
&lt;li&gt;Deployment to servers or Kubernetes&lt;/li&gt;
&lt;li&gt;And ensures the whole process runs automatically whenever new code is pushed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the concept of CI/CD using Jenkins — automation from code commit to production deployment and monitoring, without manual intervention.&lt;/p&gt;
&lt;h3&gt;
  
  
  Setting Up Jenkins on AWS EC2 (Ubuntu)
&lt;/h3&gt;
&lt;h3&gt;
  
  
  Launch EC2 Instance
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Launch an &lt;strong&gt;Ubuntu Server&lt;/strong&gt; EC2 instance.&lt;/li&gt;
&lt;li&gt;Instance type: Free Tier eligible (e.g., t2.micro).&lt;/li&gt;
&lt;li&gt;Storage: 15 GB (Free Tier eligible).&lt;/li&gt;
&lt;li&gt;Allow &lt;strong&gt;Port 80&lt;/strong&gt; in the Security Group (HTTP traffic).&lt;/li&gt;
&lt;li&gt;(Recommended) Also allow &lt;strong&gt;Port 8080&lt;/strong&gt; for Jenkins default access.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  What is Jenkins?
&lt;/h3&gt;

&lt;p&gt;Jenkins is a self-contained, open source automation server which can be used to automate all sorts of tasks related to building, testing, and delivering or deploying software.&lt;/p&gt;

&lt;p&gt;Jenkins can be installed through native system packages, Docker, or even run standalone on any machine with a Java Runtime Environment (JRE) installed.&lt;/p&gt;
&lt;h3&gt;
  
  
  Installation Steps (Ubuntu/Debian)
&lt;/h3&gt;

&lt;p&gt;Official Documentation:&lt;br&gt;&lt;br&gt;
&lt;a href="https://www.jenkins.io/doc/book/installing/linux/#debianubuntu" rel="noopener noreferrer"&gt;https://www.jenkins.io/doc/book/installing/linux/#debianubuntu&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Update Packages
&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;sudo &lt;/span&gt;apt update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 2: Install Java (Required Before Jenkins)
&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;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;fontconfig openjdk-21-jre
java &lt;span class="nt"&gt;-version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr6g03my1nstrepx57g9n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr6g03my1nstrepx57g9n.png" alt="Omkar Sharma" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On Debian/Ubuntu, it is strongly recommended to install Java &lt;strong&gt;before&lt;/strong&gt; Jenkins. If Jenkins is installed first and Java is added later, the Jenkins service may fail to start with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jenkins: failed to find a valid Java installation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install Jenkins (Long Term Support Release)
&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;sudo &lt;/span&gt;wget &lt;span class="nt"&gt;-O&lt;/span&gt; /etc/apt/keyrings/jenkins-keyring.asc &lt;span class="se"&gt;\&lt;/span&gt;
  https://pkg.jenkins.io/debian-stable/jenkins.io-2026.key

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb [signed-by=/etc/apt/keyrings/jenkins-keyring.asc]"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://pkg.jenkins.io/debian-stable binary/ | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  /etc/apt/sources.list.d/jenkins.list &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null

&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;jenkins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check Jenkins Service Status
&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;sudo &lt;/span&gt;systemctl status jenkins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjofuhezo6ig9rznflkw6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjofuhezo6ig9rznflkw6.png" alt="Omkar Sharma" width="800" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the service is active and running, Jenkins has been installed successfully.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To ensure Jenkins is active and running whenever you reboot or restart your server, check whether the service is enabled:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&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;systemctl is-enabled jenkins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;If the output is &lt;code&gt;enabled&lt;/code&gt;, Jenkins will start automatically on boot.&lt;/li&gt;
&lt;li&gt;If the output is &lt;code&gt;disabled&lt;/code&gt;, run the following command:
&lt;/li&gt;
&lt;/ul&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;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;jenkins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Access Jenkins in Browser
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to the &lt;strong&gt;Public IP&lt;/strong&gt; of your EC2 instance.&lt;/li&gt;
&lt;li&gt;Open your browser and type:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://&amp;lt;public-ip&amp;gt;:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will see the &lt;strong&gt;Getting Started&lt;/strong&gt; page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fya7jcyanp3vki1m7frvl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fya7jcyanp3vki1m7frvl.png" alt="Omkar Sharma" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Unlock Jenkins
&lt;/h3&gt;

&lt;p&gt;You need to enter the initial admin password stored in the following file on your server:&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 cat&lt;/span&gt; /var/lib/jenkins/secrets/initialAdminPassword
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbbxp593cdhncunmxnxo5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbbxp593cdhncunmxnxo5.png" alt="Omkar Sharma" width="800" height="93"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy the password and paste it into the Jenkins setup page.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install Plugins
&lt;/h3&gt;

&lt;p&gt;After unlocking Jenkins, click on:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install suggested plugins&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhuual83b283q458ovuo1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhuual83b283q458ovuo1.png" alt="Omkar Sharma" width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff5v964etsl1xuvio0ibg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff5v964etsl1xuvio0ibg.png" alt="Omkar Sharma" width="800" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpb3bkv60r10td71kja2o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpb3bkv60r10td71kja2o.png" alt="Omkar Sharma" width="800" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fasztirdnbcr3rsnvcuwx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fasztirdnbcr3rsnvcuwx.png" alt="Omkar Sharma" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;&lt;em&gt;Congratulations you have setup the Jenkins&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;
&lt;/blockquote&gt;




&lt;p&gt;✍️ &lt;strong&gt;Author&lt;/strong&gt;: &lt;em&gt;Omkar Sharma&lt;/em&gt;&lt;br&gt;&lt;br&gt;
📬 &lt;em&gt;Feel free to connect on &lt;a href="https://www.linkedin.com/in/omkarsharmaa/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or explore more on &lt;a href="https://github.com/omkarsharma2821" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>jenkins</category>
      <category>cicd</category>
      <category>devops</category>
      <category>aws</category>
    </item>
    <item>
      <title>Docker Compose - Multi Container Setup</title>
      <dc:creator>Omkar Sharma</dc:creator>
      <pubDate>Sat, 14 Feb 2026 07:30:54 +0000</pubDate>
      <link>https://dev.to/omkarsharma2821/docker-compose-multi-containers-setup-1n0o</link>
      <guid>https://dev.to/omkarsharma2821/docker-compose-multi-containers-setup-1n0o</guid>
      <description>&lt;h2&gt;
  
  
  Docker Recap — Environment Replication and Container Management
&lt;/h2&gt;

&lt;p&gt;so now we understand how docker works and how it solves the pain point of environment replication.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Recap
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;you need a VM or any machine where docker is installed — either docker CLI or docker desktop&lt;/li&gt;
&lt;li&gt;once docker is set up, you can start managing the lifecycle of your containers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example Scenario — React Application Containerization
&lt;/h2&gt;

&lt;p&gt;for example, in a company developers are working on a react application and they ask you:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“hey omkar, can you containerize or dockerize this application?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Steps involved:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;create a dockerfile&lt;/li&gt;
&lt;li&gt;set up a call with the developers to understand the application requirements&lt;/li&gt;
&lt;li&gt;choose the base image&lt;/li&gt;
&lt;li&gt;run commands to install all the dependencies required for the application&lt;/li&gt;
&lt;li&gt;copy the source code&lt;/li&gt;
&lt;li&gt;expose the required ports&lt;/li&gt;
&lt;li&gt;define the entrypoint&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 2 — Build and Run the Application
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;create the docker image using:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  docker build -t &amp;lt;image-name&amp;gt; .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;after building the image:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;push it to docker hub&lt;/li&gt;
&lt;li&gt;run the docker container from that image&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Multi-Container Scenario — Docker Compose
&lt;/h2&gt;

&lt;p&gt;now consider another scenario — what if you have an e-commerce application that requires a multi-container setup?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;docker compose is used to manage multi-container applications&lt;/li&gt;
&lt;li&gt;an e-commerce application usually follows a multi-service or microservice architecture&lt;/li&gt;
&lt;li&gt;when working with multiple containers, we need to manage the execution order and dependencies between services&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;a payment or catalog service will not run properly without a database&lt;/li&gt;
&lt;li&gt;docker compose helps define all services in one place&lt;/li&gt;
&lt;li&gt;it manages how containers start and interact with each other&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Docker Recap — Environment Replication and Container Management
&lt;/h2&gt;

&lt;p&gt;so now we understand how docker works and how it solves the pain point of environment replication.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Recap
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;you need a VM or any machine where docker is installed — either docker CLI or docker desktop&lt;/li&gt;
&lt;li&gt;once docker is set up, you can start managing the lifecycle of your containers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example Scenario — React Application Containerization
&lt;/h2&gt;

&lt;p&gt;for example, in a company developers are working on a react application and they ask you:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Hey omkar, can you containerize or dockerize this application?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Steps involved:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;create a dockerfile&lt;/li&gt;
&lt;li&gt;set up a call with the developers to understand the application requirements&lt;/li&gt;
&lt;li&gt;choose the base image&lt;/li&gt;
&lt;li&gt;run commands to install all the dependencies required for the application&lt;/li&gt;
&lt;li&gt;copy the source code&lt;/li&gt;
&lt;li&gt;expose the required ports&lt;/li&gt;
&lt;li&gt;define the entrypoint&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 2 — Build and Run the Application
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;create the docker image using:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  docker build -t &amp;lt;image-name&amp;gt; .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;after building the image:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;push it to docker hub&lt;/li&gt;
&lt;li&gt;run the docker container from that image&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Multi-Container Scenario — Docker Compose
&lt;/h2&gt;

&lt;p&gt;now consider another scenario — what if you have an e-commerce application that requires a multi-container setup?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;docker compose is used to manage multi-container applications&lt;/li&gt;
&lt;li&gt;an e-commerce application usually follows a multi-service or microservice architecture&lt;/li&gt;
&lt;li&gt;when working with multiple containers, we need to manage the execution order and dependencies between services&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;a payment or catalog service will not run properly without a database&lt;/li&gt;
&lt;li&gt;docker compose helps define all services in one place&lt;/li&gt;
&lt;li&gt;it manages how containers start and interact with each other&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;✍️ &lt;strong&gt;Author&lt;/strong&gt;: &lt;em&gt;Omkar Sharma&lt;/em&gt;&lt;br&gt;&lt;br&gt;
📬 &lt;em&gt;Feel free to connect on &lt;a href="https://www.linkedin.com/in/omkarsharmaa/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or explore more on &lt;a href="https://github.com/omkarsharma2821" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>architecture</category>
      <category>microservices</category>
      <category>containers</category>
    </item>
    <item>
      <title>Docker Basics : Problem Statement, Concepts &amp; Commands</title>
      <dc:creator>Omkar Sharma</dc:creator>
      <pubDate>Wed, 11 Feb 2026 06:48:46 +0000</pubDate>
      <link>https://dev.to/omkarsharma2821/docker-basics-problem-statement-concepts-commands-3hij</link>
      <guid>https://dev.to/omkarsharma2821/docker-basics-problem-statement-concepts-commands-3hij</guid>
      <description>&lt;h2&gt;
  
  
  Problem Statement - What Problem Does Docker Solve?
&lt;/h2&gt;

&lt;p&gt;“Same code works on my machine but not on yours.”&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does this happen?
&lt;/h3&gt;

&lt;p&gt;Environment Replication Issues&lt;/p&gt;

&lt;h3&gt;
  
  
  Example Scenario
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You worked on a project for the past 3 months.&lt;/li&gt;
&lt;li&gt;During development, you installed multiple dependencies, libraries, and packages.&lt;/li&gt;
&lt;li&gt;Now you want to onboard another developer.&lt;/li&gt;
&lt;li&gt;You shared the source code and asked them to install dependencies with exact versions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Challenges
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hard to remember specific versions over time.&lt;/li&gt;
&lt;li&gt;New developers may install latest versions instead of required ones.&lt;/li&gt;
&lt;li&gt;Latest versions may introduce breaking changes.&lt;/li&gt;
&lt;li&gt;Suppose you put extra effort to remember the version and dependencies but what if they are using diff OS in that case if Windows CLI you are using will not work in MAC.&lt;/li&gt;
&lt;li&gt;Example:

&lt;ul&gt;
&lt;li&gt;Your project uses Node.js 14.x&lt;/li&gt;
&lt;li&gt;Another developer installs Node.js 18.x&lt;/li&gt;
&lt;li&gt;Result: Application may break or behave differently.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6pjjltawl7yslx55xv9g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6pjjltawl7yslx55xv9g.png" alt="Omkar Sharma" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Docker solves this by standardizing environments so applications run the same everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation of Docker CLI &amp;amp; Docker Desktop
&lt;/h2&gt;

&lt;p&gt;Download Docker Desktop from:&lt;br&gt;
&lt;a href="https://www.docker.com/products/docker-desktop/" rel="noopener noreferrer"&gt;https://www.docker.com/products/docker-desktop/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Docker Desktop includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker CLI&lt;/li&gt;
&lt;li&gt;Docker Engine&lt;/li&gt;
&lt;li&gt;Docker Compose&lt;/li&gt;
&lt;li&gt;GUI Dashboard&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Understanding Images vs Containers
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Docker Images
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Preconfigured read-only templates.&lt;/li&gt;
&lt;li&gt;Include:

&lt;ul&gt;
&lt;li&gt;Base OS (optional)&lt;/li&gt;
&lt;li&gt;Runtime (Node, Python, Java, etc.)&lt;/li&gt;
&lt;li&gt;Dependencies&lt;/li&gt;
&lt;li&gt;Application setup&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Used to create containers.&lt;/li&gt;
&lt;li&gt;Images act as blueprints.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Docker Containers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Running instances of Docker Images.&lt;/li&gt;
&lt;li&gt;Package application and dependencies together.&lt;/li&gt;
&lt;li&gt;Lightweight compared to VMs.&lt;/li&gt;
&lt;li&gt;Share host OS kernel (not a full OS like VMs).&lt;/li&gt;
&lt;li&gt;Containers are running applications created from images.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Running Ubuntu Image in a Container
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -it &amp;lt;image_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Example:&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;-it&lt;/span&gt; ubuntu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the image is not available locally, Docker pulls it from Docker Hub automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Useful Docker Commands
&lt;/h2&gt;

&lt;h3&gt;
  
  
  List Containers
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  List Images
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker image &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enter an Existing Running Container
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &amp;lt;container_name&amp;gt; bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Multiple Containers
&lt;/h2&gt;

&lt;p&gt;Start a 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 start &amp;lt;container_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stop a 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 stop &amp;lt;container_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Concept
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Multiple containers can run from the same image.&lt;/li&gt;
&lt;li&gt;Each container has an isolated environment.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create directory in Container 1&lt;/li&gt;
&lt;li&gt;Create directory in Container 2&lt;/li&gt;
&lt;li&gt;Both remain isolated from each other.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fah4l367gs3rguk8o8ied.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fah4l367gs3rguk8o8ied.png" alt="Omkar Sharma" width="800" height="665"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Port Mapping
&lt;/h2&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;-it&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &amp;lt;local_machine_port&amp;gt;:&amp;lt;container_port&amp;gt; &amp;lt;image_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example:&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;-it&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 omkarsharma2821/omkar-node-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ffcymh6eiist6qzpups.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ffcymh6eiist6qzpups.png" alt="Omkar Sharma" width="800" height="91"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxzvxa6s6tyuyganw0ehl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxzvxa6s6tyuyganw0ehl.png" alt="Omkar Sharma" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Allows access to container services from local machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Environment Variables
&lt;/h2&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;-it&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4000 &lt;span class="nt"&gt;-p&lt;/span&gt; 4000:4000 &amp;lt;image_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Used to configure applications dynamically inside containers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dockerization of a Node.js Application
&lt;/h2&gt;

&lt;p&gt;Initialize Node Project:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Install Express:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;express
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Build Docker 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; omkar-node-app &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;As if now the img is avaialbel locally to push to hub.docker.com you need to run the following coommands&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Login first&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker login

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tag your image with latest&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker tag &amp;lt;local_image_name&amp;gt;:latest &amp;lt;dockerhub_username&amp;gt;/&amp;lt;repo_name&amp;gt;:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker tag omkar-nodejs:latest omkarsharma2821/omkar-node-app:latest

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Push to docker hub&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker push &amp;lt;dockerhub_username&amp;gt;/&amp;lt;repo_name&amp;gt;:latest

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker push omkarsharma2821/omkar-node-app:latest

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Docker ensures consistent environments across machines.&lt;/li&gt;
&lt;li&gt;Images are templates.&lt;/li&gt;
&lt;li&gt;Containers are running instances.&lt;/li&gt;
&lt;li&gt;Supports isolated environments, easy onboarding, and scalable deployments.&lt;/li&gt;
&lt;li&gt;Essential for modern development workflows and microservices architecture.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;✍️ &lt;strong&gt;Author&lt;/strong&gt;: &lt;em&gt;Omkar Sharma&lt;/em&gt;&lt;br&gt;&lt;br&gt;
📬 &lt;em&gt;Feel free to connect on &lt;a href="https://www.linkedin.com/in/omkarsharmaa/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or explore more on &lt;a href="https://github.com/omkarsharma2821" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>container</category>
      <category>kubernetes</category>
      <category>containers</category>
    </item>
    <item>
      <title>GIT: Version Control System-Complete Guide</title>
      <dc:creator>Omkar Sharma</dc:creator>
      <pubDate>Sun, 25 Jan 2026 11:46:12 +0000</pubDate>
      <link>https://dev.to/omkarsharma2821/git-version-control-system-complete-guide-50on</link>
      <guid>https://dev.to/omkarsharma2821/git-version-control-system-complete-guide-50on</guid>
      <description>&lt;h2&gt;
  
  
  1. What is a Version Control System (VCS)?
&lt;/h2&gt;

&lt;p&gt;Version control, also known as source control, is a system that helps track and manage changes made to software code over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is it required?
&lt;/h3&gt;

&lt;p&gt;As a project grows, code is continuously updated—new features are added, bugs are fixed, and existing logic is modified. In such cases, it becomes difficult to answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who made a specific change?&lt;/li&gt;
&lt;li&gt;When was the change made?&lt;/li&gt;
&lt;li&gt;Why was the change introduced?&lt;/li&gt;
&lt;li&gt;How can we revert to an older stable version?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fby0tqcg9p3za9b7hfzkj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fby0tqcg9p3za9b7hfzkj.png" alt="Omkar Sharma" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A Version Control System solves this by maintaining a complete timeline (history) of code changes, making collaboration, tracking, and rollback easy and reliable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Famous VCS Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Git&lt;/strong&gt; (Most popular)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Apache Subversion (SVN)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Piper&lt;/strong&gt; (Used internally by Google)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Introduction to Git VCS
&lt;/h2&gt;

&lt;p&gt;Download Git from the official website:&lt;br&gt;&lt;br&gt;
&lt;a href="https://git-scm.com/install/" rel="noopener noreferrer"&gt;https://git-scm.com/install/&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Verify Installation
&lt;/h3&gt;


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

&lt;/div&gt;


&lt;p&gt;If Git is installed correctly, it will display the installed version.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbg3lkhueq4cvx0jwc3eq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbg3lkhueq4cvx0jwc3eq.png" alt="Omkar Sharma" width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  What is Git?
&lt;/h3&gt;

&lt;p&gt;Git is a &lt;strong&gt;distributed version control system&lt;/strong&gt; that allows multiple developers to work on the same project simultaneously while keeping track of all changes.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why Git Configuration is Required?
&lt;/h3&gt;

&lt;p&gt;In an organization, multiple developers work on the same codebase. Git uses global configuration (username and email) to identify &lt;strong&gt;who made which changes&lt;/strong&gt; in the commit history.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1mr5gb4euz0fozco6d9h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1mr5gb4euz0fozco6d9h.png" alt="Omkar Sharma" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Setting Up Git Global Configuration
&lt;/h3&gt;

&lt;p&gt;First let's create a folder where we keep our source code and config the user name and email to it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foonf06y7g0t9rpbzvuic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foonf06y7g0t9rpbzvuic.png" alt="Omkar Sharma" width="800" height="324"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.name &lt;span class="s2"&gt;"Your Name"&lt;/span&gt;
git config &lt;span class="nt"&gt;--global&lt;/span&gt; user.email &lt;span class="s2"&gt;"your@email.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgf6zxz862lnlfatpx02d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgf6zxz862lnlfatpx02d.png" alt="Omkar Sharma" width="800" height="312"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Version Controlling with Git
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Initializing a Git Project
&lt;/h3&gt;

&lt;p&gt;By default, a folder is &lt;strong&gt;not Git-enabled&lt;/strong&gt;, and Git does not track it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwexz5dn31e0oo2qxlml.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwwexz5dn31e0oo2qxlml.png" alt="Omkar Sharma" width="800" height="275"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj0vu0bevrzcddr0g2b3k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj0vu0bevrzcddr0g2b3k.png" alt="Omkar Sharma" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To enable Git tracking:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;This initializes a Git repository in the folder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhwncf6nc222qpksm8ci4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhwncf6nc222qpksm8ci4.png" alt="Omkar Sharma" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ksimaxnqmoj0qb6blyj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ksimaxnqmoj0qb6blyj.png" alt="Omkar Sharma" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tracking Files
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;After initialization, files are still &lt;strong&gt;untracked&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You must explicitly add files to Git
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add index.js
git add &amp;lt;File Path Name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw9qghno02qtz0di9u744.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw9qghno02qtz0di9u744.png" alt="Omkar Sharma" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1mxssb34w2bk7eketw7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1mxssb34w2bk7eketw7.png" alt="Omkar Sharma" width="800" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once added, Git starts tracking changes to the file.&lt;/p&gt;

&lt;h3&gt;
  
  
  Viewing Changes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git diff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shows differences between the working directory and the staging area.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11dcy4f03c5i0wsy9jb7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11dcy4f03c5i0wsy9jb7.png" alt="Omkar Sharma" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Add Multiple Files
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adds all modified and untracked files at once.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;By default, Git does not track any folder or file on your local machine unless you initialize it and add files manually.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Removing Files from VCS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git &lt;span class="nb"&gt;rm&lt;/span&gt; &amp;lt;FILE_PATH&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Introduction to Commits
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is a Commit?
&lt;/h3&gt;

&lt;p&gt;A commit is a snapshot of the staged changes at a specific point in time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Committing Files
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"commit message"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvu3dkey5r89wzk3p6rt8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvu3dkey5r89wzk3p6rt8.png" alt="Omkar Sharma" width="800" height="634"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyw36a4itbigdk4eca0a4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyw36a4itbigdk4eca0a4.png" alt="Omkar Sharma" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Staging Area
&lt;/h3&gt;

&lt;p&gt;The staging area is an intermediate step where files are prepared before committing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvf75cste8ao7keehe8pk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvf75cste8ao7keehe8pk.png" alt="Omkar Sharma" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Viewing Commit History
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git log
git log &lt;span class="nt"&gt;--oneline&lt;/span&gt;
git diff &amp;lt;to see the changes &lt;span class="k"&gt;in &lt;/span&gt;code file&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F50est3wieqcb0kxokpxh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F50est3wieqcb0kxokpxh.png" alt="Omkar Sharma" width="800" height="394"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git show &amp;lt;commit &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; to see the changes made &lt;span class="k"&gt;in &lt;/span&gt;particular commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fat538nbz8ui4ojr1e41c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fat538nbz8ui4ojr1e41c.png" alt="Omkar Sharma" width="800" height="313"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git blame &amp;lt;File Name&amp;gt; to see the changes made &lt;span class="k"&gt;in &lt;/span&gt;particular file by whom
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn7k1wtbd94i5ay89tts9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn7k1wtbd94i5ay89tts9.png" alt="Omkar Sharma" width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Reverting Back
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git reset &lt;span class="nt"&gt;--hard&lt;/span&gt; &amp;lt;commit &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

here we are moving our &lt;span class="nb"&gt;head &lt;/span&gt;so we will loose the below commits
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5kdcp0gt4k64gcadt5ps.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5kdcp0gt4k64gcadt5ps.jpeg" alt="Omkar Sharma" width="687" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;whenever we are saying VCS we should have something when we do any thing wrong we can revert back.....so Git allows reverting commits to return to a previous stable state when required.&lt;/p&gt;

&lt;p&gt;In this feature we use the concept of Linked List head points to the latest commit.....so we just point our head where we want to revert.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3po86xpr8h1ceb89hb5r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3po86xpr8h1ceb89hb5r.png" alt="Omkar Sharma" width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbs8vnwc3m6iefswc9kg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbs8vnwc3m6iefswc9kg.png" alt="Omkar Sharma" width="800" height="385"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git revert &amp;lt;commit &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fepd2ajdmg8miznlzpv1y.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fepd2ajdmg8miznlzpv1y.jpeg" alt="Omkar Sharma" width="747" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcpcpciarw6cmg35ihzav.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcpcpciarw6cmg35ihzav.png" alt="Omkar Sharma" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fef8qyry76w8j18d3nbij.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fef8qyry76w8j18d3nbij.png" alt="Omkar Sharma" width="800" height="801"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;✍️ &lt;strong&gt;Author&lt;/strong&gt;: &lt;em&gt;Omkar Sharma&lt;/em&gt;&lt;br&gt;&lt;br&gt;
📬 &lt;em&gt;Feel free to connect on &lt;a href="https://www.linkedin.com/in/omkarsharmaa/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or explore more on &lt;a href="https://github.com/omkarsharma2821" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>A Clear Introduction to DevOps and Its Importance</title>
      <dc:creator>Omkar Sharma</dc:creator>
      <pubDate>Wed, 14 Jan 2026 18:23:40 +0000</pubDate>
      <link>https://dev.to/omkarsharma2821/a-clear-introduction-to-devops-and-its-importance-14n1</link>
      <guid>https://dev.to/omkarsharma2821/a-clear-introduction-to-devops-and-its-importance-14n1</guid>
      <description>&lt;h1&gt;
  
  
  What is DevOps?
&lt;/h1&gt;

&lt;p&gt;DevOps is a culture and set of practices that improve an organization’s ability to deliver projects and applications efficiently.&lt;br&gt;&lt;br&gt;
DevOps is not only about CI/CD .... it involves many other vital aspects of a project, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improving delivery
&lt;/li&gt;
&lt;li&gt;Automation
&lt;/li&gt;
&lt;li&gt;Enhancing Quality
&lt;/li&gt;
&lt;li&gt;Monitoring (Observability)
&lt;/li&gt;
&lt;li&gt;Continuous Testing
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PS:&lt;/strong&gt; DevOps is the process of improving application delivery by automating tasks, increasing quality, and ensuring continuous monitoring and continuous testing.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why DevOps?
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh0h4edquanlt61d6es4y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh0h4edquanlt61d6es4y.png" alt="Omkar Sharma" width="796" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As shown in the diagram earlier, all these activities were traditionally manual. Multiple teams worked in silos, and it often took many days to release a project or application. DevOps streamlines and accelerates this entire process.&lt;/p&gt;

&lt;h1&gt;
  
  
  How to Introduce Yourself in DevOps
&lt;/h1&gt;

&lt;p&gt;“Hi, I am working as a DevOps Engineer with &lt;em&gt;X&lt;/em&gt; years of experience. In my previous company, I worked on improving application delivery, enhancing quality, and implementing observability and monitoring practices.”&lt;/p&gt;




&lt;p&gt;✍️ &lt;strong&gt;Author&lt;/strong&gt;: &lt;em&gt;Omkar Sharma&lt;/em&gt;&lt;br&gt;&lt;br&gt;
📬 &lt;em&gt;Feel free to connect on &lt;a href="https://www.linkedin.com/in/omkarsharmaa/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or explore more on &lt;a href="https://github.com/omkarsharma2821" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/em&gt; &lt;/p&gt;

</description>
      <category>devops</category>
      <category>aws</category>
      <category>azure</category>
      <category>cloud</category>
    </item>
    <item>
      <title>AWS Lambda: The Serverless Engine Powering Cloud Automation</title>
      <dc:creator>Omkar Sharma</dc:creator>
      <pubDate>Mon, 12 Jan 2026 16:56:12 +0000</pubDate>
      <link>https://dev.to/omkarsharma2821/aws-lambda-the-serverless-engine-powering-cloud-automation-2fdg</link>
      <guid>https://dev.to/omkarsharma2821/aws-lambda-the-serverless-engine-powering-cloud-automation-2fdg</guid>
      <description>&lt;p&gt;AWS Lambda is one of the most powerful and popular services in the AWS ecosystem. It allows you to run application logic &lt;strong&gt;without managing servers&lt;/strong&gt;, making it ideal for automation, event-driven workflows, and lightweight backend tasks. With Lambda, you simply upload your code and define a trigger—AWS handles provisioning, scaling, and execution automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is AWS Lambda?
&lt;/h2&gt;

&lt;p&gt;AWS Lambda is a &lt;strong&gt;serverless compute service&lt;/strong&gt; that executes your code in response to events. It supports languages like Python, Node.js, Java, Go, and more. There is no need to create or manage EC2 servers. Instead, Lambda runs your function in a fully managed environment, scales instantly, and charges you only for the compute time consumed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Characteristics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No servers to configure or maintain
&lt;/li&gt;
&lt;li&gt;Automatic scaling from 0 to thousands of requests
&lt;/li&gt;
&lt;li&gt;Pay-per-use billing model
&lt;/li&gt;
&lt;li&gt;Deep integration with AWS services
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg447m05hpbvo9k7flp5w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg447m05hpbvo9k7flp5w.png" alt="omkar sharma" width="767" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Is AWS Lambda So Popular?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Completely Serverless
&lt;/h3&gt;

&lt;p&gt;You don’t need to provision, patch, or maintain any infrastructure. Lambda removes the operational burden from developers and cloud teams.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Automatic, Instant Scaling
&lt;/h3&gt;

&lt;p&gt;Lambda scales based on event load. Whether 1 or 1,000 requests, it adjusts automatically without any configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Highly Cost-Effective
&lt;/h3&gt;

&lt;p&gt;Since Lambda charges only when your function executes, there's no cost for idle time. This makes it ideal for workloads with unpredictable volume.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Event-Driven Architecture
&lt;/h3&gt;

&lt;p&gt;Lambda works natively with services like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;S3
&lt;/li&gt;
&lt;li&gt;DynamoDB
&lt;/li&gt;
&lt;li&gt;CloudWatch
&lt;/li&gt;
&lt;li&gt;EventBridge
&lt;/li&gt;
&lt;li&gt;SNS / SQS
&lt;/li&gt;
&lt;li&gt;API Gateway
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes it perfect for automation, integrations, and reactive systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Multi-Language Support
&lt;/h3&gt;

&lt;p&gt;Lambda supports Python, Node.js, Java, Go, .NET, Ruby, and custom runtimes—giving teams flexibility to choose the best language.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faeu2zvp9xjdo1ph0jy1t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faeu2zvp9xjdo1ph0jy1t.png" alt="omkar sharma" width="600" height="758"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Problem Does AWS Lambda Solve?
&lt;/h2&gt;

&lt;p&gt;Traditionally, even small tasks required running dedicated servers—leading to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Costly idle infrastructure
&lt;/li&gt;
&lt;li&gt;Manual scaling
&lt;/li&gt;
&lt;li&gt;OS patching and maintenance
&lt;/li&gt;
&lt;li&gt;Complex automation scripts
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lambda solves this by offering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Serverless compute on demand
&lt;/li&gt;
&lt;li&gt;Automatic resource management
&lt;/li&gt;
&lt;li&gt;Event-based execution
&lt;/li&gt;
&lt;li&gt;Reduced operational workload
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It empowers developers to focus purely on logic instead of infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Real-World Use Cases of AWS Lambda
&lt;/h2&gt;

&lt;p&gt;Below are three practical AWS Lambda use cases (without code), based on your requirement:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Automatically Delete Historical Snapshots
&lt;/h2&gt;

&lt;p&gt;Organizations create regular EBS snapshots but often forget to delete old ones, increasing storage cost over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Lambda Helps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A scheduled EventBridge rule triggers your Lambda daily.&lt;/li&gt;
&lt;li&gt;Lambda fetches all EBS snapshots.&lt;/li&gt;
&lt;li&gt;It identifies snapshots older than a set retention period.&lt;/li&gt;
&lt;li&gt;It deletes those snapshots automatically.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Saves storage cost
&lt;/li&gt;
&lt;li&gt;Ensures retention compliance
&lt;/li&gt;
&lt;li&gt;Eliminates manual cleanup
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import boto3

ec2 = boto3.client('ec2')

def lambda_handler(event, context):
    # Describe all snapshots owned by you
    snapshots = ec2.describe_snapshots(OwnerIds=['self'])['Snapshots']

    for snap in snapshots:
        snap_id = snap['SnapshotId']
        print(f"Deleting Snapshot: {snap_id}")
        try:
            ec2.delete_snapshot(SnapshotId=snap_id)
        except Exception as e:
            print(f"Error deleting {snap_id}: {e}")

    return {
        "status": "Completed",
        "deleted_snapshots": len(snapshots)
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Delete Unused (Available) EBS Volumes
&lt;/h2&gt;

&lt;p&gt;After EC2 instances are terminated, their EBS volumes often remain in the "available" state and keep incurring cost.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Lambda Helps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A scheduled Lambda function lists all EBS volumes.&lt;/li&gt;
&lt;li&gt;It identifies volumes in &lt;code&gt;"available"&lt;/code&gt; state.&lt;/li&gt;
&lt;li&gt;Lambda deletes these unused volumes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Reduces wasted storage cost
&lt;/li&gt;
&lt;li&gt;Improves cloud hygiene
&lt;/li&gt;
&lt;li&gt;Automates cleanup without manual checks
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import boto3

ec2 = boto3.client('ec2')

def lambda_handler(event, context):
    # Find volumes that are 'available' (i.e., NOT attached)
    volumes = ec2.describe_volumes(
        Filters=[{'Name': 'status', 'Values': ['available']}]
    )['Volumes']

    for vol in volumes:
        vol_id = vol['VolumeId']
        print(f"Deleting Unattached Volume: {vol_id}")
        try:
            ec2.delete_volume(VolumeId=vol_id)
        except Exception as e:
            print(f"Error deleting {vol_id}: {e}")

    return {
        "status": "Completed",
        "deleted_volumes": len(volumes)
    }

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Start EC2 Instances That Are in Stopped State
&lt;/h2&gt;

&lt;p&gt;Some environments require EC2 instances to automatically start during working hours or operational windows and often during patching time.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Lambda Helps
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A scheduled trigger (e.g., daily at 9 AM) runs the Lambda function.&lt;/li&gt;
&lt;li&gt;Lambda checks for EC2 instances in &lt;code&gt;"stopped"&lt;/code&gt; state.&lt;/li&gt;
&lt;li&gt;It starts them automatically based on tag filters or instance IDs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ensures required servers start on time
&lt;/li&gt;
&lt;li&gt;Reduces manual effort
&lt;/li&gt;
&lt;li&gt;Supports DevOps automation
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import boto3

ec2 = boto3.client('ec2')

def lambda_handler(event, context):
    # Find all instances that are stopped
    response = ec2.describe_instances(
        Filters=[
            {'Name': 'instance-state-name', 'Values': ['stopped']}
        ]
    )

    stopped_instances = []

    for reservation in response['Reservations']:
        for instance in reservation['Instances']:
            stopped_instances.append(instance['InstanceId'])

    if stopped_instances:
        print(f"Starting instances: {stopped_instances}")
        ec2.start_instances(InstanceIds=stopped_instances)
    else:
        print("No stopped instances found")

    return {
        "action": "start_instances",
        "instances": stopped_instances
    }

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;✍️ &lt;strong&gt;Author&lt;/strong&gt;: &lt;em&gt;Omkar Sharma&lt;/em&gt;&lt;br&gt;&lt;br&gt;
📬 &lt;em&gt;Feel free to connect on &lt;a href="https://www.linkedin.com/in/omkarsharmaa/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or explore more on &lt;a href="https://github.com/omkarsharma2821" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/em&gt; &lt;/p&gt;

</description>
      <category>automation</category>
      <category>aws</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Cloud Computing – Complete Overview</title>
      <dc:creator>Omkar Sharma</dc:creator>
      <pubDate>Sat, 20 Dec 2025 08:09:19 +0000</pubDate>
      <link>https://dev.to/omkarsharma2821/cloud-computing-complete-overview-2o35</link>
      <guid>https://dev.to/omkarsharma2821/cloud-computing-complete-overview-2o35</guid>
      <description>&lt;h2&gt;
  
  
  What Is Cloud Computing?
&lt;/h2&gt;

&lt;p&gt;Cloud computing is the practice of renting computing resources such as servers, storage, networking, databases, and software from a third-party provider over the internet. Instead of owning and maintaining physical hardware, users access these resources on demand and pay only for what they use.&lt;/p&gt;

&lt;p&gt;In simple terms, cloud computing allows you to store data and run applications on remote servers hosted over the internet rather than on local machines or on-premises infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffp6tktgilx2l24wlq82v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffp6tktgilx2l24wlq82v.png" alt="Omkar Sharma" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features of Cloud Computing
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jxgl7ochwp6o00l15lz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jxgl7ochwp6o00l15lz.png" alt="Omkar Sharma" width="800" height="822"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ability to allocate and deallocate resources based on demand.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Elasticity&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Automatic scaling of resources up or down as workload changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;High Availability&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ensures minimal downtime by distributing services across multiple systems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Agility&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Rapid provisioning of resources to respond quickly to business needs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fault Tolerance&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Capability of systems to continue operating even when components fail.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Disaster Recovery&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ability to recover data and applications after unexpected events.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consumption-Based Model (Pay-as-You-Go)&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Users pay only for the resources they consume.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cloud Service Models
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1hitz6c7p1ocaezjyd05.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1hitz6c7p1ocaezjyd05.png" alt="Cloud Service Model by Omkar Sharma" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Infrastructure as a Service (IaaS)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Most responsibility lies with the &lt;strong&gt;consumer&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The provider manages networking, storage, servers, and virtualization.&lt;/li&gt;
&lt;li&gt;Common use cases:

&lt;ul&gt;
&lt;li&gt;Test and development&lt;/li&gt;
&lt;li&gt;Lift-and-shift migration&lt;/li&gt;
&lt;li&gt;Virtual machines&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Examples:

&lt;ul&gt;
&lt;li&gt;Azure Virtual Machines&lt;/li&gt;
&lt;li&gt;AWS EC2&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Platform as a Service (PaaS)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Responsibilities are &lt;strong&gt;shared&lt;/strong&gt; between provider and consumer.&lt;/li&gt;
&lt;li&gt;The provider manages OS, runtime, middleware, and infrastructure.&lt;/li&gt;
&lt;li&gt;The consumer focuses on application code and data.&lt;/li&gt;
&lt;li&gt;Use cases:

&lt;ul&gt;
&lt;li&gt;Application development frameworks&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Example:

&lt;ul&gt;
&lt;li&gt;Heroku&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Software as a Service (SaaS)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Most responsibility lies with the &lt;strong&gt;provider&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Users access applications directly over the internet.&lt;/li&gt;
&lt;li&gt;Examples:

&lt;ul&gt;
&lt;li&gt;Gmail&lt;/li&gt;
&lt;li&gt;Outlook&lt;/li&gt;
&lt;li&gt;OneDrive&lt;/li&gt;
&lt;li&gt;Microsoft 365&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Shared Responsibility Model
&lt;/h2&gt;

&lt;p&gt;The shared responsibility model defines how security and management responsibilities are divided between the cloud provider and the customer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The cloud provider is responsible for securing the &lt;strong&gt;cloud infrastructure&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The customer is responsible for securing &lt;strong&gt;data, access, and configurations&lt;/strong&gt;, depending on the service model.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cloud Deployment Models
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjpv87rlbgbdvbmp09z4v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjpv87rlbgbdvbmp09z4v.png" alt="Omkar Sharma" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Private Cloud
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Offers greater control and security.&lt;/li&gt;
&lt;li&gt;Higher cost and requires skilled technical teams.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Public Cloud
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fully owned and managed by the cloud provider.&lt;/li&gt;
&lt;li&gt;No large initial investment.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Hybrid Cloud
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Combination of private and public clouds.&lt;/li&gt;
&lt;li&gt;Sensitive workloads remain in private clouds while leveraging public cloud flexibility.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Multi-Cloud
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Uses multiple cloud providers.&lt;/li&gt;
&lt;li&gt;Leverages different services and features from different clouds.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  API (Application Programming Interface)
&lt;/h2&gt;

&lt;p&gt;An API is a set of rules that allows software applications to communicate with each other.&lt;/p&gt;

&lt;p&gt;In cloud computing, APIs provide a programmatic way to interact with cloud services such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compute&lt;/li&gt;
&lt;li&gt;Storage&lt;/li&gt;
&lt;li&gt;Databases&lt;/li&gt;
&lt;li&gt;Artificial Intelligence services&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Scaling in Cloud Computing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Vertical Scaling
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Increasing or decreasing the capacity of a resource.&lt;/li&gt;
&lt;li&gt;Example: Adding more CPU or RAM to a virtual machine.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Horizontal Scaling
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Adding or removing multiple instances of resources.&lt;/li&gt;
&lt;li&gt;Commonly used in high-traffic applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Virtualization
&lt;/h2&gt;

&lt;p&gt;Virtualization is the process of creating virtual versions of physical resources such as servers, operating systems, storage, and networks.&lt;/p&gt;

&lt;p&gt;Key points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enables running multiple operating systems on a single physical machine.&lt;/li&gt;
&lt;li&gt;Improves resource utilization by logically dividing servers.&lt;/li&gt;
&lt;li&gt;Allows OSs like Windows and Linux to run on the same hardware.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hypervisor
&lt;/h2&gt;

&lt;p&gt;A hypervisor enables virtualization by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simulating complete machines with their own operating systems.&lt;/li&gt;
&lt;li&gt;Isolating multiple virtual machines on a single physical host.&lt;/li&gt;
&lt;li&gt;Allowing multiple OSs to run independently on the same hardware.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Containerization
&lt;/h2&gt;

&lt;p&gt;Containerization is a lightweight alternative to virtualization and is best suited for microservices architectures.&lt;/p&gt;

&lt;p&gt;Key characteristics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Containers package applications with all required dependencies.&lt;/li&gt;
&lt;li&gt;They share the host OS kernel.&lt;/li&gt;
&lt;li&gt;No separate OS is required for each container.&lt;/li&gt;
&lt;li&gt;Solves the “works on my machine” problem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Containers are ideal for scenarios such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full-stack applications with high backend load&lt;/li&gt;
&lt;li&gt;Microservices-based architectures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: Containers cannot run a completely different operating system since they rely on the host OS kernel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Datacenters, Regions, and Availability Zones
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Datacenter
&lt;/h3&gt;

&lt;p&gt;A physical facility that houses servers, storage, and networking equipment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Region
&lt;/h3&gt;

&lt;p&gt;A geographical area containing multiple datacenters to ensure resiliency and reliability for business-critical workloads.&lt;/p&gt;

&lt;h3&gt;
  
  
  Availability Zones (Azure)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Physically separate datacenters within a region.&lt;/li&gt;
&lt;li&gt;Azure regions contain a minimum of three availability zones.&lt;/li&gt;
&lt;li&gt;If one zone fails, the others continue operating.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Azure-Specific Concepts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Management Groups
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Used to organize subscriptions.&lt;/li&gt;
&lt;li&gt;Apply policies, permissions, and restrictions at scale.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Azure Virtual Machines
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Provide Infrastructure as a Service (IaaS).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  VM Scale Sets
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Centrally manage and scale large numbers of identical virtual machines.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Availability Sets
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Improve application uptime by distributing VMs across fault and update domains.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Virtual Machines vs Containers
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb5w0esojhad9ea0o03iq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb5w0esojhad9ea0o03iq.png" alt="Omkar Sharma" width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Virtual Machines
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Reduce cost compared to physical hardware.&lt;/li&gt;
&lt;li&gt;Each VM runs a single operating system.&lt;/li&gt;
&lt;li&gt;Heavier than containers due to OS overhead.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Containers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Lightweight and fast.&lt;/li&gt;
&lt;li&gt;Allow multiple application instances on a single host.&lt;/li&gt;
&lt;li&gt;Package all application dependencies.&lt;/li&gt;
&lt;li&gt;Remove OS-level dependency issues.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Cloud computing enables organizations to build, deploy, and scale applications efficiently by providing computing resources as services. It offers scalability, flexibility, high availability, and cost efficiency while eliminating the need for heavy upfront infrastructure investments.&lt;/p&gt;




&lt;p&gt;✍️ &lt;strong&gt;Author&lt;/strong&gt;: &lt;em&gt;Omkar Sharma&lt;/em&gt;&lt;br&gt;&lt;br&gt;
📬 &lt;em&gt;Feel free to connect on &lt;a href="https://www.linkedin.com/in/omkarsharmaa/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; or explore more on &lt;a href="https://github.com/omkarsharma2821" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/em&gt; &lt;/p&gt;

</description>
      <category>aws</category>
      <category>azure</category>
      <category>cloud</category>
      <category>cloudskills</category>
    </item>
  </channel>
</rss>
