<?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: Rahimah Sulayman</title>
    <description>The latest articles on DEV Community by Rahimah Sulayman (@rahimah_dev).</description>
    <link>https://dev.to/rahimah_dev</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%2F3673037%2Fd084c1b1-6c80-43de-8b42-c48bd0cad2f8.png</url>
      <title>DEV Community: Rahimah Sulayman</title>
      <link>https://dev.to/rahimah_dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rahimah_dev"/>
    <language>en</language>
    <item>
      <title>Azure Container Apps Guided Project (AZ-2026), Part 5: Traffic Splitting and Revision Management</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Sat, 03 Oct 2026 17:41:46 +0000</pubDate>
      <link>https://dev.to/rahimah_dev/azure-container-apps-guided-project-az-2026-part-5-traffic-splitting-and-revision-management-25dl</link>
      <guid>https://dev.to/rahimah_dev/azure-container-apps-guided-project-az-2026-part-5-traffic-splitting-and-revision-management-25dl</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Employers value engineers who can release changes safely, without putting every user at risk.&lt;/p&gt;

&lt;p&gt;The scenario: At Fabrikam Inc., the container app is deployed and the pipeline works. Now the team wants to ship a new version without sending all traffic to it at once. They need a v2 revision that receives 25 percent of requests while the existing version keeps the other 75 percent, with clear labels so each version can be tested directly.&lt;/p&gt;

&lt;p&gt;In this final Part 5, I switch the container app to multiple revision mode, create the v2 revision, label the revisions "current" and "updated", and split traffic 75/25. I then verify the setup on the Revisions and replicas page.&lt;/p&gt;

&lt;p&gt;Note: Here, I left the current version as Label-1, I didn't rename it.&lt;/p&gt;

&lt;p&gt;The following Azure resources must be available in your Resource group named RG1:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Container registry instance that contains one image.&lt;/li&gt;
&lt;li&gt;A Virtual network with subnets.&lt;/li&gt;
&lt;li&gt;A Service Bus Namespace&lt;/li&gt;
&lt;li&gt;A Managed Identity&lt;/li&gt;
&lt;li&gt;A Private endpoint&lt;/li&gt;
&lt;li&gt;A Container App&lt;/li&gt;
&lt;li&gt;A Container Apps Environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You've been asked to configure traffic splitting for your Container Apps to meet the following requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need to create a new revision of the container app that uses a suffix of v2.&lt;/li&gt;
&lt;li&gt;You must ensure that 25 percent of requests to your app are directed to the v2 revision.&lt;/li&gt;
&lt;li&gt;You must label the revisions "current" and "updated" and ensure that requests to the "updated" revision are directed to the v2 revision.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You complete the following tasks during this exercise:&lt;/p&gt;

&lt;p&gt;1.Set revision management to multiple.&lt;/p&gt;

&lt;p&gt;2.Create a new revision with a v2 suffix.&lt;/p&gt;

&lt;p&gt;3.Configure labels on the revisions.&lt;/p&gt;

&lt;p&gt;4.Configure a traffic percentage on the revisions.&lt;/p&gt;

&lt;p&gt;5.Verify the configuration.&lt;/p&gt;

&lt;p&gt;Note: I used port 4050 in place of 5000 because my port 5000 was occupied.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set revision management to multiple
&lt;/h2&gt;

&lt;p&gt;1.In the Azure portal, open your container app resource.&lt;/p&gt;

&lt;p&gt;2.On the left side menu, under Application, select &lt;strong&gt;Revisions and replicas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;3.At the top of the Revisions and replicas page, select &lt;strong&gt;Deployment mode&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhzz58r6438m78yun260e.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%2Fhzz58r6438m78yun260e.png" alt="deployment" width="799" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.To switch from single to multi-revision mode, select &lt;strong&gt;Apply&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgc27wpi8kxqaoho8q050.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%2Fgc27wpi8kxqaoho8q050.png" alt="apply" width="800" height="348"&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%2Fkce3xu2kyyj0ug6wfw0o.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%2Fkce3xu2kyyj0ug6wfw0o.png" alt="select ingress" width="800" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.On the Ingress page, specify the following information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ingress traffic: select &lt;strong&gt;Accepting traffic from anywhere&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ingress type: select &lt;strong&gt;HTTP&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Client certificate mode: ensure that &lt;strong&gt;Ignore&lt;/strong&gt; is selected.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transport: ensure that &lt;strong&gt;Auto&lt;/strong&gt; is selected.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Insecure connections: ensure that Allowed is &lt;strong&gt;NOT&lt;/strong&gt; checked.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Target port: enter &lt;strong&gt;5000&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IP Security Restrictions Mode: ensure that &lt;strong&gt;Allow all traffic&lt;/strong&gt; is selected.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;6.At the bottom of the Ingress page, select &lt;strong&gt;Save&lt;/strong&gt;, and then wait for the update to complete.&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%2F57q08m5bjnssvcxia569.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%2F57q08m5bjnssvcxia569.png" alt="ingress" width="799" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Deployment Mode will be set to &lt;strong&gt;Multiple&lt;/strong&gt; after the update. &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%2Fqrdg0hnvhmpybaywih08.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%2Fqrdg0hnvhmpybaywih08.png" alt="multiple" width="800" height="660"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.On the left-side menu, under Revisions, select &lt;strong&gt;Revisions and replicas&lt;/strong&gt;.&lt;br&gt;
    Select &lt;strong&gt;create new revision&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3nd5uyo53wtlir4q0bxm.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%2F3nd5uyo53wtlir4q0bxm.png" alt="newrevision" width="799" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure a traffic percentage and labels on the revisions
&lt;/h2&gt;

&lt;p&gt;1.Ensure that you have the Revisions and replicas page open.&lt;/p&gt;

&lt;p&gt;2.For the v2 revision, under Traffic, enter &lt;strong&gt;25&lt;/strong&gt; as the percentage.&lt;/p&gt;

&lt;p&gt;3.For the other revision, under Traffic, enter &lt;strong&gt;75&lt;/strong&gt; as the percentage.&lt;/p&gt;

&lt;p&gt;6.For the v2 revision, under Label, enter &lt;strong&gt;updated&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;7.For the other revision, enter &lt;strong&gt;current&lt;/strong&gt; or leave as-is.&lt;/p&gt;

&lt;p&gt;8.At the top of the page, select &lt;strong&gt;Save&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsg0dc5gkfe4u8pqxhdd2.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%2Fsg0dc5gkfe4u8pqxhdd2.png" alt="traffic splitting" width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Check your work
&lt;/h2&gt;

&lt;p&gt;1.Ensure that you have your Container App open in the Azure portal.&lt;/p&gt;

&lt;p&gt;2.On the left-side menu, under Application, select &lt;strong&gt;Revisions and replicas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;3.Verify that your revisions are configured as follows:&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%2F1e7upttf8jerj4e7cfyk.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%2F1e7upttf8jerj4e7cfyk.png" alt="revisions" width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Cloud and DevOps practitioner who completed a five-part, hands-on series on deploying containerized applications with Azure Container Apps.&lt;/p&gt;

&lt;p&gt;Part 5 covers safe release management with revisions and traffic splitting:&lt;/p&gt;

&lt;p&gt;Switched the container app from single to multiple revision mode&lt;br&gt;
Created a new v2 revision of the container app&lt;br&gt;
Configured HTTP ingress, accepting traffic from anywhere on target port 5000&lt;br&gt;
Labeled the revisions "current" and "updated", with "updated" mapped to v2&lt;br&gt;
Split traffic 75% to the existing revision and 25% to v2, and verified the configuration on the Revisions and replicas page&lt;/p&gt;

&lt;h3&gt;
  
  
  Skills practiced:
&lt;/h3&gt;

&lt;p&gt;Azure Container Apps, revision management, traffic splitting, ingress configuration, progressive delivery&lt;/p&gt;

&lt;p&gt;Across the full series: Azure resource setup, Azure Container Registry security with managed identity and private endpoints, container app deployment with Service Bus connectivity and HTTP autoscaling, CI/CD with Azure Pipelines and a self-hosted agent, and revision-based releases.&lt;/p&gt;

</description>
      <category>containers</category>
      <category>microservices</category>
      <category>devops</category>
      <category>deployment</category>
    </item>
    <item>
      <title>Azure Container Apps Guided Project (AZ-2026), Part 4: CI/CD with Azure Pipelines and a Self-Hosted Agent</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Sat, 03 Oct 2026 17:18:14 +0000</pubDate>
      <link>https://dev.to/rahimah_dev/azure-container-apps-guided-project-az-2026-part-4-cicd-with-azure-pipelines-and-a-self-hosted-2hom</link>
      <guid>https://dev.to/rahimah_dev/azure-container-apps-guided-project-az-2026-part-4-cicd-with-azure-pipelines-and-a-self-hosted-2hom</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Employers want engineers who can automate deployments, not just run them by hand, and fix the pipeline when it breaks.&lt;/p&gt;

&lt;p&gt;The scenario: At Fabrikam Inc., the container app is running, but every release is still manual. The DevOps team wants an Azure Pipeline that deploys the image from Azure Container Registry to Azure Container Apps on a self-hosted agent, and the deployment has to succeed at least once to prove it works.&lt;/p&gt;

&lt;p&gt;In Part 4, I configure Pipeline1 to use the self-hosted agent pool and add the Azure Container Apps deployment task. The first run failed, so I troubleshoot the errors and rerun the pipeline until the deployment succeeds. I then verify it in the pipeline's run history and the container app's activity log.&lt;/p&gt;

&lt;p&gt;The following Azure resources must be available in your Resource group named RG1:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Container registry instance that contains one image.&lt;/li&gt;
&lt;li&gt;A Virtual network with subnets.&lt;/li&gt;
&lt;li&gt;A Service Bus Namespace&lt;/li&gt;
&lt;li&gt;A Managed Identity&lt;/li&gt;
&lt;li&gt;A Private endpoint&lt;/li&gt;
&lt;li&gt;A Container App&lt;/li&gt;
&lt;li&gt;A Container Apps Environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You've been asked to configure a continuous integration environment for Container Apps that meets the following requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need an Azure Container Apps deployment task in your Azure DevOps environment.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Pipeline1&lt;/code&gt; must deploy a container image from your container registry to your container app using a self-hosted agent pool.&lt;/li&gt;
&lt;li&gt;You must ensure that the pipeline successfully deploys the image at least once.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You complete the following tasks during this exercise:&lt;/p&gt;

&lt;p&gt;1.Configure &lt;code&gt;Pipeline1&lt;/code&gt; to use the self-hosted agent pool.&lt;/p&gt;

&lt;p&gt;2.Configure &lt;code&gt;Pipeline1&lt;/code&gt; with an Azure Container Apps deployment task.&lt;/p&gt;

&lt;p&gt;3.Run the &lt;code&gt;Pipeline1&lt;/code&gt; deployment task.&lt;/p&gt;

&lt;p&gt;4.Verify the configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure &lt;code&gt;Pipeline1&lt;/code&gt; to use the self-hosted agent pool
&lt;/h2&gt;

&lt;p&gt;1.Open a browser window, navigate to &lt;a href="https://dev.azure.com" rel="noopener noreferrer"&gt;https://dev.azure.com&lt;/a&gt;, and then open your Azure DevOps organization.&lt;/p&gt;

&lt;p&gt;2.On your Azure DevOps page, to open your DevOps project, select &lt;code&gt;Project1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;3.In the left-side menu, select &lt;code&gt;Pipelines&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;4.Select &lt;code&gt;Pipeline1&lt;/code&gt;, and then select &lt;strong&gt;Edit&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;5.To use the self-hosted agent pool, update the azure-pipelines.yml file as shown in the following 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;trigger&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;pool&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;default&lt;/span&gt;

&lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recall that the &lt;code&gt;pool&lt;/code&gt; section specifies the agent pool to use for the pipeline. The &lt;code&gt;name&lt;/code&gt; property specifies the name of the agent pool. In this case, the name is &lt;code&gt;default&lt;/code&gt;, which is the pool you configured as a self-hosted agent pool.&lt;/p&gt;

&lt;p&gt;6.Under &lt;strong&gt;Validate and save&lt;/strong&gt;, select &lt;strong&gt;Save without validating&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo7uaaesmu6wltp50242w.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%2Fo7uaaesmu6wltp50242w.png" alt="savewvalidating" width="799" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.Enter a commit message, and then select &lt;strong&gt;Save&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1jovslmkva3oeva7rifx.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%2F1jovslmkva3oeva7rifx.png" alt="save" width="800" height="440"&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%2F22rso4r40fhnywuhcofn.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%2F22rso4r40fhnywuhcofn.png" alt="runs" width="799" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure Pipeline1 with an Azure Container Apps deployment task
&lt;/h2&gt;

&lt;p&gt;1.Ensure that you have &lt;code&gt;Pipeline1&lt;/code&gt; open for editing.&lt;/p&gt;

&lt;p&gt;2.On the right side under Tasks, in the Search tasks field, enter &lt;strong&gt;azure container&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;3.In the filtered list of tasks, select &lt;strong&gt;Azure Container Apps Deploy&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F63s1sav87ykkuaapxi2u.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%2F63s1sav87ykkuaapxi2u.png" alt="azurecontainerappsdeploy" width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.Under Azure Resource Manager connection, select the Subscription you're using, and then select &lt;strong&gt;Authorize&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhy7d6rg5jl541hu7nx3l.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%2Fhy7d6rg5jl541hu7nx3l.png" alt="arm" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.In the Azure portal tab, open your Container App resource, and then open the Containers page.&lt;/p&gt;

&lt;p&gt;6.Use the information on the Containers page to configure the following &lt;code&gt;Pipeline1&lt;/code&gt; Task information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker Image to Deploy: &lt;code&gt;&amp;lt;Registry&amp;gt;/&amp;lt;Image&amp;gt;:&amp;lt;Image tag&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Azure Container App name: &lt;code&gt;&amp;lt;Name&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;7.Configure the following &lt;code&gt;Pipeline1&lt;/code&gt; Task information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure Resource group name: RG1&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Note&lt;/p&gt;

&lt;p&gt;If you need to verify the resource group name, you can find it on the Overview page of your Container App resource.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;8.On the Azure Container Apps Deploy page, select &lt;strong&gt;Add&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5k6wlgjlznypab9df6n6.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%2F5k6wlgjlznypab9df6n6.png" alt="add" width="799" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Yaml file for your pipeline should now include the AzureContainerApps tasks as follows:&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;trigger&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;pool&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;default&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;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AzureContainerApps@1&lt;/span&gt;
    &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;azureSubscription&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;Subscription&amp;gt;(&amp;lt;Subscription&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ID&amp;gt;)'&lt;/span&gt;
      &lt;span class="na"&gt;imageToDeploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;Registry&amp;gt;/&amp;lt;Image&amp;gt;:&amp;lt;Image&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;tag&amp;gt;'&lt;/span&gt; &lt;span class="s"&gt;from Container App resource&lt;/span&gt;
      &lt;span class="na"&gt;containerAppName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;Name&amp;gt;'&lt;/span&gt; &lt;span class="s"&gt;from Container App resource&lt;/span&gt; 
      &lt;span class="na"&gt;resourceGroup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;resource&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;group&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;name&amp;gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's an example that shows a YAML configuration snippet:&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;trigger&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;pool&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;default&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;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AzureContainerApps@1&lt;/span&gt;
    &lt;span class="na"&gt;inputs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;azureSubscription&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Visual&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Studio&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Enterprise(1111aaaa-22bb-33cc-44dd-555555eeeeee)'&lt;/span&gt;
      &lt;span class="na"&gt;imageToDeploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;acraz2003cah12oct.azurecr.io/aspnetcorecontainer:latest'&lt;/span&gt;
      &lt;span class="na"&gt;containerAppName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;aca-az2003'&lt;/span&gt;
      &lt;span class="na"&gt;resourceGroup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;RG1'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;9.Select &lt;strong&gt;Validate and save&lt;/strong&gt;, and then select &lt;strong&gt;Save&lt;/strong&gt; again to commit directly to the main branch.&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%2Fcgf0y88qr4qn78fza86u.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%2Fcgf0y88qr4qn78fza86u.png" alt="save" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc5y3dpi1c8af5yn622rd.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%2Fc5y3dpi1c8af5yn622rd.png" alt="commit" width="800" height="377"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The contents of the YAML file must be formatted correctly, including indentation. If you encounter an error, review the YAML file and correct any indentation issues.&lt;/p&gt;

&lt;p&gt;10.Navigate back to the main page of your pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run the Pipeline1 deployment task
&lt;/h2&gt;

&lt;p&gt;1.Ensure that you have &lt;code&gt;Pipeline1&lt;/code&gt; open in Azure DevOps.&lt;/p&gt;

&lt;p&gt;2.On the Runs tab of the Pipeline1 page, select &lt;strong&gt;Run pipeline&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A Run pipeline page opens to display the associated job.&lt;/p&gt;

&lt;p&gt;3.Select &lt;strong&gt;Run&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhr6p28yfq09kaq07t2r5.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%2Fhr6p28yfq09kaq07t2r5.png" alt="waiting" width="800" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Jobs section displays job status, which progresses from Queued to Waiting.&lt;/p&gt;

&lt;p&gt;It can take a couple minutes for the status to transition from Queued to Waiting.&lt;/p&gt;

&lt;p&gt;4.If a 'Permission needed' message is displayed ("This pipeline needs permission to access 2 resources before this run can continue"), select &lt;strong&gt;View&lt;/strong&gt; and then provide the required permissions.&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%2Fpc5x74pdink4c7mbtyhe.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%2Fpc5x74pdink4c7mbtyhe.png" alt="view" width="800" height="329"&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%2Fes0bxfp3h5n76mhu7y1t.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%2Fes0bxfp3h5n76mhu7y1t.png" alt="permit" width="800" height="438"&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%2Fphw210s3z8rpnlah5pm4.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%2Fphw210s3z8rpnlah5pm4.png" alt="permit" width="800" height="439"&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%2F15zcep2dvtoz7b8vff5o.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%2F15zcep2dvtoz7b8vff5o.png" alt="starting job" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.Monitor the status of the run operation and verify that the run is successful.&lt;/p&gt;

&lt;p&gt;It wasn't successful, so I updated the yaml file to include the subscription.&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%2Ft0jz8x9a95gqeegzm6s4.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%2Ft0jz8x9a95gqeegzm6s4.png" alt="edit" width="800" height="380"&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%2Fnziiqjiu4ibjortuck0b.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%2Fnziiqjiu4ibjortuck0b.png" alt="error" width="799" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Azure connection now works. The log shows the login succeeded and containerapp show found aca-az2026. The error "spawnSync az ENOENT" means the task tried to run az to log in to your registry, and Windows couldn't find it. The task runs az in a way that doesn't work with the Windows az.cmd file. &lt;/p&gt;

&lt;p&gt;The solution is to give the task your registry username and password, so it logs in with those and skips az for that step. I'll get the Registry credential from the Azure portal. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to Settings → Access keys.&lt;/li&gt;
&lt;li&gt;Then Switch Admin user on.&lt;/li&gt;
&lt;li&gt;Copy the Username (usually the same as the registry name) and one of the Passwords.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then store the password as a secret: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In Pipeline1, click Edit, then &lt;strong&gt;Variables → New variable&lt;/strong&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F254w4scyw4cjqtm9t16k.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%2F254w4scyw4cjqtm9t16k.png" alt="variables" width="705" height="816"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: acrPassword&lt;/li&gt;
&lt;li&gt;Value: paste the password.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuad1gnm0ccuhomuryuno.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%2Fuad1gnm0ccuhomuryuno.png" alt="passwd" width="605" height="918"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tick Keep this value secret, then click &lt;strong&gt;OK&lt;/strong&gt; and &lt;strong&gt;Save&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docker permissions issue: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open Computer Management → Local Users and Groups → Groups → docker-users.&lt;/li&gt;
&lt;li&gt;Click Add, add your Windows user, and click OK.&lt;/li&gt;
&lt;li&gt;Sign out of Windows and sign back in.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Start Docker Desktop, then start the agent again from PowerShell as administrator (cd C:\agents, then .\run.cmd).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then click Run pipeline. &lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8o0l9qqsf8ptvs5qxws2.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%2F8o0l9qqsf8ptvs5qxws2.png" alt="succeeded" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This Screenshot of Azure Pipelines is showing a successful run of Pipeline1.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check your work
&lt;/h2&gt;

&lt;p&gt;In this task, you examine your pipeline and container app to verify successful pipeline runs.&lt;/p&gt;

&lt;p&gt;1.Ensure that you have &lt;code&gt;Project1&lt;/code&gt; open in Azure DevOps.&lt;/p&gt;

&lt;p&gt;2.On the left side menu, select &lt;strong&gt;Pipelines&lt;/strong&gt;, and then select &lt;code&gt;Pipeline1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;3.The Runs tab displays individual runs that can be selected to review details.&lt;/p&gt;

&lt;p&gt;4.Open your Azure portal, and then open your Container App.&lt;/p&gt;

&lt;p&gt;5.On the left side menu, select &lt;strong&gt;Activity Log&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;6.Verify that a &lt;strong&gt;Create or Update Container App&lt;/strong&gt; operation succeeded as a result of running your pipeline.&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%2Fn97y7jd4fsxbids80ewl.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%2Fn97y7jd4fsxbids80ewl.png" alt="successful create and update app" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3scauagc8cb1octf7kcb.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%2F3scauagc8cb1octf7kcb.png" alt="successfuljobs" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Cloud and DevOps practitioner building hands-on Azure skills through a five-part series on Azure Container Apps.&lt;/p&gt;

&lt;p&gt;Part 4 covers continuous integration with Azure Pipelines:&lt;/p&gt;

&lt;p&gt;Configured an Azure Pipeline to run on a self-hosted Windows agent pool&lt;br&gt;
Added the Azure Container Apps deployment task to deploy an image from Azure Container Registry to the container app&lt;br&gt;
Troubleshot a failed run, including the "spawnSync az ENOENT" error and Docker permission issues on the agent, until the deployment succeeded&lt;br&gt;
Verified the result in the pipeline run history and the container app's activity log.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skills practiced:
&lt;/h2&gt;

&lt;p&gt;Azure DevOps, Azure Pipelines, YAML pipelines, CI/CD, self-hosted agents, Azure Container Apps, Docker, troubleshooting&lt;/p&gt;

</description>
      <category>azure</category>
      <category>devops</category>
      <category>cicd</category>
      <category>docker</category>
    </item>
    <item>
      <title>Part 3: Deploying a Container App with Managed Identity, Service Bus, and HTTP Scaling</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Sat, 03 Oct 2026 16:20:17 +0000</pubDate>
      <link>https://dev.to/rahimah_dev/part-3-deploying-a-container-app-with-managed-identity-service-bus-and-http-scaling-3d2e</link>
      <guid>https://dev.to/rahimah_dev/part-3-deploying-a-container-app-with-managed-identity-service-bus-and-http-scaling-3d2e</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Employers want engineers who can take an app from a registry to a running, secure, scalable service.&lt;/p&gt;

&lt;p&gt;The scenario: At Fabrikam Inc., the registry is secured and the DevOps team is ready to deploy. The container app must run inside the virtual network, pull its image from Azure Container Registry, connect to Service Bus without a stored password, and scale to a maximum of two replicas to control costs.&lt;/p&gt;

&lt;p&gt;In Part 3, I deploy the container app to VNET1/ACASubnet, attach a user-assigned managed identity, connect it to Service Bus, and configure an HTTP scale rule. I then verify everything with the Azure CLI.&lt;/p&gt;

&lt;p&gt;In this exercise, you will deploy a container app from an image in the Azure Container Registry to the Azure Container Apps platform.&lt;/p&gt;

&lt;p&gt;The following Azure resources must be available in your Resource group named RG1:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Container registry instance that contains one image.&lt;/li&gt;
&lt;li&gt;A Virtual network with subnets.&lt;/li&gt;
&lt;li&gt;A Service Bus Namespace&lt;/li&gt;
&lt;li&gt;A Managed Identity&lt;/li&gt;
&lt;li&gt;A Private endpoint&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You've been asked to configure a container app that meets the following requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is deployed to VNET1/ACASubnet.&lt;/li&gt;
&lt;li&gt;Pulls an image from a container registry.&lt;/li&gt;
&lt;li&gt;Authenticates using a user-assigned managed identity (uai-az2003).&lt;/li&gt;
&lt;li&gt;Uses Container App to connect to a Service Bus instance using the .NET client type.&lt;/li&gt;
&lt;li&gt;The app can run up to two replicas that are added whenever there are 10,000 HTTP concurrent requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You complete the following tasks during this exercise:&lt;/p&gt;

&lt;p&gt;1.Create a container app that uses an ACR image&lt;/p&gt;

&lt;p&gt;2.Configure the container app to authenticate using the user assigned identity&lt;/p&gt;

&lt;p&gt;3.Configure a connection between the container app and Service Bus&lt;/p&gt;

&lt;p&gt;4.Configure HTTP scale rules&lt;/p&gt;

&lt;p&gt;5.Verify the configuration&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a container app that uses an ACR image
&lt;/h2&gt;

&lt;p&gt;Complete the following steps to create a container app that uses an ACR image.&lt;/p&gt;

&lt;p&gt;1.Open your Azure portal.&lt;/p&gt;

&lt;p&gt;2.On the top search bar, in the Search textbox, enter &lt;strong&gt;container app&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Funvdydk0sd0qs2meenk2.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%2Funvdydk0sd0qs2meenk2.png" alt="aca" width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.In the search results under Services, select &lt;strong&gt;Container Apps&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;4.Select &lt;strong&gt;Create&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbet28oybeqg7y9jndhqv.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%2Fbet28oybeqg7y9jndhqv.png" alt="aca" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.On the Basics tab, specify the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Subscription: Specify the Azure subscription that you're using for this guided project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resource group: &lt;strong&gt;RG1&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Container app name: &lt;strong&gt;aca-az2003&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Region: Select the Region specified for VNET1 (Central US).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The container app needs to be in the same region/location as the virtual network so you can choose VNET1 for the managed environment. For this guided project, keep all of your resources in the region/location specified for your resource group.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Container Apps Environment: Select &lt;strong&gt;Create new&lt;/strong&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnw55448ffpqccozywt2x.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%2Fnw55448ffpqccozywt2x.png" alt="createnew" width="800" height="721"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.On the Create Container Apps Environment page, select the &lt;strong&gt;Networking&lt;/strong&gt; tab, and then specify the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use your own virtual network: Select &lt;strong&gt;Yes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Virtual network: Select &lt;strong&gt;VNET1&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Infrastructure subnet: &lt;strong&gt;ACASubnet&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Note&lt;/p&gt;

&lt;p&gt;If the ACASubnet subnet is not listed, open your virtual network resource, adjust the subnet address range to 10.0.2.0/23 and retry the steps to create the Container App.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;7.On the Create Container Apps Environment page, select &lt;strong&gt;Create&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgm4qqcqslru3whmxpp8j.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%2Fgm4qqcqslru3whmxpp8j.png" alt="capage" width="800" height="789"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8.On the Create Container App page, select the Container tab, and then specify the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use quickstart image: Ensure that this setting is not selected. If it is selected, uncheck this setting.&lt;/li&gt;
&lt;li&gt;Name: Enter &lt;strong&gt;aca-az2003&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Image source: Ensure that &lt;strong&gt;Azure Container Registry&lt;/strong&gt; is selected.&lt;/li&gt;
&lt;li&gt;Registry: Select your container registry. For example: &lt;strong&gt;acraz2003cah.azurecr.io&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Image: Select &lt;strong&gt;aspnetcorecontainer&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Image tag: Select &lt;strong&gt;latest&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;9.Select &lt;strong&gt;Review + create&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvzq0ir7o3g70bcgkp3wf.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%2Fvzq0ir7o3g70bcgkp3wf.png" alt="reviewncreate" width="800" height="709"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;10.Once verification has Passed, select &lt;strong&gt;Create&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjlezwlhv29y05edho8jf.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%2Fjlezwlhv29y05edho8jf.png" alt="create" width="800" height="781"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;11.Wait for the deployment to complete.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note&lt;/p&gt;

&lt;p&gt;This deployment normally takes 3-5 minutes to complete, but may take up to 10 minutes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Configure the container app to authenticate using the user assigned identity
&lt;/h2&gt;

&lt;p&gt;Complete the following steps to configure the container app to authenticate using the user assigned identity.&lt;/p&gt;

&lt;p&gt;1.On the Azure portal, open the Container App that you created.&lt;/p&gt;

&lt;p&gt;2.Under Security, select &lt;strong&gt;Identity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;3.Select the tab for &lt;strong&gt;User assigned&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;4.Select &lt;strong&gt;Add user assigned managed identity&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9x6ro75xi6o4bmqhawhu.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%2F9x6ro75xi6o4bmqhawhu.png" alt="uami" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.On the Add user assigned managed identity page, select &lt;strong&gt;uai-az2003&lt;/strong&gt;, and then select &lt;strong&gt;Add&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5ywfrrdliluvgsj0iaev.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%2F5ywfrrdliluvgsj0iaev.png" alt="add" width="799" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note&lt;/p&gt;

&lt;p&gt;Support for Service Connector (preview) on Azure Container Apps ended on March 30, 2026, and after that date new service connections aren't available.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Configure a connection between the container app and Service Bus
&lt;/h2&gt;

&lt;p&gt;Complete the following steps to configure a connection between the container app and Service Bus.&lt;/p&gt;

&lt;p&gt;1.On the Azure portal, ensure that you have your Container App open.&lt;/p&gt;

&lt;p&gt;2.Under Settings, select &lt;strong&gt;Service Connector (Preview)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;3.Select &lt;strong&gt;Connect to your Services&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;4.On the Create connection page, specify the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service type: Select &lt;strong&gt;Services Bus&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Client type: Select &lt;strong&gt;.NET&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;5.Select &lt;strong&gt;Next: Authentication&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;6.On the Authentication tab, select &lt;strong&gt;User assigned managed identity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;7.Ensure that the correct subscription and user assigned managed  identity are selected.&lt;/p&gt;

&lt;p&gt;Subscription: The Azure subscription that you're using for this guided project. User assigned managed identity: &lt;strong&gt;uai-az2003&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;8.To change tabs, select &lt;strong&gt;Review + Create&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;9.Once the Validation passed message appears, select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;10.Wait for the connection to be created.&lt;/p&gt;

&lt;p&gt;It can take a minute before the Service Connector page updates with the new connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure HTTP scale rules
&lt;/h2&gt;

&lt;p&gt;1.Ensure that your Container App is open in the portal.&lt;/p&gt;

&lt;p&gt;2.On the left-side menu under Application, select &lt;strong&gt;Revisions and replicas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;3.Notice the Name assigned to your active revision.&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%2Fkc44uxvpph80pnh26b7r.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%2Fkc44uxvpph80pnh26b7r.png" alt="active" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.On the left-side menu under Application, select &lt;strong&gt;Containers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;5.To the right of &lt;strong&gt;Based on revision&lt;/strong&gt;, ensure that your active revision is selected.&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%2Foyy5ymrlsp7ohcplzblx.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%2Foyy5ymrlsp7ohcplzblx.png" alt="basedonrevision" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.On the left-side menu under Application, select &lt;strong&gt;Scale&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;7.Configure the Min / max replicas as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set Min replicas: 0&lt;/li&gt;
&lt;li&gt;Set Max replicas: 2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;8.Under Scale rule, select &lt;strong&gt;+ Add&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftsn3uj23qbeo3yfczpie.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%2Ftsn3uj23qbeo3yfczpie.png" alt="add" width="800" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;9.On the Add scale rule page, specify the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rule name: Enter &lt;strong&gt;scalerule-http&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Type: Select &lt;strong&gt;HTTP scaling&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Concurrent requests: Set the value to &lt;strong&gt;10,000&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;10.On the Add scale rule page, select &lt;strong&gt;Add scale rule&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn5pf52sdcseog8zgj1xd.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%2Fn5pf52sdcseog8zgj1xd.png" alt="scalerule" width="800" height="818"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;11.On the Create and deploy new revision page, select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;12.Ensure that your new scale rule is displayed.&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%2F5p7tvsrpxet4mcev8xve.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%2F5p7tvsrpxet4mcev8xve.png" alt="scalerule" width="800" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Check your work
&lt;/h2&gt;

&lt;p&gt;In this task, you verify that your configuration meets the specified requirements.&lt;/p&gt;

&lt;p&gt;1.In the Azure portal, ensure that your Container App resource is open.&lt;/p&gt;

&lt;p&gt;2.On the left-side menu, under Settings, select &lt;strong&gt;Deployment&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;3.At the top of the page, ensure that the Continuous deployment tab is selected.&lt;/p&gt;

&lt;p&gt;4.Verify that the expected Registry settings are reported:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository source: &lt;strong&gt;Azure Container Registry&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Registry: the name of your Container Registry (for example: acraz2003cah)&lt;/li&gt;
&lt;li&gt;Image: &lt;strong&gt;aca-az2003&lt;/strong&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn42w3kd8pe4ndnsa14mm.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%2Fn42w3kd8pe4ndnsa14mm.png" alt="image" width="799" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.Close the Container App 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc4xcd840ihswmbjihst1.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%2Fc4xcd840ihswmbjihst1.png" alt="ca" width="799" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.Open your Container Apps Environment resource.&lt;/p&gt;

&lt;p&gt;7.Verify that your Container App uses the proper subnet as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the Overview page, verify that Virtual Network is set to VNET1.&lt;/li&gt;
&lt;li&gt;On the Overview page, verify that Infrastructure subnet is set to ACASubnet.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7oipgrip9u3ujvo50co6.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%2F7oipgrip9u3ujvo50co6.png" alt="vnet" width="799" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8.In the Azure portal, open the Cloud Shell and the switch to PowerShell.&lt;/p&gt;

&lt;p&gt;Run the following command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;az containerapp connection show --connection servicebus_b2a10 --name aca-az2026 --resource-group RG1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I ran this instead because there's no container app connection yet. I used &lt;code&gt;az containerapp connection create servicebus&lt;/code&gt; with these parameters:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--connection&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sb_az2026_rah&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--resource-group&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;RG1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;aca-az2026&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--target-resource-group&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;RG1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--namespace&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sb-az2026-rah&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--user-identity&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;client-id=&amp;lt;your-client-id&amp;gt; subs-id=&amp;lt;your-subscription-id&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--container&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;aca-az2026&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--client-type&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;dotnet&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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%2F9hr1in9nzpuixof4wqcq.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%2F9hr1in9nzpuixof4wqcq.png" alt="succeeded" width="799" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The connection was created. The output shows "provisioningState": "Succeeded", and the connection is named sb_az2026_rah on aca-az2026.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: &lt;/p&gt;

&lt;p&gt;The connection added two environment variables to your container:&lt;br&gt;
AZURE_SERVICEBUS_FULLYQUALIFIEDNAMESPACE = sb-az2026-rah.servicebus.windows.net&lt;br&gt;
AZURE_SERVICEBUS_CLIENTID = your identity's client ID (a55ff84a-...)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This means the app can use these to reach Service Bus with the managed identity, with no connection string or password.&lt;/p&gt;

&lt;p&gt;10.Verify that the targetService properties match the specified configuration.&lt;/p&gt;

&lt;p&gt;To confirm it's healthy, run: &lt;/p&gt;

&lt;p&gt;az containerapp connection validate --connection sb_az2026_rah --name aca-az2026 --resource-group RG1&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%2Fr8qf5mf06shd8avvneqw.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%2Fr8qf5mf06shd8avvneqw.png" alt="validated" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
The results should show success for each check.&lt;/p&gt;

&lt;p&gt;To confirm the identity has permission on the Service Bus. The connection normally grants this automatically, but the output shows "roles": null, so it's worth a quick look:You should see a Service Bus role, such as Azure Service Bus Data Owner, on sb-az2026-rah. If there's none, your app will get authorization errors when it tries to send or receive messages.&lt;/p&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;az role assignment list &lt;span class="nt"&gt;--assignee&lt;/span&gt; a55ff84a-54e6-4b57-8db0-c20de0e3effb &lt;span class="nt"&gt;--all&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; table
&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%2Fkckb9m2cbw9kg93ggbvx.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%2Fkckb9m2cbw9kg93ggbvx.png" alt="role" width="799" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Permissions are in place. The identity has both roles it needs on sb-az2026-rah:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure Service Bus Data Sender lets your app send messages.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Azure Service Bus Data Receiver lets your app receive messages.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;AcrPull&lt;/code&gt; role is a separate permission that lets the app pull its image from your container registry, so it's fine to have too.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Your setup is complete: the identity is attached to aca-az2026, the connection sb_az2026_rah succeeded, and the roles are assigned.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To verify your HTTP scale rule, you would need to run testing software that's able to simulate 10,000 concurrent HTTP requests and ensure that container replicas are created.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Cloud and DevOps practitioner building hands-on Azure skills through a five-part series on Azure Container Apps.&lt;/p&gt;

&lt;p&gt;Part 3 covers deploying and connecting the container app:&lt;/p&gt;

&lt;p&gt;Deployed a container app from an Azure Container Registry image into VNET1/ACASubnet&lt;br&gt;
Attached a user-assigned managed identity for passwordless authentication&lt;br&gt;
Connected the app to Service Bus using the .NET client type, with no connection string&lt;br&gt;
Configured an HTTP scale rule (0 to 2 replicas, 10,000 concurrent requests)&lt;br&gt;
Verified the connection and role assignments (Service Bus Data Sender and Receiver) with the Azure CLI&lt;/p&gt;

&lt;h3&gt;
  
  
  Skills practiced:
&lt;/h3&gt;

&lt;p&gt;Azure Container Apps, Managed Identity, Service Bus, Service Connector, Azure CLI, Autoscaling, Azure RBAC&lt;/p&gt;

</description>
      <category>azure</category>
      <category>devops</category>
      <category>docker</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Part 2: Securing Azure Container Registry with Managed Identity and Private Endpoints</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Sat, 03 Oct 2026 15:13:17 +0000</pubDate>
      <link>https://dev.to/rahimah_dev/part-2-securing-azure-container-registry-with-managed-identity-and-private-endpoints-9b1</link>
      <guid>https://dev.to/rahimah_dev/part-2-securing-azure-container-registry-with-managed-identity-and-private-endpoints-9b1</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Employers expect cloud engineers to build security in from the start, not add it later.&lt;/p&gt;

&lt;p&gt;The scenario: At Fabrikam Inc., the DevOps team is moving from AKS to Azure Container Apps. Before deploying anything, the security team requires that the container registry use a managed identity instead of stored credentials, grant only pull permissions (least privilege), and be reachable only through a private endpoint.&lt;/p&gt;

&lt;p&gt;In Part 2, I meet those requirements by creating a user-assigned managed identity, assigning it the AcrPull role, and configuring a private endpoint with private DNS on VNET1/PESubnet. I then verify the setup.&lt;/p&gt;

&lt;p&gt;Here, I configure a container registry instance for a secure connection from a container app.&lt;/p&gt;

&lt;p&gt;The following Azure resources must be available in your Resource group named RG1:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Container Registry instance that contains one image.&lt;/li&gt;
&lt;li&gt;A Virtual Network with subnets.&lt;/li&gt;
&lt;li&gt;Service Bus Namespace&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Important&lt;/p&gt;

&lt;p&gt;The previous unit (Prepare your app deployment tools and resources) includes a Setup section that describes how to configure the recourses for this guided project module. If necessary, go back and follow the Setup instructions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You've been asked to configure your Azure resources to meet the following requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your resource group must include a user-assigned managed identity.&lt;/li&gt;
&lt;li&gt;Your container registry must be able to use the managed identity to pull artifacts.&lt;/li&gt;
&lt;li&gt;Access for the managed identity must be limited using the principle of least privilege.&lt;/li&gt;
&lt;li&gt;Your container registry must be accessible from a private endpoint on  VNET1/PESubnet.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You complete the following tasks during this exercise:&lt;/p&gt;

&lt;p&gt;1.Configure a user-assigned managed identity.&lt;/p&gt;

&lt;p&gt;2.Configure your container registry with AcrPull permissions for the managed identity.&lt;/p&gt;

&lt;p&gt;3.Configure your container registry with a private endpoint connection.&lt;/p&gt;

&lt;p&gt;4.Verify the configuration.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note&lt;/p&gt;

&lt;p&gt;Before continuing, ensure that you've completed the Setup section of the Prepare your app deployment tools and resources unit.&lt;br&gt;
Configure a user-assigned managed identity&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Complete the following steps to configure a user-assigned managed  identity.
&lt;/h2&gt;

&lt;p&gt;1.Open your Azure portal.&lt;/p&gt;

&lt;p&gt;2.On the Search bar, enter &lt;strong&gt;managed identity&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzdjjicjh2vztbs98nmn9.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%2Fzdjjicjh2vztbs98nmn9.png" alt="mi" width="754" height="909"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.In the filtered list of resources, select &lt;strong&gt;User Assigned Managed Identity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;4.On the User Assigned Managed Identity page, select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;5.On the Create User Assigned Managed Identity page, specify the  following information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subscription: Specify the Azure subscription that you're using for this guided project.&lt;/li&gt;
&lt;li&gt;Resource group: &lt;strong&gt;RG1&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Region: &lt;strong&gt;Central US&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Name: &lt;strong&gt;uai-az2003&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;6.Select &lt;strong&gt;Review + create&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1vq196aigq41ili5lgyp.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%2F1vq196aigq41ili5lgyp.png" alt="reviewncreate" width="800" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.Select &lt;strong&gt;Create&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbr82afninfiqeeadmcuv.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%2Fbr82afninfiqeeadmcuv.png" alt="create" width="800" height="829"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure Container Registry with AcrPull permissions for the managed identity
&lt;/h2&gt;

&lt;p&gt;Complete the following steps to configure Container Registry with  AcrPull  permissions for the managed identity.&lt;/p&gt;

&lt;p&gt;1.In the Azure portal, open your Container Registry resource.&lt;/p&gt;

&lt;p&gt;2.On the left-side menu, select &lt;strong&gt;Access Control (IAM)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;3.On the Access Control (IAM) page, select &lt;strong&gt;Add role assignment&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp13oxov0lk7alkiw2xf6.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%2Fp13oxov0lk7alkiw2xf6.png" alt="IAM" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.Search for the AcrPull role, and then select &lt;strong&gt;AcrPull&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;5.Select Next.&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%2Fhm1m2q7jkid3cms19sfd.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%2Fhm1m2q7jkid3cms19sfd.png" alt="acrpull" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.On the Members tab, to the right of Assign access to, select &lt;strong&gt;Managed identity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;7.Select &lt;strong&gt;+ Select members&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftp6e1758a4wblolj19zr.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%2Ftp6e1758a4wblolj19zr.png" alt="selectmembers" width="800" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8.On the Select managed identities page, under Managed identity, select &lt;strong&gt;User-assigned managed identity&lt;/strong&gt;, and then select the user-assigned managed identity created for this project.&lt;/p&gt;

&lt;p&gt;For example: &lt;code&gt;uai-az2003&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;9.On the Select managed identities page, select &lt;strong&gt;Select&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz67k5jfberz51i08mlj8.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%2Fz67k5jfberz51i08mlj8.png" alt="select" width="800" height="844"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;10.On the Members tab of the Add role assignment page, select &lt;strong&gt;Review + assign&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1oqmfkoiwcicog65dszy.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%2F1oqmfkoiwcicog65dszy.png" alt="reviewnassign" width="800" height="686"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;11.On the Review + assign tab, select &lt;strong&gt;Review + assign&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvl5w91vzbahvjzydlv38.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%2Fvl5w91vzbahvjzydlv38.png" alt="r&amp;amp;a" width="800" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;12.Wait for the role assignment to be added.&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%2F3k8zu1d83l0tu13kaz6p.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%2F3k8zu1d83l0tu13kaz6p.png" alt="deployed" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure Container Registry with a private endpoint connection
&lt;/h2&gt;

&lt;p&gt;1.Ensure that your Container Registry resource is open in the portal.&lt;/p&gt;

&lt;p&gt;2.Under Settings, select &lt;strong&gt;Networking&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;3.On the Private access tab, select &lt;strong&gt;+ Create a private endpoint connection&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fix1ckgrwy5ks6pxk2khi.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%2Fix1ckgrwy5ks6pxk2khi.png" alt="pe" width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.On the Basics tab, under Project details, specify the following information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subscription: Specify the Azure subscription that you're using for this guided project.&lt;/li&gt;
&lt;li&gt;Resource group: &lt;strong&gt;RG1&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Name: &lt;strong&gt;pe-acr-az2003&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Region: Ensure that &lt;strong&gt;Central US&lt;/strong&gt; is selected.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff2v94jp7mvfruz0qf82r.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%2Ff2v94jp7mvfruz0qf82r.png" alt="networking" width="800" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.Select &lt;strong&gt;Next: Resource&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;6.On the Resource tab, ensure the following information is displayed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subscription: Ensure that the Azure subscription that you're using for this guided project is selected.&lt;/li&gt;
&lt;li&gt;Resource type: Ensure that &lt;strong&gt;Microsoft.ContainerRegistry/registries&lt;/strong&gt; is selected.&lt;/li&gt;
&lt;li&gt;Resource: Ensure that the name of your registry is selected.&lt;/li&gt;
&lt;li&gt;Target sub-resource: Ensure that &lt;strong&gt;registry&lt;/strong&gt; is selected.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsf2o4adgnfudal3iqgvt.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%2Fsf2o4adgnfudal3iqgvt.png" alt="acr" width="800" height="617"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.Select &lt;strong&gt;Next: Virtual Network&lt;/strong&gt;.&lt;br&gt;
 8.On the Virtual Network tab, under Networking, ensure the following information is displayed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Virtual network: Ensure that &lt;code&gt;VNET1&lt;/code&gt; is selected&lt;/li&gt;
&lt;li&gt;Subnet: Ensure that &lt;code&gt;PESubnet&lt;/code&gt; is selected.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqzxqubrdlmc1kseshfp7.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%2Fqzxqubrdlmc1kseshfp7.png" alt="vnet" width="800" height="580"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;9.Select &lt;strong&gt;Next: DNS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;10.On the DNS tab, under Private DNS Integration, ensure the following information is displayed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integrate with private DNS zone: Ensure that &lt;strong&gt;Yes&lt;/strong&gt; is selected.&lt;/li&gt;
&lt;li&gt;Private DNS Zone: Notice that &lt;strong&gt;(new) privatelink.azurecr.io&lt;/strong&gt; is specified.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcr6i8ou44jv4mbx1vxde.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%2Fcr6i8ou44jv4mbx1vxde.png" alt="privatedns" width="800" height="642"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;11.Select &lt;strong&gt;Next: Tags&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;12.Select &lt;strong&gt;Next: Review + create&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe1377u1mhbeo15ycutkd.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%2Fe1377u1mhbeo15ycutkd.png" alt="reviewncreate" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;13.On the Review + create tab, when you see the Validation passed message, select &lt;strong&gt;Create&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1pt7ahjk5bue0h8q1ppk.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%2F1pt7ahjk5bue0h8q1ppk.png" alt="create" width="800" height="696"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;14.Wait for the deployment to complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check your work
&lt;/h2&gt;

&lt;p&gt;In this task, you verify that your configuration meets the specified requirements.&lt;/p&gt;

&lt;p&gt;1.In the Azure portal, open your Container Registry resource.&lt;/p&gt;

&lt;p&gt;2.On the Access Control (IAM) page, select &lt;strong&gt;Role assignments&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;3.Verify that the role assignments list shows the &lt;strong&gt;AcrPull&lt;/strong&gt; role assigned to the User-assigned Managed Identity resource.&lt;/p&gt;

&lt;p&gt;4.On the left-side menu, under Settings, select &lt;strong&gt;Networking&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;5.On the Networking page, select the &lt;strong&gt;Private access&lt;/strong&gt; tab.&lt;/p&gt;

&lt;p&gt;6.Under Private endpoint, select the private endpoint that you created.&lt;/p&gt;

&lt;p&gt;For example, select &lt;strong&gt;per-acr-az2003&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;7.On the Private endpoint page, under Settings, select &lt;strong&gt;DNS configuration&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;8.Verify the following DNS setting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Private DNS zone: set to &lt;strong&gt;privatelink.azurecr.io&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;9.On the left-side menu, select &lt;strong&gt;Overview&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;10.Verify the following setting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Virtual network/subnet: set to &lt;strong&gt;VNET1/PESubnet&lt;/strong&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2yyeposulexzux37bhwo.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%2F2yyeposulexzux37bhwo.png" alt="verify" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Cloud and DevOps practitioner building hands-on Azure security skills through a five-part series on Azure Container Apps.&lt;/p&gt;

&lt;p&gt;Part 2 focuses on securing Azure Container Registry for a container app, following the principle of least privilege:&lt;/p&gt;

&lt;p&gt;Created a user-assigned managed identity to replace stored credentials&lt;br&gt;
Assigned the AcrPull role so the identity can pull images and nothing more&lt;br&gt;
Configured a private endpoint on VNET1/PESubnet with private DNS integration (privatelink.azurecr.io)&lt;br&gt;
Verified the role assignment, DNS configuration, and network placement against the requirements&lt;/p&gt;

&lt;h3&gt;
  
  
  Skills practiced: Azure Container Registry, Managed Identity, Azure RBAC, Private Endpoints, Private DNS, Least Privilege, Cloud Networking.
&lt;/h3&gt;

</description>
      <category>azure</category>
      <category>devops</category>
      <category>security</category>
      <category>docker</category>
    </item>
    <item>
      <title>Getting Started with Azure Container Apps. Part 1: Setting Up Your Deployment Tools and Resources</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Sat, 03 Oct 2026 14:51:06 +0000</pubDate>
      <link>https://dev.to/rahimah_dev/getting-started-with-azure-container-apps-setting-up-your-deployment-tools-and-resources-ij2</link>
      <guid>https://dev.to/rahimah_dev/getting-started-with-azure-container-apps-setting-up-your-deployment-tools-and-resources-ij2</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Many teams adopt Kubernetes early, only to find they use a fraction of its capabilities. Azure Container Apps offers a simpler, serverless way to run containerized applications at scale.&lt;/p&gt;

&lt;p&gt;The scenario: You're on the DevOps team at Fabrikam Inc., which runs its containers on Azure Kubernetes Service (AKS). The team isn't using advanced features like custom service meshes, so they're paying for complexity they don't need. Your task is to build a proof of concept showing that Azure Container Apps can simplify their DevOps workflow, scale efficiently, and save resources through scale-to-zero.&lt;/p&gt;

&lt;p&gt;This first article lays the groundwork: installing the tools, provisioning the Azure resources, publishing a Web API to GitHub, pushing a Docker image to Azure Container Registry, and configuring Azure DevOps with a self-hosted agent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prepare your app deployment tools and resources
&lt;/h3&gt;

&lt;p&gt;In this guided project, you configure Azure resources and other tools to demonstrate the suitability of Azure Container Apps as a deployment option.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An Azure subscription and GitHub account are required for this guided project. For your Azure subscription, we recommend that you have the Owner, Azure account administrator, or Azure co-administrator role. The Contributor role does not provide the permissions required to complete all tasks in this guided project module.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Project overview
&lt;/h2&gt;

&lt;p&gt;You work on a devops team for a technology company named Fabrikam Inc. The team is looking into using Azure Container Apps to run containerized cloud-native apps. Fabrikam has been using Azure Kubernetes Service (AKS) to run containers. Although the team is obtaining the benefits of running apps as containers and from using Kubernetes as a host, they've discovered that they're not using advanced AKS features. For example, they're not using the custom service mesh or autoscaling features. The team believes they can both simplify and improve efficiency of their devops implementation by switching to Azure Container Apps. The team believes that switching to Azure Container Apps will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improve their ability to publish and run containerized apps at scale.&lt;/li&gt;
&lt;li&gt;Reduce the complexity of their current devops implementation.&lt;/li&gt;
&lt;li&gt;Save resources by using scale-to-zero and built-in autoscaling capabilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You have been tasked with developing a proof-of-concept solution. The solution must demonstrate the team's ability to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configure a secure connection between Azure Container Registry and Azure Container Apps.&lt;/li&gt;
&lt;li&gt;Create and configure a container app in Azure Container Apps.&lt;/li&gt;
&lt;li&gt;Configure continuous integration by using Azure Pipelines.&lt;/li&gt;
&lt;li&gt;Scale a deployed app in Azure Container Apps.&lt;/li&gt;
&lt;li&gt;Manage revisions in Azure Container Apps.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your goal for this module is to implement a solution that demonstrates the deployment of cloud-native apps using Azure Container Apps. To achieve this goal, you complete the following activities:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set up the host environment and deployment resources.&lt;/li&gt;
&lt;li&gt;Configure Azure Container Registry for a secure connection with Azure Container Apps.&lt;/li&gt;
&lt;li&gt;Create and configure a container app in Azure Container Apps.&lt;/li&gt;
&lt;li&gt;Configure continuous integration using an Azure pipeline.&lt;/li&gt;
&lt;li&gt;Configure traffic-splitting and revision management.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;To set up the host environment and deployment resources, you complete the following tasks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configure host environment tools.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Install Docker Desktop.&lt;/li&gt;
&lt;li&gt;Install Visual Studio Code with Docker and Azure App Service extensions.&lt;/li&gt;
&lt;li&gt;Install Azure CLI with &lt;code&gt;containerapp&lt;/code&gt; extension.&lt;/li&gt;
&lt;li&gt;Install Windows PowerShell.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2.Configure Azure resources that support the container apps solution.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure a Resource Group.&lt;/li&gt;
&lt;li&gt;Configure a Virtual Network and subnets.&lt;/li&gt;
&lt;li&gt;Configure Service Bus.&lt;/li&gt;
&lt;li&gt;Configure Azure Container Registry.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3.Configure app and deployment resources that support the container apps solution.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a WebAPI app and publish to a GitHub repository.&lt;/li&gt;
&lt;li&gt;Create Docker image and push to Azure Container Registry.&lt;/li&gt;
&lt;li&gt;Configure an Azure DevOps project and starter pipeline.&lt;/li&gt;
&lt;li&gt;Deploy a self-hosted Windows agent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install Docker Desktop
&lt;/h2&gt;

&lt;p&gt;Complete the following steps to install Docker Desktop.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open a browser window, and then navigate to the Docker Desktop install page: &lt;a href="https://docs.docker.com/desktop/install/windows-install/" rel="noopener noreferrer"&gt;https://docs.docker.com/desktop/install/windows-install/&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Links to instructions for Mac and Linux installs are available on this page.&lt;/p&gt;

&lt;p&gt;2.Ensure that you're working on a computer that meets system requirements.&lt;/p&gt;

&lt;p&gt;3.Follow the online instructions to install Docker Desktop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install the .NET Software Development Kit
&lt;/h2&gt;

&lt;p&gt;Complete the following steps to install the .NET Software Development Kit (SDK).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open a browser window, and then navigate to the .NET download page: &lt;a href="https://dotnet.microsoft.com/download" rel="noopener noreferrer"&gt;https://dotnet.microsoft.com/download&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;2.On the &lt;strong&gt;Download .NET&lt;/strong&gt; page, select the latest Long Term Support (LTS) version of the .NET SDK.&lt;/p&gt;

&lt;p&gt;3.Wait for the installer file to finish downloading, and then run the .NET SDK installer file.&lt;/p&gt;

&lt;p&gt;On a Windows PC, you can find your Downloads folder using File Explorer. Double-click the installation file to begin the installation process.&lt;/p&gt;

&lt;p&gt;4.On the .NET SDK Installer window, select Install.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install Visual Studio Code with Docker and Azure App Service extensions
&lt;/h2&gt;

&lt;p&gt;Complete the following steps to install Visual Studio Code with Docker and Azure App Service extensions.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open a browser window, and then navigate to: &lt;a href="https://code.visualstudio.com" rel="noopener noreferrer"&gt;https://code.visualstudio.com&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;2.In the browser window, select &lt;strong&gt;Download for Windows&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Download page for Visual Studio Code automatically detects your operating system. It displays the version to download for your operating system, such as Linux, macOS, or Windows.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;3.Wait for the installer file to finish downloading, and then use a file explorer application to navigate to your computer’s downloads folder.&lt;/p&gt;

&lt;p&gt;4.In your file explorer application, select and run the Visual Studio Code installer file.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can install Visual Studio Code using either the User Installer or System Installer. The User Installer installs Visual Studio Code just for the current user, while the System Installer installs Visual Studio Code for all users. The User Installer is the recommended option for most users.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;5.Select &lt;strong&gt;I accept the license agreement&lt;/strong&gt;, and then continue following the online instructions to complete the installation.&lt;/p&gt;

&lt;p&gt;Accept the default options during the remainder of the installation.&lt;/p&gt;

&lt;p&gt;6.Ensure that you have Visual Studio Code open.&lt;/p&gt;

&lt;p&gt;7.On the &lt;strong&gt;Activity bar&lt;/strong&gt;, select &lt;strong&gt;Extensions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;8.In the &lt;strong&gt;Search Extensions in Marketplace&lt;/strong&gt; textbox, enter &lt;strong&gt;C#&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Entering "C#" filters the list of extensions to show only the extensions that have something to do with C# coding.&lt;/p&gt;

&lt;p&gt;9.In the filtered list of available extensions, select the extension labeled "&lt;strong&gt;C# Dev Kit&lt;/strong&gt; - Official C# extension from Microsoft" that's published by Microsoft.&lt;/p&gt;

&lt;p&gt;10.To install the extension, select &lt;strong&gt;Install&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;11.Wait for the installation to complete.&lt;/p&gt;

&lt;p&gt;12.On the &lt;strong&gt;EXTENSIONS&lt;/strong&gt; view, replace &lt;strong&gt;C#&lt;/strong&gt; with &lt;strong&gt;docker&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;13.In the filtered list of available extensions, select the extension labeled &lt;strong&gt;Docker&lt;/strong&gt; that's published by Microsoft.&lt;/p&gt;

&lt;p&gt;14.To install the extension, select &lt;strong&gt;Install&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;15.Wait for the installation to complete.&lt;/p&gt;

&lt;p&gt;16.On the &lt;strong&gt;EXTENSIONS&lt;/strong&gt; view, replace &lt;strong&gt;docker&lt;/strong&gt; with &lt;strong&gt;azure app service&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;17.In the filtered list of available extensions, select the extension labeled &lt;strong&gt;Azure App Service&lt;/strong&gt; that's published by Microsoft.&lt;/p&gt;

&lt;p&gt;18.To install the extension, select &lt;strong&gt;Install&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;19.Wait for the installation to complete.&lt;/p&gt;

&lt;p&gt;20.Close Visual Studio Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install Azure CLI and the &lt;code&gt;containerapp&lt;/code&gt; extension
&lt;/h2&gt;

&lt;p&gt;Complete the following steps install Azure CLI and the &lt;code&gt;containerapp&lt;/code&gt; extension.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open a browser window, and then navigate to: /cli/azure/install-azure-cli.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can use any browser, such as the Microsoft Edge browser or the Chrome browser.&lt;/p&gt;

&lt;p&gt;2.In the browser window, follow the instructions for installing/updating Azure CLI for your computer's operating system.&lt;/p&gt;

&lt;p&gt;The current version of the Azure CLI is 2.65.0. For information about the latest release, see the release notes. To find your installed version and see if you need to update, run &lt;code&gt;az version&lt;/code&gt;. You can run &lt;code&gt;az upgrade&lt;/code&gt; to install the latest version.&lt;/p&gt;

&lt;p&gt;3.Open a command line or terminal application, such as Windows Command Prompt.&lt;/p&gt;

&lt;p&gt;4.Sign in to Azure using the &lt;code&gt;az login&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;5.Follow the prompts to complete the authentication process.&lt;/p&gt;

&lt;p&gt;6.Install the Azure Container Apps extension using the &lt;code&gt;az extension add --name containerapp --upgrade&lt;/code&gt; command.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install Microsoft PowerShell
&lt;/h2&gt;

&lt;p&gt;Complete the following steps to install Microsoft PowerShell.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open a browser window, and then navigate to: /powershell/scripting/install/installing-powershell.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;2.In the browser window, follow the instructions for installing/updating PowerShell for your computer's operating system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure a Resource Group for your Azure resources
&lt;/h2&gt;

&lt;p&gt;Complete the following steps to configure a resource group for your Azure resources.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;NOTE: I used &lt;code&gt;North Europe&lt;/code&gt; in place of &lt;code&gt;Central US&lt;/code&gt; in this article and 2026 in place of 2003.&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open a browser window, and then navigate to the Azure portal: &lt;a href="https://portal.azure.com/" rel="noopener noreferrer"&gt;https://portal.azure.com/&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;2.Ensure that your Azure account has permission to create resources and assign RBAC permissions. Check the RBAC role(s) assigned to your account before you continue.&lt;/p&gt;

&lt;p&gt;The Contributor role isn't able to assign Azure RBAC permissions. We recommend using an account that has been assigned the Owner, Azure account administrator, or Azure co-administrator role for your Azure subscription. Other role combinations could provide sufficient access to complete this guided project module but have not been tested.&lt;/p&gt;

&lt;p&gt;3.On the top search bar of the Azure portal, in the Search textbox, enter &lt;strong&gt;resource group&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fske1dfxk36ngmk0px6kg.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%2Fske1dfxk36ngmk0px6kg.png" alt="rg" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.In the search results, select &lt;strong&gt;Resource groups&lt;/strong&gt;, and then select &lt;strong&gt;+ Create&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz7jcqo22n0gebjcissx1.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%2Fz7jcqo22n0gebjcissx1.png" alt="rg" width="799" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.On the Basics tab, configure the resource group as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Subscription: Specify the Azure subscription that you're using to complete the guided project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resource group: Enter &lt;strong&gt;RG1&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Region: Select &lt;strong&gt;Central US&lt;/strong&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;You can choose any region that offers the azure services required.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;6.Select &lt;strong&gt;Review + create&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdu01xb0fky5gj35qy019.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%2Fdu01xb0fky5gj35qy019.png" alt="create" width="800" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.Once validation has passed, select &lt;strong&gt;Create&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4beia232aw5zw1lehcc4.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%2F4beia232aw5zw1lehcc4.png" alt="create" width="800" height="891"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8.Verify &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%2Fb9a2u0squft3mxbh5c8k.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%2Fb9a2u0squft3mxbh5c8k.png" alt="verify" width="800" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure a Virtual Network and subnets
&lt;/h2&gt;

&lt;p&gt;Complete the following steps to configure a Virtual Network and subnets.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ensure that you have your Azure portal open in a browser window.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;2.On the top search bar of the Azure portal, in the Search textbox, enter &lt;strong&gt;virtual network&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;3.In the search results, select &lt;strong&gt;Virtual networks&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbcrjzv3w7jtp8lppkvxx.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%2Fbcrjzv3w7jtp8lppkvxx.png" alt="vn" width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.Select &lt;strong&gt;Create virtual network&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F23afs5z0r0frxovbhf02.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%2F23afs5z0r0frxovbhf02.png" alt="vn" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.On the Basics tab, configure your virtual network as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subscription: Ensure that the Azure subscription that you're using for this guided project is selected.&lt;/li&gt;
&lt;li&gt;Resource group name: Select &lt;strong&gt;RG1&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Virtual network name: Enter &lt;strong&gt;VNET1&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Region: Ensure that Central US is selected.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjv7thqs1m8ae2wjxmwsh.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%2Fjv7thqs1m8ae2wjxmwsh.png" alt="basic" width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.Select the &lt;strong&gt;Address space&lt;/strong&gt; tab.&lt;/p&gt;

&lt;p&gt;7.On the Address space tab, under &lt;strong&gt;Subnets&lt;/strong&gt;, select &lt;strong&gt;default&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs8r6zr1bbaa2l036jgqd.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%2Fs8r6zr1bbaa2l036jgqd.png" alt="default" width="800" height="707"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8.On the Edit subnet page, configure the subnet as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: Enter &lt;code&gt;**PESubnet**&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Starting address: Ensure that &lt;strong&gt;10.0.0.0&lt;/strong&gt; is specified.&lt;/li&gt;
&lt;li&gt;Subnet size: Ensure that &lt;strong&gt;/24 (256 addresses)&lt;/strong&gt; is specified.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;9.Select &lt;strong&gt;Save&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fc1yznzoyara3s2rkg0n2.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%2Fc1yznzoyara3s2rkg0n2.png" alt="save" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;10.On the Address space tab, select &lt;strong&gt;+ Add a subnet&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz6vizudanbvrv5zek6l9.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%2Fz6vizudanbvrv5zek6l9.png" alt="subnet" width="800" height="669"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;11.On the Add a subnet page, configure the subnet as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Name: Enter &lt;code&gt;**ACASubnet**&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Starting address: Ensure that &lt;strong&gt;10.0.4.0&lt;/strong&gt; is specified.&lt;/li&gt;
&lt;li&gt;Subnet size: Ensure that &lt;strong&gt;/23 (512 addresses)&lt;/strong&gt; is specified.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;12.Select &lt;strong&gt;Add&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzbwmbq6t76gcf0v0q4fv.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%2Fzbwmbq6t76gcf0v0q4fv.png" alt="add" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;13.Select &lt;strong&gt;Review + create&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F854t4tq25ihfcvsxx86j.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%2F854t4tq25ihfcvsxx86j.png" alt="review" width="800" height="690"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;14.Once validation has passed, select &lt;strong&gt;Create&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7y1n6mgdx913tqilpob0.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%2F7y1n6mgdx913tqilpob0.png" alt="create" width="800" height="824"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;15.Wait for the deployment to complete.&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%2Fjayho4k6jnf8yg0xh31z.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%2Fjayho4k6jnf8yg0xh31z.png" alt="complete" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure Service Bus
&lt;/h2&gt;

&lt;p&gt;Complete the following steps to configure a Service Bus instance.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ensure that you have your Azure portal open in a browser window.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;2.On the top search bar of the Azure portal, in the Search textbox, enter &lt;strong&gt;service bus&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;3.In the search results, select &lt;strong&gt;Service Bus&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqqbwtrvfspbcmf9ii2gn.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%2Fqqbwtrvfspbcmf9ii2gn.png" alt="sb" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.Select &lt;strong&gt;Create service bus namespace&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm6zk0drseia4d55y0bsd.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%2Fm6zk0drseia4d55y0bsd.png" alt="sbns" width="800" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.On the Basics tab, configure your Service bus namespace as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Subscription: Ensure that the Azure subscription that you're using for this guided project is selected.&lt;/li&gt;
&lt;li&gt;Resource group name: Select &lt;strong&gt;RG1&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Namespace name: Enter &lt;strong&gt;sb-az2003&lt;/strong&gt;- followed by your name or initials. For example: &lt;strong&gt;sb-az2003-cah&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Location: Ensure that &lt;strong&gt;Central US&lt;/strong&gt; is selected.&lt;/li&gt;
&lt;li&gt;Pricing tier: Select &lt;strong&gt;Basic&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;6.Select &lt;strong&gt;Review + create&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk315jk160fchnwjg51w5.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%2Fk315jk160fchnwjg51w5.png" alt="rnc" width="800" height="653"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.Once the Validation succeeded message appears, select &lt;strong&gt;Create&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdxu0ezw74ybmhymslp11.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%2Fdxu0ezw74ybmhymslp11.png" alt="create" width="800" height="876"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8.Wait for the deployment to complete.&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%2Foaebf3sgayw881f5szi3.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%2Foaebf3sgayw881f5szi3.png" alt="deploy" width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure Azure Container Registry
&lt;/h2&gt;

&lt;p&gt;Complete the following steps to configure a Container Registry instance.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ensure that you have your Azure portal open in a browser window.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;2.On the top search bar of the Azure portal, in the Search textbox, enter &lt;strong&gt;container registry&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;3.In the search results, select &lt;strong&gt;Container registries&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi4s3u4wyx24lefyebyvk.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%2Fi4s3u4wyx24lefyebyvk.png" alt="cr" width="800" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.On the Container registries page, select &lt;strong&gt;Create container registry or + Create&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh0q0f6ufhmlyyf8ni1qj.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%2Fh0q0f6ufhmlyyf8ni1qj.png" alt="create" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.On the Basics tab of the Create container registry page, specify the following information:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The name of your Registry must be unique. Also, the Premium tier is required for private link with private endpoints.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Subscription: Ensure that the Azure subscription that you're using for this guided project is selected.&lt;/li&gt;
&lt;li&gt;Resource group: Select &lt;strong&gt;RG1&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Registry name: Enter &lt;strong&gt;acraz2003&lt;/strong&gt; followed by your initials and date. For example: &lt;strong&gt;acraz2003cah25oct&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Location: Ensure that &lt;strong&gt;Central US&lt;/strong&gt; is selected.&lt;/li&gt;
&lt;li&gt;SKU: Select &lt;strong&gt;Premium&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There is a daily fee associated with the Premium tier. You are responsible for the cost of the Azure resources that you use during this guided project. For more information, see the Azure Container Registry pricing page: &lt;a href="https://azure.microsoft.com/pricing/details/container-registry/" rel="noopener noreferrer"&gt;https://azure.microsoft.com/pricing/details/container-registry/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;6.Select &lt;strong&gt;Review + create&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyjf43p7muwjyu52aywsc.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%2Fyjf43p7muwjyu52aywsc.png" alt="rnc" width="799" height="653"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.Select &lt;strong&gt;Create&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa8zh3kqw8lk0cplz4b0c.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%2Fa8zh3kqw8lk0cplz4b0c.png" alt="create" width="800" height="695"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8.After the deployment has completed, open the deployed resource.&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%2Ftrfasiygfl74oxpf15zz.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%2Ftrfasiygfl74oxpf15zz.png" alt="deploy" width="800" height="614"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;9.On the left-side menu, under Settings, select &lt;strong&gt;Networking.&lt;/strong&gt;&lt;br&gt;
10.On the Networking page, on the Public access tab, ensure that &lt;strong&gt;All networks&lt;/strong&gt; is selected.&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%2Ftz8nj4pojc26xquvtd6l.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%2Ftz8nj4pojc26xquvtd6l.png" alt="network" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;11.On the left-side menu, under Settings, select &lt;strong&gt;Properties&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;12.On the Properties page, select &lt;strong&gt;Admin user&lt;/strong&gt;, and then select &lt;strong&gt;Save&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq7e492rjuhis4b9fb3fn.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%2Fq7e492rjuhis4b9fb3fn.png" alt="adminuser" width="799" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a WebAPI app and publish to a GitHub repository
&lt;/h2&gt;

&lt;p&gt;Complete the following steps to create a WebAPI app and publish to a GitHub repository.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Visual Studio Code.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;2.On the File menu, select &lt;strong&gt;Open Folder&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff0ro725jv9vk9vubicr6.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%2Ff0ro725jv9vk9vubicr6.png" alt="folder" width="800" height="741"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.Create a new folder named &lt;strong&gt;AZ2003&lt;/strong&gt; in a location that is easy to find.&lt;/p&gt;

&lt;p&gt;For example, create a folder named &lt;strong&gt;AZ2003&lt;/strong&gt; on the Windows Desktop.&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%2F0w59rrf2nipd5hh9e8f5.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%2F0w59rrf2nipd5hh9e8f5.png" alt="newfolder" width="800" height="635"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.On the Terminal menu, select &lt;strong&gt;New Terminal&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmp0gqs76q06x6t2cbvow.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%2Fmp0gqs76q06x6t2cbvow.png" alt="newterminal" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.At the terminal command prompt, to create a new ASP.NET Web API project, enter the following command:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;.NET CLI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dotnet new webapi --no-https&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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%2Fu2vx9ixkj0sdvmyz0cz8.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%2Fu2vx9ixkj0sdvmyz0cz8.png" alt=".net" width="800" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.At the terminal command prompt, run the following dotnet CLI&lt;br&gt;
command:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;.NET CLI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dotnet build&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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%2Fwmq9juxui6bwmhogcrh6.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%2Fwmq9juxui6bwmhogcrh6.png" alt=".build" width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.On the View menu, select &lt;strong&gt;Command Palette&lt;/strong&gt;, and then run the following command: &lt;strong&gt;.NET: Generate Assets for Build and Debug&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9kt92j7jjgbqqjyksk2j.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%2F9kt92j7jjgbqqjyksk2j.png" alt="cp" width="799" height="555"&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%2Fv256gfer3ff1p9zhktu8.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%2Fv256gfer3ff1p9zhktu8.png" alt="bnd" width="800" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the command generates an error message, select &lt;strong&gt;OK&lt;/strong&gt;, and then run the command again.&lt;/p&gt;

&lt;p&gt;8.In the root project folder, create a .gitignore file that contains the following information:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;gitignore&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;[Bb]in/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;[Oo]bj/&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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%2Fwxd4oh0ncsdgx842di68.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%2Fwxd4oh0ncsdgx842di68.png" alt="gitig" width="710" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;9.On the File menu, select &lt;strong&gt;Save All&lt;/strong&gt; or &lt;code&gt;Ctrl + s&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;10.Open the Source Control view.&lt;/p&gt;

&lt;p&gt;11.Select &lt;strong&gt;Publish to GitHub.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;12.If prompted, to enable the GitHub extension to sign in using GitHub, select &lt;strong&gt;Allow&lt;/strong&gt;, and then provide authorization in GitHub.&lt;/p&gt;

&lt;p&gt;13.In Visual Studio Code, select &lt;strong&gt;Publish to GitHub public repository&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8c8labm6vv3446ycvdgo.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%2F8c8labm6vv3446ycvdgo.png" alt="publish" width="799" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;14.Ensure that the &lt;strong&gt;bin&lt;/strong&gt; and &lt;strong&gt;obj&lt;/strong&gt; folders are not included in the repository.&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%2Ffau610fbjmba36odp7hb.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%2Ffau610fbjmba36odp7hb.png" alt="binnobj" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Docker image and push to Azure Container Registry
&lt;/h2&gt;

&lt;p&gt;Complete the following steps to create a Docker image and push the image to your Azure Container Registry.&lt;/p&gt;

&lt;p&gt;1.Ensure that you have your AZ2003 code project open in Visual Studio Code.&lt;/p&gt;

&lt;p&gt;2.To create a Dockerfile, run the following command in the Command Palette: &lt;strong&gt;Docker: Add Docker Files to Workspace&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Froxnuwvm978847ze2sky.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%2Froxnuwvm978847ze2sky.png" alt="dockerfile" width="798" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.When prompted, specify the following information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application Platform: &lt;strong&gt;.NET ASP.NET Core&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Operating System: &lt;strong&gt;Linux&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Ports: &lt;strong&gt;5000&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Docker Compose files: &lt;strong&gt;No&lt;/strong&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9phtywbaejfpgf4wcokn.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%2F9phtywbaejfpgf4wcokn.png" alt="viewdf" width="799" height="453"&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%2Fszfb0xqs9fjg7eglhtbu.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%2Fszfb0xqs9fjg7eglhtbu.png" alt="commit" width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.At a terminal command prompt, run the following docker CLI command:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Azure CLI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker build --tag aspnetcorecontainer:latest .&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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%2F9en3rei7ms7o3byd9iys.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%2F9en3rei7ms7o3byd9iys.png" alt="dockerbuild" width="800" height="591"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The syntax for the build command is: &lt;code&gt;docker build --tag &amp;lt;image name&amp;gt;:&amp;lt;image tag&amp;gt;&lt;/code&gt; .&lt;/p&gt;

&lt;p&gt;This command builds a container image that is hosted by Docker and accessible using the Docker extension for VS Code.&lt;/p&gt;

&lt;p&gt;5.Wait for the Docker Build command to complete.&lt;/p&gt;

&lt;p&gt;6.Open the Visual Studio Code Command Palette, and then run the following command: &lt;strong&gt;Docker Images: Push&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy8d76kc5y87iwivscbr9.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%2Fy8d76kc5y87iwivscbr9.png" alt="dockerpush" width="799" height="396"&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%2Fyp84xn84lhwv1q6vzn5n.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%2Fyp84xn84lhwv1q6vzn5n.png" alt="dockerpush" width="799" height="302"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.When the command runs, enter the following information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Select the docker image name that you created: &lt;code&gt;aspnetcorecontainer&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the image tag that you created: &lt;code&gt;latest&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;8.If you see a message stating that no registry is connected, select &lt;strong&gt;Connect Registry&lt;/strong&gt;, and then enter the following information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Registry provider: Select &lt;strong&gt;Azure&lt;/strong&gt;. Follow the online instructions to verify your Azure account if needed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Azure subscription: Select the Azure Subscription that you're using for this guided project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select your Azure Container Registry resource. For example: &lt;strong&gt;acraz2003cah25oct&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An image tag is generated. For example: &lt;code&gt;acraz2003cah12oct.azurecr.io/aspnetcorecontainer:latest&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To push the image to your Container Registry, press Enter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The following Docker command is executed:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Azure CLI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;docker image push acraz2003cah12oct.azurecr.io/aspnetcorecontainer:latest&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;9.Wait for the image to be pushed to your Azure Container Registry.&lt;/p&gt;

&lt;p&gt;You can verify via Docker Desktop.&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%2Fom7nlr11bl3xpia75642.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%2Fom7nlr11bl3xpia75642.png" alt="docker" width="800" height="82"&gt;&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;10.Open the Source Control view, and then &lt;strong&gt;Commit&lt;/strong&gt; and &lt;strong&gt;Sync&lt;/strong&gt; your file updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure Azure DevOps and a starter Pipeline
&lt;/h2&gt;

&lt;p&gt;Complete the following steps to configure Azure DevOps and a starter Pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the Azure portal.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;2.On the top search bar, in the Search textbox, enter &lt;strong&gt;devops&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;3.In the search results, select &lt;strong&gt;Azure DevOps organizations&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F18wevmbk7a1j8c94rcw7.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%2F18wevmbk7a1j8c94rcw7.png" alt="azuredevops" width="799" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.Select &lt;strong&gt;My Azure DevOps Organizations&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;5.If you haven’t created an organization, select &lt;strong&gt;Free&lt;/strong&gt; or &lt;strong&gt;Create new organization&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F22eg1ll8on5s52u74f9c.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%2F22eg1ll8on5s52u74f9c.png" alt="create new organization" width="800" height="603"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.On the home page of your organization, in the lower-left corner of the page, select &lt;strong&gt;Organization settings&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1z3afb7silm9wio556cb.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%2F1z3afb7silm9wio556cb.png" alt="org setting" width="799" height="659"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.On the left side menu under &lt;strong&gt;Security&lt;/strong&gt;, select &lt;strong&gt;Policies&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;8.Ensure that the &lt;strong&gt;Allow public projects&lt;/strong&gt; policy is set to &lt;strong&gt;On&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;9.Return to the home page of your organization.&lt;/p&gt;

&lt;p&gt;10.To create a new project, select &lt;strong&gt;New project&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkvl9dgthmfretexmxidm.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%2Fkvl9dgthmfretexmxidm.png" alt="newproject" width="799" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you created a new organization, you may see the &lt;strong&gt;Create a project to get started&lt;/strong&gt; page.&lt;/p&gt;

&lt;p&gt;11.On the Create new project page, specify the following information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project name: &lt;strong&gt;Project1&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Description: &lt;strong&gt;AZ-2003 project&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Visibility: &lt;strong&gt;Public&lt;/strong&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmqw7t1qzrc15omo65i0i.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%2Fmqw7t1qzrc15omo65i0i.png" alt="public" width="799" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;12.On the Create new project page, select &lt;strong&gt;New project&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fq3lmz7mdl2x3r3dbuv06.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%2Fq3lmz7mdl2x3r3dbuv06.png" alt="new project" width="799" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;13.On the left-side menu, select &lt;strong&gt;Repos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;14.Under Import a repository, select &lt;strong&gt;Import&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjn2f3b0vxrm1fdn0jb33.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%2Fjn2f3b0vxrm1fdn0jb33.png" alt="import" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;15.On the Import a Git repository page, enter the URL for the GitHub repository you created for your code project, and then select &lt;strong&gt;Import&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Your repository URL should be similar to the following example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://github.com/&amp;lt;your account&amp;gt;/AZ2003&lt;/code&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%2Flvsfu9by3p0m4vhp1ki4.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%2Flvsfu9by3p0m4vhp1ki4.png" alt="Import" width="583" height="898"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;16.On the left-side menu, select &lt;strong&gt;Pipelines&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3p755kk74ptmonf8q5s0.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%2F3p755kk74ptmonf8q5s0.png" alt="pipeline" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;17.Select &lt;strong&gt;Create Pipeline&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkc8f6xqen1ql3erufgkf.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%2Fkc8f6xqen1ql3erufgkf.png" alt="createpipeline" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;18.Select &lt;strong&gt;Azure Repos Git&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7ihs3rv3lynohx4hcpbx.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%2F7ihs3rv3lynohx4hcpbx.png" alt="zurerepogit" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;19.On the Select a repository page, select &lt;strong&gt;Project1&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftvydewqgxzmjx8ycx4nv.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%2Ftvydewqgxzmjx8ycx4nv.png" alt="project1" width="799" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;20.Select Starter pipeline.&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%2F0dumno7c3bw7ar5hzlaf.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%2F0dumno7c3bw7ar5hzlaf.png" alt="starterpl" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;21.Under Save and Run, select Save, and then select &lt;strong&gt;Save&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1vmlze1s0ytx147mavqf.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%2F1vmlze1s0ytx147mavqf.png" alt="savenrun" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;22.To rename the pipeline to &lt;code&gt;Pipeline1&lt;/code&gt;, complete the following steps:&lt;/p&gt;

&lt;p&gt;a.On the left-side menu, select &lt;strong&gt;Pipelines&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;b.To the right of the Project1 pipeline, select &lt;strong&gt;More options&lt;/strong&gt;, and then select &lt;strong&gt;Rename/move&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff3wdycs9xzz8iu92ugpl.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%2Ff3wdycs9xzz8iu92ugpl.png" alt="rename" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;c.In the Rename/move pipeline dialog, under Name, enter &lt;strong&gt;Pipeline1&lt;/strong&gt; and then select &lt;strong&gt;Save&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftlzvwimw1wjq866wz6ak.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%2Ftlzvwimw1wjq866wz6ak.png" alt="save" width="800" height="340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note&lt;/p&gt;

&lt;p&gt;Don't run the pipeline now. You will configure this pipeline during the project exercises.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd24x7ihsay4f95ujzsgl.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%2Fd24x7ihsay4f95ujzsgl.png" alt="renamedpl" width="799" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy a self-hosted Windows agent
&lt;/h2&gt;

&lt;p&gt;For an Azure Pipeline to build and deploy Windows, Azure, and other Visual Studio solutions you need at least one Windows agent in the host environment.&lt;/p&gt;

&lt;p&gt;Complete the following steps to deploy a self-hosted Windows agent:&lt;/p&gt;

&lt;p&gt;1.Ensure that you're signed-in to Azure DevOps with the user account you're using for your Azure DevOps organization.&lt;/p&gt;

&lt;p&gt;For example: &lt;code&gt;https://dev.azure.com/{your organization}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;2.From the home page of your organization, open your user settings, and then select &lt;strong&gt;Personal access tokens&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh8mbxcxxcorei4qdi72y.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%2Fh8mbxcxxcorei4qdi72y.png" alt="PAT" width="800" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.To create a personal access token, select &lt;strong&gt;+ New Token&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8hpipengst90cx1totk8.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%2F8hpipengst90cx1totk8.png" alt="newtoken" width="799" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.Under Name, enter &lt;strong&gt;AZ2003&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;5.At the bottom of the Create a new personal access token window, to see the complete list of scopes, select &lt;strong&gt;Show all scopes&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3q3be31pxfptonj3pv2c.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%2F3q3be31pxfptonj3pv2c.png" alt="newPAT" width="800" height="713"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.For the custom designed scope, select &lt;strong&gt;Agent Pools (Read &amp;amp; manage) and Deployment Groups (Read &amp;amp; manage).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ensure that all the other boxes are cleared.&lt;/p&gt;

&lt;p&gt;7.Select &lt;strong&gt;Create&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F91vqiefo3z6d06jm64vt.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%2F91vqiefo3z6d06jm64vt.png" alt="create" width="800" height="706"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8.On the Success page, to copy the token, select &lt;strong&gt;Copy to clipboard&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk7u74nk0z3nmzu5l5oc4.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%2Fk7u74nk0z3nmzu5l5oc4.png" alt="cpPAT" width="651" height="917"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You use this token when you configure the agent.&lt;/p&gt;

&lt;p&gt;9.Ensure that you're signed into Azure DevOps as the Azure DevOps organization owner.&lt;/p&gt;

&lt;p&gt;10.Select your DevOps organization, and then select &lt;strong&gt;Organization settings&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;11.On the left side menu under Pipelines, select &lt;strong&gt;Agent pools&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;12.If the &lt;strong&gt;Get the agent&lt;/strong&gt; dialog box opens, skip to the next step.&lt;/p&gt;

&lt;p&gt;If a list of Agent pools is displayed, complete the following steps:&lt;/p&gt;

&lt;p&gt;a. To select the default pool, select &lt;strong&gt;Default&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3kqumnxqbbyg08v00lqz.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%2F3kqumnxqbbyg08v00lqz.png" alt="defaultagentpool" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the Default pool doesn't exist, select &lt;strong&gt;Add pool&lt;/strong&gt;, and then enter the following information:&lt;/p&gt;

&lt;p&gt;i.Under Pool type, select &lt;strong&gt;Self-hosted&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;ii.Under Name, enter &lt;strong&gt;default&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;iii.Select &lt;strong&gt;Create.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;iv.To open the pool that you just created, select &lt;strong&gt;default&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;b.Select Agents, and then select &lt;strong&gt;New agent&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxl8l1ow518ljxjyyd5ic.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%2Fxl8l1ow518ljxjyyd5ic.png" alt="newagent" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;13.On the &lt;strong&gt;Get the agent&lt;/strong&gt; dialog box, complete the following steps:&lt;/p&gt;

&lt;p&gt;a.Select the &lt;strong&gt;Windows&lt;/strong&gt; tab.&lt;/p&gt;

&lt;p&gt;b.On the left pane, select the processor architecture of the installed Windows OS version on your machine.&lt;/p&gt;

&lt;p&gt;The x64 agent version is intended for 64-bit Windows, whereas the x86 version is intended for 32-bit Windows.&lt;/p&gt;

&lt;p&gt;c.On the right pane, select &lt;strong&gt;Download&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdgytzflxrllb55l8stqg.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%2Fdgytzflxrllb55l8stqg.png" alt="download" width="799" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;d.Follow the instructions to download the agent.&lt;/p&gt;

&lt;p&gt;14.Use File Explorer to create the following folder location for the agent:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;dos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;C:\agents&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;15.Unpack the agent zip file into the directory you created.&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%2Fvgyxay0u2s6duq8k0bcy.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%2Fvgyxay0u2s6duq8k0bcy.png" alt="extract" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;16.Open PowerShell as an Administrator.&lt;/p&gt;

&lt;p&gt;17.Navigate to the "C:\agents" directory, and then enter the following PowerShell command:&lt;/p&gt;

&lt;p&gt;.\config`&lt;/p&gt;

&lt;p&gt;18.Respond to the configuration prompts as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enter server URL &amp;gt;: enter the URL for your DevOps organization. Such as: &lt;code&gt;https://dev.azure.com/&amp;lt;your organization&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Enter authentication type (press enter for PAT) &amp;gt;: press Enter.&lt;/li&gt;
&lt;li&gt;Enter personal access token &amp;gt;: Paste-in the personal access token that you copied to the clipboard earlier.&lt;/li&gt;
&lt;li&gt;Enter agent pool (press enter for default) &amp;gt;: press Enter.&lt;/li&gt;
&lt;li&gt;Enter agent name (press enter for YOUR-PC-NAME) &amp;gt; enter &lt;strong&gt;az2003-agent&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter work folder (press enter for _work) &amp;gt;: press Enter.&lt;/li&gt;
&lt;li&gt;Enter run agent as service? (Y/N) (press enter for N) &amp;gt;: enter &lt;strong&gt;Y&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter enable SERVICE_SID_TYPE_UNRESTRICTED for agent service (Y/N) (press enter for N) &amp;gt;: enter &lt;strong&gt;Y&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter User account to use for the service (press enter for NT AUTHORITY\NETWORK SERVICE) &amp;gt;: press Enter.&lt;/li&gt;
&lt;li&gt;Enter whether to prevent service starting immediately after configuration is finished? (Y/N) (press enter for N) &amp;gt;: press Enter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A message informing you that the agent started successfully is displayed.&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%2Ffh2ticalt5ocvgk4d3ld.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%2Ffh2ticalt5ocvgk4d3ld.png" alt="deployed" width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Cloud and DevOps practitioner building hands-on Azure skills through a five-part project on Azure Container Apps.&lt;/p&gt;

&lt;p&gt;This series follows a proof-of-concept scenario: a team running containers on AKS evaluates Azure Container Apps to reduce complexity and cost. Part 1 covers the foundation:&lt;/p&gt;

&lt;p&gt;Provisioned Azure resources, including a Resource Group, a Virtual Network with segmented subnets, Service Bus, and Azure Container Registry&lt;br&gt;
Created an ASP.NET Core Web API, containerized it with Docker, and pushed the image to Azure Container Registry&lt;br&gt;
Published the code to GitHub and imported it into Azure Repos&lt;br&gt;
Set up an Azure DevOps project with a starter pipeline and a self-hosted Windows build agent&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Coming next in the series: secure ACR-to-Container Apps connection, container app deployment, CI with Azure Pipelines, scaling, and revision management.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Skills practiced so far:
&lt;/h3&gt;

&lt;p&gt;Azure, Azure Container Registry, Azure DevOps, Docker, Azure CLI, PowerShell, .NET, GitHub, cloud networking&lt;/p&gt;

&lt;p&gt;You're now ready to begin the Guided project exercises. Good luck!&lt;/p&gt;

</description>
      <category>azure</category>
      <category>devops</category>
      <category>containers</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Promoting a Member Server to Domain Controller, Transferring FSMO Roles, and Configuring Active Directory Sites</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Tue, 15 Sep 2026 13:05:32 +0000</pubDate>
      <link>https://dev.to/rahimah_dev/promoting-a-member-server-to-domain-controller-transferring-fsmo-roles-and-configuring-active-5675</link>
      <guid>https://dev.to/rahimah_dev/promoting-a-member-server-to-domain-controller-transferring-fsmo-roles-and-configuring-active-5675</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Active Directory is essential in organizations where users, servers, and network resources must be centrally managed and securely controlled.&lt;br&gt;
As businesses expand, multiple domain controllers provide greater availability and support reliable authentication across the environment.&lt;br&gt;
FSMO roles ensure that specific Active Directory operations are managed by designated domain controllers.&lt;br&gt;
Active Directory sites and subnets also help organizations align directory services with their physical and network locations.&lt;br&gt;
In this hands-on exercise, I promoted TAILWIND-MBR1 to an additional domain controller in the existing domain.&lt;br&gt;
I then transferred the RID Master FSMO role to the new domain controller.&lt;br&gt;
I also created a Sydney Active Directory site and associated the 172.16.1.0/24 subnet with it.&lt;br&gt;
These tasks provide practical experience with domain controller deployment, FSMO administration, and Active Directory site configuration in an enterprise environment.&lt;br&gt;
In this exercise, you promote a server to domain controller, transfer a FSMO role to the new domain controller, create a site, and add a subnet to the site.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install Active Directory Domain Services (AD DS) and promote to Domain Controller
&lt;/h2&gt;

&lt;p&gt;In this task, you promote member server TAILWIND-MBR1 to become a domain controller in the TAILWINDTRADERS domain. To complete this task, perform the following steps:&lt;/p&gt;

&lt;p&gt;1.Sign in to TAILWIND-MBR1 as TAILWINDTRADERS\Administrator with the password: &lt;code&gt;Pa55w.rdPa55w.rd&lt;/code&gt;.&lt;br&gt;
2.In Server Manager, select the Manage menu and then select &lt;strong&gt;Add Roles and Features&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxyggqdcf3u3nnmgnmkb1.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%2Fxyggqdcf3u3nnmgnmkb1.png" alt="rolesnfeatures" width="632" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.On the Before you begin page of the Add Roles and Features wizard, click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&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%2Foea3r99gwfpj88lux0le.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%2Foea3r99gwfpj88lux0le.png" alt="role" width="800" height="576"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.On the Select installation type page, select &lt;strong&gt;Role-based or feature-based installation&lt;/strong&gt; and click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwa88tv8xxj1ruae26z01.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%2Fwa88tv8xxj1ruae26z01.png" alt="role-based" width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.On the Select destination server page, choose &lt;strong&gt;Select a server from the server pool&lt;/strong&gt;, ensure TAILWIND-MBR1 is selected and click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6zhndn2x9fei31if44ad.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%2F6zhndn2x9fei31if44ad.png" alt="next" width="800" height="574"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.On the Select server roles page, select the &lt;strong&gt;Active Directory Domain Services&lt;/strong&gt; checkbox.&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%2Faht2dlt9oulimzod34he.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%2Faht2dlt9oulimzod34he.png" alt="ADDS" width="799" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This opens the &lt;strong&gt;Add features&lt;/strong&gt; page. Select Add Features. Click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdh17efe2bdfx198tqn9m.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%2Fdh17efe2bdfx198tqn9m.png" alt="add features" width="799" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.On the Select features page, click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm63l23qc5q57qxxyjh7b.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%2Fm63l23qc5q57qxxyjh7b.png" alt="next" width="799" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8.On the Active Directory Domain Services page, click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F59euny1b9mu1exab5fha.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%2F59euny1b9mu1exab5fha.png" alt="ADDS" width="800" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;9.On the Confirm installation selections page, click &lt;strong&gt;Install&lt;/strong&gt;. Depending on the speed of the computer, installation may take several minutes. When the installation completes, click &lt;strong&gt;Close&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy01tip58y60h32u0wy9v.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%2Fy01tip58y60h32u0wy9v.png" alt="install" width="800" height="577"&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%2Fvmlqr8ryjsaw2hep5ca8.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%2Fvmlqr8ryjsaw2hep5ca8.png" alt="close" width="800" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;10.On the Server manager menu, select the notification icon next to the flag in the top right corner (as shown in the screenshot).&lt;/p&gt;

&lt;p&gt;11.On the menu that opens when you select the notification icon, select &lt;strong&gt;Promote this server to a domain controller&lt;/strong&gt;. This will start the Active Directory Domain Services Configuration Wizard.&lt;br&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%2F12cezk0lax7gz6lezetp.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%2F12cezk0lax7gz6lezetp.png" alt="icon" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;12.On the Deployment Configuration page, select &lt;strong&gt;Add a domain controller to an existing domain and ensure that the domain&lt;/strong&gt; name is set to &lt;strong&gt;tailwindtraders.internal.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2957uarabe1itbfeef1t.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%2F2957uarabe1itbfeef1t.png" alt="DC" width="799" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;13.You must re-authenticate the administrator account. Select &lt;strong&gt;Change&lt;/strong&gt;. Enter &lt;code&gt;Administrator&lt;/code&gt; for the user name and &lt;code&gt;Pa55w.rdPa55w.rd&lt;/code&gt; for the password. Click &lt;strong&gt;OK&lt;/strong&gt;. Click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnpdd98sr2oscgj2toh5z.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%2Fnpdd98sr2oscgj2toh5z.png" alt="change" width="799" height="453"&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%2Ff1ibn2a9wch4dljuaa99.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%2Ff1ibn2a9wch4dljuaa99.png" alt="ok" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;14.On the Domain Controller options page, accept the default settings and provide the Directory Services Restore Mode (DSRM) password. To do this, enter the following password twice: &lt;code&gt;Pa55w.rdPa55w.rd&lt;/code&gt;. Click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3z3cfkvftdvi2zb25vm1.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%2F3z3cfkvftdvi2zb25vm1.png" alt="next" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;15.On the DNS Options page, click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn0x6zrf5matbcv5ryhy8.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%2Fn0x6zrf5matbcv5ryhy8.png" alt="next" width="799" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;16.On the Additional Options page, click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdnyo78yxqryd5l8bsalw.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%2Fdnyo78yxqryd5l8bsalw.png" alt="next" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;17.On the Paths page, click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxp9vbtxrao21cbl4p8t9.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%2Fxp9vbtxrao21cbl4p8t9.png" alt="next" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;18.On the Review Options page, click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqfd2l9hyv3ftcwg2xg7g.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%2Fqfd2l9hyv3ftcwg2xg7g.png" alt="next" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;19.On the Prerequisites Check page, click &lt;strong&gt;Install&lt;/strong&gt;. The installation will take several minutes depending on the speed of the virtual machine. The virtual machine will restart.&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%2Fqg9w59nm16irw8px68b5.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%2Fqg9w59nm16irw8px68b5.png" alt="install" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;20.When the virtual machine restarts, sign in as &lt;code&gt;tailwindtraders\administrator&lt;/code&gt; with the password you configured for the default administrator account &lt;code&gt;(Pa55w.rdPa55w.rd)&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Transfer Flexible Single Master Operations Roles
&lt;/h2&gt;

&lt;p&gt;In this task, you transfer the RID Master role from TAILWIND-DC1 to TAILWIND-MBR1. To complete this task, perform the following steps:&lt;/p&gt;

&lt;p&gt;1.On TAILWIND-MBR1, under &lt;strong&gt;Tools&lt;/strong&gt; open Active Directory Users and Computers.&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%2Fb17s3hc42kdzp81ho96n.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%2Fb17s3hc42kdzp81ho96n.png" alt="tools" width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.In the navigation pane, right-click Active Directory Users and Computers, point to &lt;strong&gt;All Tasks&lt;/strong&gt;, and then select &lt;strong&gt;Operations Masters&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fep5gcuq67dn0sp5qg7fm.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%2Fep5gcuq67dn0sp5qg7fm.png" alt="users" width="800" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.On the RID tab, select &lt;strong&gt;Change&lt;/strong&gt;, select &lt;strong&gt;Yes&lt;/strong&gt;, and then click &lt;strong&gt;OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1hru6b38a1n4qovgx6py.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%2F1hru6b38a1n4qovgx6py.png" alt="change" width="800" height="562"&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%2Fkkyed7hqxuv5or4nb52f.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%2Fkkyed7hqxuv5or4nb52f.png" alt="yes" width="800" height="516"&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%2Fv9tpqb2znmtkjvpmjfe2.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%2Fv9tpqb2znmtkjvpmjfe2.png" alt="ok" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.Click &lt;strong&gt;Close&lt;/strong&gt; to close the Operations Masters dialog box.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create an Active Directory site and configure a subnet for that site
&lt;/h2&gt;

&lt;p&gt;In this task, you create an Active Directory site and configure a subnet associated with that site. To complete this task, perform the following steps:&lt;/p&gt;

&lt;p&gt;1.On TAILWIND-DC1, sign in as &lt;code&gt;tailwindtraders\administrator&lt;/code&gt; with the password you configured for the default administrator account &lt;code&gt;(Pa55w.rdPa55w.rd)&lt;/code&gt;.&lt;br&gt;
2.Open Active Directory Sites and Services from the Tools menu.&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%2Fgcpzyjwb2xqvyk7va4tq.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%2Fgcpzyjwb2xqvyk7va4tq.png" alt="sites" width="799" height="527"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.Right-click Sites, select &lt;strong&gt;New site&lt;/strong&gt;, and type &lt;code&gt;Sydney&lt;/code&gt; as the site name.&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%2Fz3lfuyt7uvtkqnsp5wgx.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%2Fz3lfuyt7uvtkqnsp5wgx.png" alt="new site" width="799" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.For the Link Name, select DEFAULTIPSITELINK and click &lt;strong&gt;OK&lt;/strong&gt; twice.&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%2Fyri3heaxywsrzgh8g9we.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%2Fyri3heaxywsrzgh8g9we.png" alt="link" width="800" height="521"&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%2Fn2kxqtin0fm8wq5inkws.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%2Fn2kxqtin0fm8wq5inkws.png" alt="ok" width="799" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.Expand the &lt;strong&gt;Sites&lt;/strong&gt; folder.&lt;br&gt;
6.Right-click &lt;strong&gt;Subnets&lt;/strong&gt; and select &lt;strong&gt;New Subnet&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9qreljgsyanrmy1xpshi.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%2F9qreljgsyanrmy1xpshi.png" alt="subnet" width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.As the Prefix, type &lt;code&gt;172.16.1.0/24&lt;/code&gt;, select &lt;strong&gt;Sydney&lt;/strong&gt; as site name and click &lt;strong&gt;OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr08ctxfxqcz8wg5sweh9.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%2Fr08ctxfxqcz8wg5sweh9.png" alt="prefix" width="800" height="524"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8.Close Active Directory Sites and Services.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;This exercise focused on expanding the Active Directory environment by promoting a member server to a domain controller.&lt;br&gt;
The RID Master FSMO role was transferred to the new domain controller to demonstrate role management.&lt;br&gt;
An Active Directory site named Sydney was also created to represent a network location.&lt;br&gt;
The 172.16.1.0/24 subnet was then associated with the Sydney site.&lt;br&gt;
Overall, the exercise provided practical experience with domain controller deployment, FSMO role administration, and Active Directory site configuration.&lt;/p&gt;

</description>
      <category>domaincontroller</category>
      <category>sysadmin</category>
      <category>activedirectory</category>
      <category>networking</category>
    </item>
    <item>
      <title>Strengthening Active Directory Security with NTLM Restrictions, Auditing, and Logon Controls</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Tue, 15 Sep 2026 11:00:45 +0000</pubDate>
      <link>https://dev.to/rahimah_dev/strengthening-active-directory-security-with-ntlm-restrictions-auditing-and-logon-controls-4e9</link>
      <guid>https://dev.to/rahimah_dev/strengthening-active-directory-security-with-ntlm-restrictions-auditing-and-logon-controls-4e9</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In a modern organization, employees rely on centralized systems every day to access computers, applications, files, and other business resources. Behind these routine activities, Active Directory helps determine who can authenticate, what they can access, and how security events are controlled and recorded.&lt;/p&gt;

&lt;p&gt;In this hands-on exercise, I strengthened an Active Directory environment by applying targeted security controls through Group Policy. I restricted NTLM authentication, enabled auditing for user account management within the Sydney organizational unit, and configured logon restrictions for members of a security group.&lt;/p&gt;

&lt;p&gt;These configurations demonstrate how organizations can reduce legacy authentication risks, improve visibility into account-related changes, and enforce tighter access controls. The exercise provided practical experience translating security requirements into Windows Server and Active Directory policies that support a more secure and auditable enterprise environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Overview
&lt;/h3&gt;

&lt;p&gt;In this exercise, you configure settings related to security including disabling NTLM authentication for domain accounts, auditing account management activity, and denying log on as a service for members of a security group.&lt;/p&gt;

&lt;p&gt;This exercise should take approximately &lt;strong&gt;10&lt;/strong&gt; minutes to complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Restrict NTLM Authentication
&lt;/h2&gt;

&lt;p&gt;In this task, you restrict NTLM authentication. To complete this task, perform the following steps in TAILWIND-DC1:&lt;/p&gt;

&lt;p&gt;1.From the Tools menu of the Server Manager console, open the Group Policy Management console.&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%2Fcy0x915zyv6p96g3quja.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%2Fcy0x915zyv6p96g3quja.png" alt="GPM" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.In the Group Policy Management console, expand the tailwindtraders.internal forest, the Domains folder, and the tailwindtraders.internal domain. Then expand Group Policy Objects.&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%2Fpo2rc32hf8iv4iezqgyg.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%2Fpo2rc32hf8iv4iezqgyg.png" alt="GPO" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.Right-click &lt;strong&gt;Default Domain Controller Policy&lt;/strong&gt; and click &lt;strong&gt;Edit&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxjpygh890uvhyd1ky6ri.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%2Fxjpygh890uvhyd1ky6ri.png" alt="Controllerpolicy" width="800" height="538"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.Navigate to Computer Configuration\Policies\Windows Settings\Security Settings\Local Policies\Security Options.&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%2Fyc7d9cr0t7osk4daea99.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%2Fyc7d9cr0t7osk4daea99.png" alt="securityopyions" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.Select and double-click &lt;strong&gt;Network security: Restrict NTLM: NTLM authentication in this domain&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzjoxgtpihj19jsvf73g2.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%2Fzjoxgtpihj19jsvf73g2.png" alt="networksecurity" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.Click the &lt;strong&gt;Define this policy setting&lt;/strong&gt; check box.&lt;br&gt;
7.Select the value &lt;strong&gt;Deny all&lt;/strong&gt; and click &lt;strong&gt;OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcwxplh9e4ik65a9c8lfc.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%2Fcwxplh9e4ik65a9c8lfc.png" alt="denyall" width="800" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8.Click &lt;strong&gt;Yes&lt;/strong&gt; in the Confirm Setting Change dialog box.&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%2Fdx8eqczb4n0mrls2n2k5.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%2Fdx8eqczb4n0mrls2n2k5.png" alt="yes" width="800" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;9.Close the Group Policy Management Editor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Audit User Account Management in Sydney
&lt;/h2&gt;

&lt;p&gt;In this task, you enable auditing of User Account Management in the Sydney OU. To complete this task, perform the following steps in TAILWIND-DC1:&lt;/p&gt;

&lt;p&gt;1.From the Tools menu of the Server Manager console, choose Group Policy Management Console.&lt;br&gt;
2.In the Group Policy Management Console, expand the Tailwindtraders.internal domain.&lt;br&gt;
3.Navigate to the Sydney OU, right-click and select &lt;strong&gt;Create a GPO in this domain, and link it here….&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F62w1oujd9dd3hmg8r5we.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%2F62w1oujd9dd3hmg8r5we.png" alt="GPO" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.Name the new GPO &lt;code&gt;SydneyOUPolicy&lt;/code&gt;.&lt;br&gt;
5.Click &lt;strong&gt;OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fj14q72hgh3dqorw0x76j.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%2Fj14q72hgh3dqorw0x76j.png" alt="sydneypolicy" width="799" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.Right-click SydneyOUPolicy and select &lt;strong&gt;Edit&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqezbcp28otrpo9nagce9.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%2Fqezbcp28otrpo9nagce9.png" alt="SOUPolicy" width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.Browse to Computer Configuration\Policies\Windows Settings\Security Settings\Advanced Audit Policy Configuration\Audit Policies\Account Management.&lt;br&gt;
8.Select and double-click &lt;strong&gt;Audit User account management&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9hm7wmuqoch9klmoglc3.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%2F9hm7wmuqoch9klmoglc3.png" alt="acctmgt" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;9.Click the &lt;strong&gt;Configure the following audit events&lt;/strong&gt; check box.&lt;br&gt;
10.Select the &lt;strong&gt;Success&lt;/strong&gt; and &lt;strong&gt;Failure&lt;/strong&gt; values and click &lt;strong&gt;OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0o6q4csbgn163k7a9zj6.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%2F0o6q4csbgn163k7a9zj6.png" alt="auditevents" width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;11.Close the Group Policy Management Editor&lt;/p&gt;

&lt;h2&gt;
  
  
  Deny Log On As a Service
&lt;/h2&gt;

&lt;p&gt;In this task, you configure the Deny Log On As A Service security option. To complete this task, perform the following steps in TAILWIND-DC1:&lt;/p&gt;

&lt;p&gt;1.From the Tools menu of the Server Manager console, open the Group Policy Management console.&lt;br&gt;
2.Expand Tailwindtraders.internal domain.&lt;br&gt;
3.Browse to the Sydney OU and right-click SydneyOUPolicy. Select &lt;strong&gt;Edit&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3phukmpy10xlucangkel.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%2F3phukmpy10xlucangkel.png" alt="sydneyOU" width="800" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.Browse to Computer Configuration\Policies\Windows Settings\Security Settings\Local Policies\User Rights Assignment.&lt;br&gt;
5.Select and double-click the &lt;strong&gt;Deny Log on as a service&lt;/strong&gt; policy.&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%2Fik4gw5rb4vr9heoulgmy.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%2Fik4gw5rb4vr9heoulgmy.png" alt="deny" width="800" height="581"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.Select the &lt;strong&gt;Define this policy&lt;/strong&gt; setting.&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%2Fbmilgfr5rx98bkjxr5ck.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%2Fbmilgfr5rx98bkjxr5ck.png" alt="policy" width="799" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.Click &lt;strong&gt;Add User or Group&lt;/strong&gt;.&lt;br&gt;
8.Click &lt;strong&gt;Browse&lt;/strong&gt;, click &lt;strong&gt;Advanced&lt;/strong&gt;, and then click &lt;strong&gt;Find now&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fenpy14976ovzeq5xlvnc.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%2Fenpy14976ovzeq5xlvnc.png" alt="adduser" 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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkgjidvuyqse47d1j8blx.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%2Fkgjidvuyqse47d1j8blx.png" alt="adv" width="799" height="592"&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%2Fyonklue2i3fy6e2vlz1n.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%2Fyonklue2i3fy6e2vlz1n.png" alt="findnow" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;9.Select &lt;strong&gt;Sydney Administrators&lt;/strong&gt; group.&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%2Fl8qneeg1srdmlwvnnfdm.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%2Fl8qneeg1srdmlwvnnfdm.png" alt="addgrp" width="800" height="609"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;10.Click &lt;strong&gt;OK&lt;/strong&gt; until dialogue boxes are closed (it may require four or five acknowledgements).&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%2Fbz2qy27taien3z70ybsa.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%2Fbz2qy27taien3z70ybsa.png" alt="ok" width="800" height="589"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;This exercise demonstrated how Group Policy can be used to implement practical security controls across an Active Directory environment. By restricting NTLM authentication, I strengthened authentication security and reduced reliance on legacy protocols. Enabling successful and failed user account management auditing improved visibility into account-related activity within the Sydney OU. Finally, configuring Deny log on as a service for the Sydney Administrators group reinforced least-privilege access and reduced unnecessary service logon exposure.&lt;/p&gt;

&lt;p&gt;Overall, the exercise provided valuable hands-on experience in Active Directory security hardening, auditing, authentication control, and Group Policy administration, these are key skills for managing secure Windows Server environments.&lt;/p&gt;

</description>
      <category>sysadmin</category>
      <category>grouppolicy</category>
      <category>identity</category>
      <category>activedirectory</category>
    </item>
    <item>
      <title>Securing Active Directory with Password Policies and Recycle Bin</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Mon, 14 Sep 2026 16:35:49 +0000</pubDate>
      <link>https://dev.to/rahimah_dev/securing-active-directory-with-password-policies-and-recycle-bin-fpm</link>
      <guid>https://dev.to/rahimah_dev/securing-active-directory-with-password-policies-and-recycle-bin-fpm</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Strong Active Directory environments require more than creating users,they require deliberate security controls.&lt;br&gt;
In this hands-on project, I strengthened domain security through practical Group Policy and Active Directory administration.&lt;br&gt;
I configured a 14-character minimum password policy across the domain.&lt;br&gt;
I then implemented a stricter 16-character fine-grained password policy specifically for Domain Admins.&lt;br&gt;
This demonstrates how security requirements can be tailored according to administrative privilege levels.&lt;br&gt;
I also enabled the Active Directory Recycle Bin to provide recovery capability for deleted directory objects.&lt;br&gt;
These configurations reflect practical measures used to improve identity security, access control, and administrative resilience.&lt;br&gt;
Together, the exercise demonstrates my ability to translate security requirements into practical Windows Server and Active Directory controls.&lt;/p&gt;

&lt;h3&gt;
  
  
  Overview
&lt;/h3&gt;

&lt;p&gt;In this exercise, you configure group policy items related to password policies. This includes configuring the domain password policy, creating a stricter password policy for the Domain Admins group, and enabling the Active Directory Recycle Bin.&lt;/p&gt;

&lt;p&gt;This exercise should take approximately &lt;strong&gt;10&lt;/strong&gt; minutes to complete.&lt;/p&gt;

&lt;h1&gt;
  
  
  Configure Domain Password Policy
&lt;/h1&gt;

&lt;p&gt;In this task, you configure the domain password policy. To complete this task, perform the following steps:&lt;/p&gt;

&lt;p&gt;1.In TAILWIND-DC1, from the Tools menu of the Server Manager console, open the Group Policy Management console.&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%2F9y21mlqaxad8xs0o5fw5.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%2F9y21mlqaxad8xs0o5fw5.png" alt="GPM" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.In the Group Policy Management console, expand the tailwindtraders.internal forest, the Domains folder, and the tailwindtraders.internal domain.&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%2Fjs54ga2lso24a9id1yqo.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%2Fjs54ga2lso24a9id1yqo.png" alt="expand" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.Right-click &lt;strong&gt;Default Domain Policy&lt;/strong&gt; and click &lt;strong&gt;Edit.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6zgo792i1uhsysrwuoz7.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%2F6zgo792i1uhsysrwuoz7.png" alt=" " width="800" height="445"&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%2Fszy0s3yt5ittcpdrowfx.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%2Fszy0s3yt5ittcpdrowfx.png" alt="policy" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.In the Group Policy Management Editor, navigate to Computer Configuration\Policies\Windows Settings\Security Settings\Account Policies\Password Policy.&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%2F5mfdh1ihfwjeck5rowrk.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%2F5mfdh1ihfwjeck5rowrk.png" alt="passwdpolicy" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.Double click the &lt;strong&gt;Minimum password length&lt;/strong&gt; policy item.&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%2Fnvncmlj4dxcnyv8qmmak.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%2Fnvncmlj4dxcnyv8qmmak.png" alt="minimumpolicy" width="800" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.Change the minimum number of characters to 14.&lt;br&gt;
7.Click &lt;strong&gt;Ok&lt;/strong&gt;, and then close the Group Policy Management Editor window.&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%2Ffa563k5l2f9l1s6gjv3i.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%2Ffa563k5l2f9l1s6gjv3i.png" alt="setpasswd" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8.Close the Group Policy Management console.&lt;/p&gt;

&lt;h1&gt;
  
  
  Configure Fine-Grained Password Policy
&lt;/h1&gt;

&lt;p&gt;In this task, you configure a fine-grained password policy and apply it to the Domain Admins group. To complete this task, perform the following steps in TAILWIND-DC1:&lt;/p&gt;

&lt;p&gt;1.From the Tools menu of the Server Manager console, open Active Directory Administrative Center.&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%2Fvyy8datbcabla0z3qb7e.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%2Fvyy8datbcabla0z3qb7e.png" alt="admincentre" width="799" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.Under Overview, Click &lt;strong&gt;Tailwindtraders (local)&lt;/strong&gt;.&lt;br&gt;
3.In the tailwindtraders (local) pane, open the System container.&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%2F4ko5k5lhsj60ff7q2424.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%2F4ko5k5lhsj60ff7q2424.png" alt="syscontainer" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.In the System container, open the Password Settings Container.&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%2Fw22nd2t4c8vdahozbvtu.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%2Fw22nd2t4c8vdahozbvtu.png" alt="passwdsettingscontainer" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.Click the Password Settings Container, click &lt;strong&gt;New&lt;/strong&gt;, and then click &lt;strong&gt;Password Settings.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F43xw1cm1vdr2kf2cdess.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%2F43xw1cm1vdr2kf2cdess.png" alt="newpasswdsetting" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.In the Name field, type &lt;code&gt;Domain Admin Password Policy&lt;/code&gt;.&lt;br&gt;
7.Set the Precedence field to &lt;code&gt;1&lt;/code&gt;.&lt;br&gt;
8.Set minimum password length to &lt;code&gt;16&lt;/code&gt;.&lt;br&gt;
9.Click &lt;strong&gt;OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1ki6vstukoiqc4d45ygf.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%2F1ki6vstukoiqc4d45ygf.png" alt="passwdlen" width="799" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;10.Open the new policy &lt;strong&gt;Domain Admins Password Policy&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw1hnfj7bd058ljmw66ei.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%2Fw1hnfj7bd058ljmw66ei.png" alt="policy" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;11.In the Directly Applies to section, click &lt;strong&gt;Add&lt;/strong&gt;, then type &lt;code&gt;Domain Admins&lt;/code&gt;. Click &lt;strong&gt;Check Names&lt;/strong&gt; and click &lt;strong&gt;OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnw83iptdktcqf61g376d.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%2Fnw83iptdktcqf61g376d.png" alt="addtopolicy" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;12.Click &lt;strong&gt;OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F55dgc168npgpc75xkk1n.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%2F55dgc168npgpc75xkk1n.png" alt="ok" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Enable Active Directory Recycle Bin
&lt;/h1&gt;

&lt;p&gt;In this task, you enable the Active Directory Recycle Bin. To complete this task, perform the following steps in TAILWIND-DC1:&lt;/p&gt;

&lt;p&gt;1.From the Tools menu of the Server Manager console, open Active Directory Administrative Center.&lt;br&gt;
2.Click &lt;strong&gt;Tailwindtraders (local)&lt;/strong&gt; in the left pane.&lt;br&gt;
3.In the right pane, select &lt;strong&gt;Enable Recycle Bin&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdpudu7o7p9w2eqn8zcrn.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%2Fdpudu7o7p9w2eqn8zcrn.png" alt="recyclebin" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.Click &lt;strong&gt;OK&lt;/strong&gt; to dismiss the warning.&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%2Fcu4ec843bwwfbp6dkdo0.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%2Fcu4ec843bwwfbp6dkdo0.png" alt="ok" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.Click &lt;strong&gt;OK&lt;/strong&gt; to dismiss the warning about replication latency.&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%2Flna5vsapg08y5gpcrb8v.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%2Flna5vsapg08y5gpcrb8v.png" alt="ok" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Summary
&lt;/h2&gt;

&lt;p&gt;The exercise resulted in three key Active Directory security configurations.&lt;br&gt;
The domain-wide password requirement was updated to 14 characters through the Default Domain Policy.&lt;br&gt;
A separate Fine-Grained Password Policy named Domain Admin Password Policy was created with a precedence of 1.&lt;br&gt;
The Domain Admins group was assigned the stricter policy with a 16-character minimum password length.&lt;br&gt;
The configuration demonstrated the ability to apply different password requirements to specific security groups.&lt;br&gt;
The Active Directory Recycle Bin was also enabled from Active Directory Administrative Center.&lt;br&gt;
These changes produced a more structured approach to password enforcement and directory-object recovery.&lt;br&gt;
The completed configuration provides a practical record of Active Directory security policy administration.&lt;/p&gt;

</description>
      <category>ppasswordsecurity</category>
      <category>activedirectory</category>
      <category>sysadmin</category>
      <category>windowsserver</category>
    </item>
    <item>
      <title>Administering Active Directory Users, Groups, and Organizational Units</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Mon, 14 Sep 2026 15:12:55 +0000</pubDate>
      <link>https://dev.to/rahimah_dev/administering-active-directory-users-groups-and-organizational-units-1b60</link>
      <guid>https://dev.to/rahimah_dev/administering-active-directory-users-groups-and-organizational-units-1b60</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Active Directory is at the heart of centralized identity and access management in many Windows Server environments.&lt;br&gt;
In this hands-on project, I moved beyond theory to perform practical Active Directory administration tasks.&lt;br&gt;
I created and structured Organizational Units (OUs) for Sydney, Melbourne, and Brisbane to organize users effectively.&lt;br&gt;
I created and managed user accounts while configuring important account properties such as expiration dates.&lt;br&gt;
I implemented security groups and assigned users to appropriate groups to support controlled administration.&lt;br&gt;
I configured a user as a member of Protected Users and explored practical account-security controls.&lt;br&gt;
I also practiced delegating password-reset permissions, managing user attributes, disabling accounts, and resetting passwords.&lt;br&gt;
Together, these exercises demonstrate practical skills relevant to enterprise identity management, system administration, and secure Windows Server environments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Overview
&lt;/h3&gt;

&lt;p&gt;In this exercise, you perform user management operations.&lt;/p&gt;

&lt;p&gt;This exercise should take approximately &lt;strong&gt;25&lt;/strong&gt; minutes to complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Organizational Units
&lt;/h2&gt;

&lt;p&gt;In this task, you create three OUs: Sydney, Melbourne, and Brisbane. To complete this task, perform the following steps:&lt;/p&gt;

&lt;p&gt;1.In TAILWIND-DC1, open Active Directory Users and Computers from the Tools menu of the Server Manager console.&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%2Ftleauuwb09ujdpgd6w45.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%2Ftleauuwb09ujdpgd6w45.png" alt="activeusersncomputers" width="799" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2.Right-click on the &lt;strong&gt;tailwindtraders.internal&lt;/strong&gt; domain.&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%2F67q25vc650z4oox1k62w.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%2F67q25vc650z4oox1k62w.png" alt="tw" width="799" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.Select &lt;strong&gt;New&lt;/strong&gt;, then &lt;strong&gt;Organizational Unit&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2uc8lmz0og1dr7sp908e.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%2F2uc8lmz0og1dr7sp908e.png" alt="newou" width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.In the New Object - Organizational Unit dialog box, set the name to &lt;code&gt;Sydney&lt;/code&gt; and click &lt;strong&gt;OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffs8po8q1twsn03zishfr.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%2Ffs8po8q1twsn03zishfr.png" alt="sydney" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.Repeat this process to create the &lt;code&gt;Melbourne&lt;/code&gt; OU and the &lt;code&gt;Brisbane&lt;/code&gt; OU.&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%2Fi4jzvb58ffariosi5pqu.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%2Fi4jzvb58ffariosi5pqu.png" alt="3OUs" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create users
&lt;/h2&gt;

&lt;p&gt;In this task, you create a user and configure account properties such as Account Expiration Date. To complete this task, perform the following steps:&lt;/p&gt;

&lt;p&gt;1.In TAILWIND-DC1, open Active Directory Users and Computers (or Administrative Center).&lt;br&gt;
2.Right-click on the Sydney OU.&lt;br&gt;
3.Select &lt;strong&gt;New&lt;/strong&gt;, then &lt;strong&gt;User&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzq7jd629g6sexwah7zs0.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%2Fzq7jd629g6sexwah7zs0.png" alt="newuser" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.Type &lt;code&gt;SydneyContractor&lt;/code&gt; in the Full name and User Logon name fields and click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5ftx85vtdwjc9cjvlyxf.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%2F5ftx85vtdwjc9cjvlyxf.png" alt="sydneycontr" width="799" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.Specify a password, such as &lt;code&gt;Pa55w.rdPa55w.rd&lt;/code&gt;, and then confirm the password.&lt;br&gt;
6.Click &lt;strong&gt;Next&lt;/strong&gt; and &lt;strong&gt;Finish&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgoofkvvwepun5f8j6b6e.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%2Fgoofkvvwepun5f8j6b6e.png" alt="passwd" width="799" height="455"&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%2F9i0y663p2fsd03zocawt.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%2F9i0y663p2fsd03zocawt.png" alt="finish" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.Select the Sydney OU. In the Sydney OU, double-click the SydneyContractor user account.&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%2F0dmb9ug5bhf7bnmvu942.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%2F0dmb9ug5bhf7bnmvu942.png" alt="sydneyou" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8.In the Account tab, in the &lt;strong&gt;Account expires&lt;/strong&gt; section, select &lt;strong&gt;End of&lt;/strong&gt;: and set the date to &lt;strong&gt;Jan 1, 2030&lt;/strong&gt;. Click OK.&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%2Fi4xn0bg1tejilwa2ss4r.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%2Fi4xn0bg1tejilwa2ss4r.png" alt="endof" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;9.Right-click the SydneyContractor user and select &lt;strong&gt;Copy&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe9lul97504jga08j4yko.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%2Fe9lul97504jga08j4yko.png" alt="copy" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;10.Type &lt;code&gt;MelbourneContractor&lt;/code&gt; in the Full name and User Logon name fields. Click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flf7dgr70hlxcp34udf3h.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%2Flf7dgr70hlxcp34udf3h.png" alt="melbournecontr" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;11.Specify a password, such as &lt;code&gt;Pa55w.rdPa55w.rd&lt;/code&gt; and then confirm the password.&lt;br&gt;
12.Click &lt;strong&gt;Next&lt;/strong&gt; and &lt;strong&gt;Finish&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fld97pleu0ktn9mjg6had.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%2Fld97pleu0ktn9mjg6had.png" alt="passwd" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;13.Right-click the SydneyContractor user and select &lt;strong&gt;Copy&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvv04bnkbdx2zc1gm32b9.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%2Fvv04bnkbdx2zc1gm32b9.png" alt="copy" width="799" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;14.Type &lt;code&gt;BrisbaneContractor&lt;/code&gt; in the Full name and User Logon name fields. Click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw4gzyj86d26bp0g9kc1v.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%2Fw4gzyj86d26bp0g9kc1v.png" alt="brosbanecntr" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;15.Specify a password such as &lt;code&gt;Pa55w.rdPa55w.rd&lt;/code&gt; and then confirm the password.&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%2Fvpvilxp7b7ndxwf1zjp2.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%2Fvpvilxp7b7ndxwf1zjp2.png" alt="passwd" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;16.Click &lt;strong&gt;Next&lt;/strong&gt; and &lt;strong&gt;Finish&lt;/strong&gt;.&lt;br&gt;
17.Drag the MelbourneContractor user to the Melbourne OU.&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%2F7bb2qo8dedzmu6mp0pp9.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%2F7bb2qo8dedzmu6mp0pp9.png" alt="drag" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;18.If a warning about mooving objects appears, click &lt;strong&gt;Yes&lt;/strong&gt;.&lt;br&gt;
19.Drag the BrisbaneContractor user to the Brisbane OU.&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%2Fw0svvgz6e4ft4ih1slm7.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%2Fw0svvgz6e4ft4ih1slm7.png" alt="drag" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;20.If a warning about mooving objects appears, click &lt;strong&gt;Yes&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create the Sydney Admins group
&lt;/h2&gt;

&lt;p&gt;In this task, you create a new security group named Sydney Administrators. To complete this task, perform the following steps:&lt;/p&gt;

&lt;p&gt;1.In TAILWIND-DC1, open Active Directory Users and Computers.&lt;br&gt;
2.Right click the Sydney OU, and select &lt;strong&gt;New&lt;/strong&gt;, then &lt;strong&gt;Group&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9jupaotgm1j4iprg2lq2.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%2F9jupaotgm1j4iprg2lq2.png" alt="newgroup" width="800" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.Type &lt;code&gt;Sydney Administrators&lt;/code&gt; in Group name and select &lt;strong&gt;Universal&lt;/strong&gt; in group scope. Click &lt;strong&gt;OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7sjjqkcnijmbzs2ks761.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%2F7sjjqkcnijmbzs2ks761.png" alt="sydad" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.In the Sydney OU, double-click the SydneyContractor User account.&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%2Fq6twzm7vrpc2g965zpui.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%2Fq6twzm7vrpc2g965zpui.png" alt="sydneycontr" width="800" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.In the Member Of tab, click &lt;strong&gt;Add&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwqfns7qsmlelarb4bzme.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%2Fwqfns7qsmlelarb4bzme.png" alt="memberof" width="799" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.Type &lt;code&gt;Sydney Administrators&lt;/code&gt;.&lt;br&gt;
7.Click &lt;strong&gt;Check Names&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8p2706wbe1l2tx7vqpp9.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%2F8p2706wbe1l2tx7vqpp9.png" alt="checknames" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8.Click &lt;strong&gt;OK&lt;/strong&gt;, then click &lt;strong&gt;OK&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure a user as a Protected User
&lt;/h2&gt;

&lt;p&gt;In this task, you configure the SydneyContractor user account as a protected user. To complete this task, perform the following steps:&lt;/p&gt;

&lt;p&gt;1.In TAILWIND-DC1, open Active Directory Users and Computers (or Administrative Center).&lt;br&gt;
2.Navigate to the Sydney OU and double-click the SydneyContractor User account.&lt;br&gt;
3.In the Member Of tab, click &lt;strong&gt;Add&lt;/strong&gt;.&lt;br&gt;
4.Type &lt;code&gt;Protected Users&lt;/code&gt;.&lt;br&gt;
5.Click &lt;strong&gt;Check Names&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flwwalrerb7ylgvuhi4xc.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%2Flwwalrerb7ylgvuhi4xc.png" alt="protectedusers" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.Click &lt;strong&gt;OK&lt;/strong&gt;, then click &lt;strong&gt;OK&lt;/strong&gt;.&lt;br&gt;
Then you can verify.&lt;br&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%2Fi29b8363uge8kh4pks1d.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%2Fi29b8363uge8kh4pks1d.png" alt="verify" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Delegate Security Permissions to an OU to a security group
&lt;/h2&gt;

&lt;p&gt;In this task, you delegate the ability to reset passwords and force password change to the Sydney Administrators group over accounts in the Sydney OU. To complete this task, perform the following steps:&lt;/p&gt;

&lt;p&gt;1.In TAILWIND-DC1, open Active Directory Users and Computers.&lt;br&gt;
2.Right-click the Sydney OU and click &lt;strong&gt;Delegate Control&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frsg8r0e2eb7erxyfhcbv.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%2Frsg8r0e2eb7erxyfhcbv.png" alt="delegatecontrl" width="800" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.On the Welcome page of the Delegation of Control Wizard, click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feeewl52v63bkvcapn19e.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%2Feeewl52v63bkvcapn19e.png" alt="wiz" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.Click &lt;strong&gt;Add&lt;/strong&gt; and type &lt;code&gt;Sydney Administrators&lt;/code&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%2Fm4rh2fu84ewqxzwakca1.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%2Fm4rh2fu84ewqxzwakca1.png" alt="add" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.Click &lt;strong&gt;Check Names&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvuffy2te8pa6cdafl1d0.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%2Fvuffy2te8pa6cdafl1d0.png" alt="checknames" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.Click &lt;strong&gt;OK&lt;/strong&gt; and click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
7.On the Tasks to Delegate page, select the &lt;strong&gt;Reset user passwords and force password change at next logon&lt;/strong&gt; option. Click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftgsp4u7cg56z3t0gsmjd.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%2Ftgsp4u7cg56z3t0gsmjd.png" alt="resetuserpswd" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8.Click &lt;strong&gt;Finish&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F330hwgmp883t985jnngk.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%2F330hwgmp883t985jnngk.png" alt="finish" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure City Attribute for a User
&lt;/h2&gt;

&lt;p&gt;In this task, you configure a city attribute for a user account and then use the Find attribute to verify that the user is present. To complete this task, perform the following steps:&lt;/p&gt;

&lt;p&gt;1.In TAILWIND-DC1, open Active Directory Users and Computers.&lt;br&gt;
2.Select the Sydney OU, right-click the SydneyContractor user account, and click &lt;strong&gt;Properties&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6llqzbiiu30c0tiuisvk.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%2F6llqzbiiu30c0tiuisvk.png" alt="ppts" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.In the Address tab of the Sydney Contractor properties, set the City field to &lt;code&gt;Sydney&lt;/code&gt; and click &lt;strong&gt;OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhrbjfbnzife0x5wybuv3.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%2Fhrbjfbnzife0x5wybuv3.png" alt="city" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.In Active Directory Users and Computers, right-click Tailwindtrader.internal and click &lt;strong&gt;Find&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuinhj5q8oxaxkci93ops.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%2Fuinhj5q8oxaxkci93ops.png" alt="find" width="799" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.In the Advanced tab of the Find Users, Contacts, and Groups dialog box, select &lt;strong&gt;Field&lt;/strong&gt;, then &lt;strong&gt;User&lt;/strong&gt;, then &lt;strong&gt;City&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi4mkt88e4h6dfbavax77.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%2Fi4mkt88e4h6dfbavax77.png" alt="city" width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Set Condition to &lt;strong&gt;Is (exactly)&lt;/strong&gt;. Set Value to &lt;strong&gt;Sydney&lt;/strong&gt;. Click &lt;strong&gt;Find Now&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flcdsyp3wg0wxwq71oc3b.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%2Flcdsyp3wg0wxwq71oc3b.png" alt="findnow" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.Click &lt;strong&gt;Yes&lt;/strong&gt; on the Find in the Directory pop-up.&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%2Fvuxn2jeu5l0ymo64va0j.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%2Fvuxn2jeu5l0ymo64va0j.png" alt="yes" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.Verify that user SydneyContractor is listed in the &lt;strong&gt;Search results&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fapri41cecqbq0f9k02bp.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%2Fapri41cecqbq0f9k02bp.png" alt="verify" width="800" height="477"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8.Close the Find Users, Contacts, and Groups dialog box.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disable the Melbourne Contractor User
&lt;/h2&gt;

&lt;p&gt;In this task, you disable the Melbourne Contractor user. To complete this task, perform the following steps:&lt;/p&gt;

&lt;p&gt;1.In TAILWIND-DC1, open Active Directory Users and Computers, and then open the Melbourne OU.&lt;br&gt;
2.In the Melbourne OU, right-click &lt;strong&gt;MelbourneContractor&lt;/strong&gt; and click &lt;strong&gt;Disable Account&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwu169iw6whjigv8ofzt4.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%2Fwu169iw6whjigv8ofzt4.png" alt="disable" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.Click &lt;strong&gt;OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F620kpmb7ogvms4ghsfeo.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%2F620kpmb7ogvms4ghsfeo.png" alt="ok" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reset the password of the Brisbane Contractor User
&lt;/h2&gt;

&lt;p&gt;In this task, you reset the password of the BrisbaneContractor user. To complete this task, perform the following steps:&lt;/p&gt;

&lt;p&gt;1.In TAILWIND-DC1, open Active Directory Users and Computers, and then open the Brisbane OU.&lt;br&gt;
2.Right-click the BrisbaneContractor user and select &lt;strong&gt;Reset Password&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fol4oond5inv1urcalq79.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%2Fol4oond5inv1urcalq79.png" alt="resetpwd" width="799" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.On the Reset Password dialog box, type the password &lt;code&gt;Pa66w.rdPa66w.rd&lt;/code&gt; twice and select &lt;strong&gt;OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo45399rcj727o0ag3ahg.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%2Fo45399rcj727o0ag3ahg.png" alt="passwd" width="799" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;OK&lt;/strong&gt; again in the dialog that notifies you that the password has been changed.&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%2F9dmzvbo8ic2thjhvmut6.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%2F9dmzvbo8ic2thjhvmut6.png" alt="ok" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Summary
&lt;/h2&gt;

&lt;p&gt;This project provides hands-on experience administering Active Directory Domain Services in a Windows Server environment.&lt;br&gt;
It covers creating and organizing Organizational Units, managing user accounts, and configuring account properties.&lt;br&gt;
Security groups were created to support structured access and administration.&lt;br&gt;
The project also demonstrates Protected Users, delegated password-reset permissions, and user attribute management.&lt;br&gt;
Additional tasks included disabling user accounts and resetting passwords.&lt;br&gt;
Overall, the project demonstrates practical identity management, security, and Windows Server administration skills relevant to enterprise IT environments.&lt;/p&gt;

</description>
      <category>sysadmin</category>
      <category>activedirectory</category>
      <category>windowsserver</category>
      <category>identity</category>
    </item>
    <item>
      <title>Administer-Active-Directory-Domain-Services</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Mon, 14 Sep 2026 13:00:48 +0000</pubDate>
      <link>https://dev.to/rahimah_dev/administer-active-directory-domain-services-c6m</link>
      <guid>https://dev.to/rahimah_dev/administer-active-directory-domain-services-c6m</guid>
      <description>&lt;h2&gt;
  
  
  Project Introduction
&lt;/h2&gt;

&lt;p&gt;A company deploying a new branch office can use this setup to establish centralized authentication and manage employee computers through Active Directory.&lt;br&gt;
Infrastructure teams can use Hyper-V to build isolated server environments for testing domain controllers, networking, and server configurations before production deployment.&lt;br&gt;
Systems administrators can then join application, file, or other member servers to the domain for centralized identity and administration.&lt;/p&gt;

&lt;p&gt;This project demonstrates how to build a practical Windows Server infrastructure lab using Hyper-V.&lt;br&gt;
It uses Windows 11 to host two Windows Server 2022 virtual machines.&lt;br&gt;
A dedicated Hyper-V NAT network is configured for private server communication and internet access.&lt;br&gt;
The first server, TAILWIND-DC1, is deployed as an Active Directory Domain Controller.&lt;br&gt;
The tailwindtraders.internal domain is created to provide centralized identity and authentication.&lt;br&gt;
The second server, TAILWIND-MBR1, is configured as a domain member server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project overview
&lt;/h3&gt;

&lt;p&gt;In this guided project, you go through the major steps of creating, configuring, and maintaining a domain controller. You also have the opportunity to promote a domain controller.&lt;/p&gt;

&lt;p&gt;This exercise should take approximately &lt;strong&gt;45&lt;/strong&gt; minutes to complete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;To reduce resource access requirements (such as access to Windows Server or a Microsoft Azure subscription), this guided project uses a Windows 10 or Windows 11 machine to run a virtualized environment. You configure a Windows 10 or Windows 11 computer’s Hyper-V subsystem to support the two Windows Server 2022 Evaluation Edition virtual machines that you use in this project. You require the Professional or Enterprise edition of Windows 10 or Windows 11 to perform these tasks.&lt;/p&gt;

&lt;p&gt;The computer that functions as the Hyper-V virtualization host should have at least 16 GB of RAM. You can also use an evaluation version of Windows Server with the Hyper-V role installed as the host for these virtual machines, or to configure a third-party virtualization platform to host both virtual machines. The exercises and tasks in this lab use Windows 11 when describing the Hyper-V host. The options presented here make it easy to locate large virtual machine files if you want to remove the configuration after you finish with the project.&lt;/p&gt;

&lt;p&gt;The Setup section consists of three main tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install Hyper-V&lt;/li&gt;
&lt;li&gt;Create Windows Server Domain Controller Virtual Machine&lt;/li&gt;
&lt;li&gt;Create Windows Server Domain Member Server&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install Hyper-V
&lt;/h2&gt;

&lt;p&gt;In this task, you install Hyper-V and configure a NAT switch. You configure Hyper-V to use a different set of default directories to store virtual machine files and hard disks. You can use the options presented in these instructions or choose your own location.&lt;/p&gt;

&lt;p&gt;1.Sign in to the Windows 11 computer with an account that has local Administrator privileges.&lt;br&gt;
2.On the Windows 11 Computer click &lt;strong&gt;Start&lt;/strong&gt;, select &lt;strong&gt;Settings&lt;/strong&gt; and on the Settings page select &lt;strong&gt;System&lt;/strong&gt;.&lt;br&gt;
3.On the System page of Settings, scroll down until you locate Optional Features. Select &lt;strong&gt;Optional Features&lt;/strong&gt;.&lt;br&gt;
4.On the Optional Features page, scroll down until you locate &lt;strong&gt;More&lt;/strong&gt; &lt;strong&gt;Windows Features&lt;/strong&gt; under Related Settings.&lt;/p&gt;

&lt;p&gt;5.On the Windows Feature page, select the checkbox next to Hyper-V and click &lt;strong&gt;OK&lt;/strong&gt; as shown in the exhibit.&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%2Fit0rsvyy26kvzfh6iqjq.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%2Fit0rsvyy26kvzfh6iqjq.png" alt="hyperV" width="800" height="676"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.When the installation completes, on the Windows Features page, click &lt;strong&gt;Restart Now&lt;/strong&gt;.&lt;br&gt;
7.After the computer restarts, sign in again using the same account that has local Administrative privileges.&lt;br&gt;
8.Click &lt;strong&gt;Start&lt;/strong&gt; and search for Hyper-V Manger. Pin Hyper-V Manager to the Taskbar.&lt;br&gt;
9.Open Hyper-V Manager, right click on the local computer, and select &lt;strong&gt;Hyper-V Settings&lt;/strong&gt;.&lt;br&gt;
10.On the &lt;strong&gt;Hyper-V settings&lt;/strong&gt; dialog box, under Server, select Virtual Machines. Set the location of the Virtual Machines folder to C:\VirtualMachines.&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%2Fx0uj1f8s1zkxo7xcuha8.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%2Fx0uj1f8s1zkxo7xcuha8.png" alt="vm" width="800" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;11.Under the &lt;strong&gt;Hyper-V settings&lt;/strong&gt; dialog box, under Server, select &lt;strong&gt;Virtual Machine Hard Disks&lt;/strong&gt;. Set the location of the Virtual Machine Hard Disks to C:\VirtualMachines\VHDs.&lt;br&gt;
12.Click &lt;strong&gt;OK&lt;/strong&gt; to close the &lt;strong&gt;Hyper-V Settings&lt;/strong&gt; dialog box.&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%2Flyzz2az30ljglz4dzqw2.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%2Flyzz2az30ljglz4dzqw2.png" alt="verify" width="799" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;13.Open PowerShell with administrator access and run the following commands to create a NAT network.&lt;br&gt;
&lt;code&gt;New-VMSwitch -SwitchName “NATSwitch” -SwitchType Internal&lt;/code&gt;&lt;br&gt;
&lt;code&gt;New-NetIPAddress -IPAddress 10.10.10.1 -PrefixLength 24 -InterfaceAlias “vEthernet (NATSwitch)”&lt;/code&gt;&lt;br&gt;
&lt;code&gt;New-NetNat -Name “NATNetwork” –InternalIPInterfaceAddressPrefix “10.10.10.0/24”&lt;/code&gt;&lt;br&gt;
14.Close PowerShell.&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%2Fuq3szk43quizj6dvpzb1.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%2Fuq3szk43quizj6dvpzb1.png" alt="powershell" width="800" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Windows Server Domain Controller Virtual Machine
&lt;/h2&gt;

&lt;p&gt;In this task, you deploy and configure a Windows Server 2022 Domain Controller for the lab in which you perform tasks related to the Applied Skill Credential. To perform this task, ensure that you downloaded the Windows Server 2022 Evaluation Edition ISO file from &lt;a href="https://www.microsoft.com/en-us/evalcenter/download-windows-server-2022" rel="noopener noreferrer"&gt;https://www.microsoft.com/en-us/evalcenter/download-windows-server-2022&lt;/a&gt;. Place this file in the folder c:\ISOs. This evaluation ISO allows you to run a full version of Windows Server 2022 for up to 180 days.&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%2F6aicw3ydzk8g7h2zy3m7.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%2F6aicw3ydzk8g7h2zy3m7.png" alt="download" width="799" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1.In Hyper-V Manager on the &lt;strong&gt;Actions&lt;/strong&gt; menu select &lt;strong&gt;New&lt;/strong&gt; and then select &lt;strong&gt;Virtual Machine&lt;/strong&gt;.&lt;br&gt;
2.On the Before you Begin page of the New Virtual Machine Wizard, click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
3.On the Specify Name and Location page of the New Virtual Machine Wizard, type the name &lt;strong&gt;TAILWIND-DC1&lt;/strong&gt; and click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F63cp35bptnd62r7r3qdk.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%2F63cp35bptnd62r7r3qdk.png" alt="tailwind" width="800" height="759"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.On the Specify Generation page, select &lt;strong&gt;Generation 2&lt;/strong&gt; and click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsdd8m6c4bh00ds9kuqim.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%2Fsdd8m6c4bh00ds9kuqim.png" alt="gen2" width="800" height="614"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.On the Assign Memory page, set the startup memory to 4096 MB and leave the &lt;strong&gt;Use Dynamic Memory for this virtual machine&lt;/strong&gt; option selected. Click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgndn2du6t3fzd89cq3cm.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%2Fgndn2du6t3fzd89cq3cm.png" alt="memory" width="800" height="748"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.On the Configure Networking page, set the Connection in the drop-down menu to NATSwitch and click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
7.On the Connect Virtual Hard Disk page, accept the defaults and click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frw2911yaj3t56o55qfqo.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%2Frw2911yaj3t56o55qfqo.png" alt="default" width="800" height="723"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8.On the Installation Options page, select the &lt;strong&gt;Install an operating system from a bootable image file&lt;/strong&gt; option and then click &lt;strong&gt;Browse&lt;/strong&gt; to select the Windows Server 2022 Evaluation Edition iso file (named SERVER_EVAL_x64FRE_en-us.iso). You already downloaded this file to the C:\ISOs folder. Click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
9.On the Summary page, click &lt;strong&gt;Finish&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft72zp9m0b6mclmc7w6jl.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%2Ft72zp9m0b6mclmc7w6jl.png" alt="finish" width="800" height="755"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;10.In Hyper-V Manager, right-click TAILWIND-DC1 and select &lt;strong&gt;Settings&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F53wm80t24ehs3noapkq1.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%2F53wm80t24ehs3noapkq1.png" alt="settings" width="800" height="683"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;11.On the TAILWIND-DC1 Settings page, under Management select &lt;strong&gt;Checkpoints&lt;/strong&gt; and ensure that the &lt;strong&gt;Use automatic checkpoints&lt;/strong&gt; option isn’t selected as is shown in the screenshot. Click &lt;strong&gt;OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7mfagawjpin9daye58r0.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%2F7mfagawjpin9daye58r0.png" alt="checkpoints" width="800" height="737"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;12.Double-click TAILWIND-DC1. This opens the Virtual Machine Connection window. Select &lt;strong&gt;Start&lt;/strong&gt;. When the Press any key to boot from CD or DVD message displays, use the mouse to select inside the virtual machine window and press the Space bar. This sets the virtual machine to boot from the attached ISO file.&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%2Fn68j6k8utio841qbxlu5.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%2Fn68j6k8utio841qbxlu5.png" alt="start" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;13.On the Microsoft Server Operating System Setup page, accept the defaults and click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
14.On the Install now page, select &lt;strong&gt;Install now&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;15.On the Microsoft Server Operating System Setup page, select &lt;strong&gt;Windows Server 2022 Standard Evaluation (Desktop Experience)&lt;/strong&gt; as shown in the screenshot and click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk6isvnjx5wn0t4px0s6b.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%2Fk6isvnjx5wn0t4px0s6b.png" alt="server" width="800" height="607"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;16.On the Applicable notices and license terms page, review the license and then select the &lt;strong&gt;I Accept&lt;/strong&gt; checkbox. Click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
17.On the Which type of installation do you want? page, select &lt;strong&gt;Custom&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Femcdfmeno8m0n3geqo1c.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%2Femcdfmeno8m0n3geqo1c.png" alt="custom" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;18.On the Where do you want to install the operating system? page, select Drive 0 and click &lt;strong&gt;Next&lt;/strong&gt;. &lt;br&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%2F0nqpuvk5kdma5cdbazze.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%2F0nqpuvk5kdma5cdbazze.png" alt="Drive 0" width="798" height="604"&gt;&lt;/a&gt;&lt;br&gt;
The operating system will install. This takes several minutes depending on the speed of the computer you’re using. The virtual machine will restart.&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%2Fecj6194s38j1pmq4g4ct.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%2Fecj6194s38j1pmq4g4ct.png" alt="install" width="800" height="579"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;19.On the Customize settings page, you are asked to provide a password for the built-in Administrator account. Enter the password: &lt;strong&gt;Pa55w.rdPa55w.rd&lt;/strong&gt; twice. The password is a demonstration password and shouldn’t be used on production systems. You can also choose your own password here. After you have entered the Administrator password twice, click &lt;strong&gt;Finish&lt;/strong&gt;. You won’t be connected to the running virtual machine.&lt;br&gt;
20.On the virtual machine’s lock screen, enter the Administrator password &lt;strong&gt;Pa55w.rdPa55w.rd&lt;/strong&gt; to sign in.&lt;br&gt;
21.After you sign in, right-click the network icon, represented by a globe on the task bar, and select &lt;strong&gt;Open Network &amp;amp; Internet Settings.&lt;/strong&gt;&lt;br&gt;
22.On the Network Status page, select &lt;strong&gt;Change adapter options&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4ct8t02c4enqyu0bjoo0.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%2F4ct8t02c4enqyu0bjoo0.png" alt="internet" width="799" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;23.On the Network Connections page, right-click &lt;strong&gt;Ethernet&lt;/strong&gt; and select &lt;strong&gt;Properties.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2h0nzhx9zs9rfljbwlps.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%2F2h0nzhx9zs9rfljbwlps.png" alt="ethernet" width="799" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;24.On the Ethernet Properties page, select the Internet Protocol Version 4 (TCP/IPv4) item and click &lt;strong&gt;Properties&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faqnvqwoegidswr4o5jkj.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%2Faqnvqwoegidswr4o5jkj.png" alt="ethernet" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;25.On the General tab of the Internet Protocol Version 4 (TCP/IPv4) Properties page, set the IP address configuration as follows and click &lt;strong&gt;OK&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;a.Use the following IP address&lt;br&gt;
  i.IP address: 10.10.10.1&lt;br&gt;
 ii.Subnet Mask: 255.255.255.0&lt;br&gt;
iii.Default Gateway: 10.10.10.1&lt;/p&gt;

&lt;p&gt;b.Use the following DNS server addresses:&lt;br&gt;
  i.Preferred DNS server: 1.1.1.1&lt;br&gt;
 ii.Alternate DNS server: 8.8.8.8&lt;/p&gt;

&lt;p&gt;26.Click &lt;strong&gt;OK&lt;/strong&gt;. When queried about whether you want to allow the computer to be discoverable, select &lt;strong&gt;Yes&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1fl6a9t329otmdzyz3go.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%2F1fl6a9t329otmdzyz3go.png" alt="ip" width="800" height="365"&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%2Fodt48oaoh503g5hjahs3.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%2Fodt48oaoh503g5hjahs3.png" alt="yes" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;27.From the Start menu, open Server Manager, select Local Server and then select the Computer Name. This opens the System Properties dialog box. On the Computer Name page of the System Properties dialog box, select &lt;strong&gt;Change&lt;/strong&gt;.&lt;br&gt;
28.On the Computer Name/Domain Changes dialog box, set the computer name to TAILWIND-DC1 and then click &lt;strong&gt;OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjz07crgzcr9cvel26ktn.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%2Fjz07crgzcr9cvel26ktn.png" alt="ok" width="800" height="708"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;29.In the dialog informing you that you need to restart your computer click &lt;strong&gt;OK&lt;/strong&gt;.&lt;br&gt;
30.On the System Properties dialog box, select &lt;strong&gt;Close&lt;/strong&gt;.&lt;br&gt;
31.In the &lt;strong&gt;You must restart your computer to apply these changes&lt;/strong&gt; dialog box, click &lt;strong&gt;Restart Now&lt;/strong&gt;. The computer will restart.&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%2Fq7aa24lyjyttf1sdwymn.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%2Fq7aa24lyjyttf1sdwymn.png" alt="restart" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;32.When the computer has restarted, sign in as Administrator with the password you configured during installation.&lt;br&gt;
33.In Server Manager, select the Manage menu and then select &lt;strong&gt;Add Roles and Features.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhkvzddb84vwbb9hq0vls.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%2Fhkvzddb84vwbb9hq0vls.png" alt="role-based" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;34.On the Before you begin page of the Add Roles and Features wizard, select &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
35.On the Select installation type page, select &lt;strong&gt;Role-based or feature-based installation&lt;/strong&gt; and click &lt;strong&gt;Next.&lt;/strong&gt;&lt;br&gt;
36.On the Select destination server page, click &lt;strong&gt;Select a server from the server pool&lt;/strong&gt;, ensure &lt;strong&gt;TAILWIND-DC1&lt;/strong&gt; is selected and click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0fflrid8o5v7ofw3mh03.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%2F0fflrid8o5v7ofw3mh03.png" alt="server pool" width="799" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;37.On the Select server roles page, select the &lt;strong&gt;Active Directory Domain Services&lt;/strong&gt; checkbox. This opens the Add features page. Select &lt;strong&gt;Add Features&lt;/strong&gt;. On the Select server roles page, click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu4cl6c62mu1f5mzu3df2.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%2Fu4cl6c62mu1f5mzu3df2.png" alt="add features" width="800" height="505"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;38.On the Select features page, click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
39.On the Active Directory Domain Services page, click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fupwxtaklm3s0xni2gppq.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%2Fupwxtaklm3s0xni2gppq.png" alt="ADDS" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;40.On the Confirm installation selections page, select &lt;strong&gt;Install&lt;/strong&gt;. Depending on the speed of the computer, installation may take several minutes. When the installation completes, click &lt;strong&gt;Close&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx46wmmok7yy3u1lstbmd.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%2Fx46wmmok7yy3u1lstbmd.png" alt="install" width="799" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;41.On the Server manager menu, select the notification icon next to the flag in the top right corner shown in the screenshot.&lt;br&gt;
42.On the menu that opens when you select the notification icon, select &lt;strong&gt;Promote this server to a domain controller&lt;/strong&gt;. This starts the Active Directory Domain Services Configuration Wizard.&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%2Fu8yv9z6w77mtqaxxklsm.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%2Fu8yv9z6w77mtqaxxklsm.png" alt="promote" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;43.On the Deployment Configuration page, select &lt;strong&gt;Add a new forest&lt;/strong&gt; and set the root domain name to &lt;strong&gt;tailwindtraders.internal&lt;/strong&gt;. Click &lt;strong&gt;Next.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe4rshmmnz0mqsbyqh8zp.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%2Fe4rshmmnz0mqsbyqh8zp.png" alt="new forest" width="800" height="433"&gt;&lt;/a&gt;&lt;br&gt;
44.On the Domain Controller options page, accept the default settings and provide the Directory Services Restore Mode (DSRM) password. To do this, enter the following password twice: Pa55w.rdPa55w.rd. Click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frz9ryr2o81l56uf136t4.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%2Frz9ryr2o81l56uf136t4.png" alt="passwd" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;45.On the DNS Options page, click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
46.On the Additional Options page, click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
47.On the Paths page, click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
48.On the Review Options page, click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
49.On the Prerequisites Check page, click &lt;strong&gt;Install&lt;/strong&gt;. The installation takes several minutes depending on the speed of the virtual machine. The virtual machine will restart.&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%2Fdzm5rcfyq67zep7v98xq.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%2Fdzm5rcfyq67zep7v98xq.png" alt="check page" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;50.When the virtual machine restarts, sign in as &lt;strong&gt;tailwindtraders\administrator&lt;/strong&gt; with the password you configured for the default administrator account (Pa55w.rdPa55w.rd)&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Windows Server Domain Member Server
&lt;/h2&gt;

&lt;p&gt;In this task, you deploy and configure a Windows Server 2022 Domain member server for the lab in which you perform tasks related to the Applied Skill Credential. This task also uses the evaluation edition iso file.&lt;br&gt;
&lt;em&gt;NOTE: The screenshots here are fewer because the steps are very similar.&lt;/em&gt;&lt;br&gt;
1.In Hyper-V Manager on the Actions menu, select &lt;strong&gt;New&lt;/strong&gt; and then select &lt;strong&gt;Virtual Machine&lt;/strong&gt;.&lt;br&gt;
2.On the Before you Begin page of the New Virtual Machine Wizard, click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
3.On the Specify Name and Location page of the New Virtual Machine Wizard, enter the name &lt;strong&gt;TAILWIND-MBR1&lt;/strong&gt; and click &lt;strong&gt;Next&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzwl80wn2zaqwsphs3aeq.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%2Fzwl80wn2zaqwsphs3aeq.png" alt="new" width="799" height="614"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.On the Specify Generation page, select &lt;strong&gt;Generation 2&lt;/strong&gt; and click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
5.On the Assign Memory page, set the startup memory to 4096 MB and leave the &lt;strong&gt;Use Dynamic Memory for this virtual machine&lt;/strong&gt; option selected. Click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
6.On the Configure Networking page, set the Connection in the drop-down menu to &lt;strong&gt;NATSwitch&lt;/strong&gt; and click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
7.On the Connect Virtual Hard Disk page, accept the defaults and click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
8.On the Installation Options page, select the &lt;strong&gt;Install an operating system from a bootable image file&lt;/strong&gt; option and then click &lt;strong&gt;Browse&lt;/strong&gt; to select the Windows Server 2022 Evaluation Edition iso file (named SERVER_EVAL_x64FRE_en-us.iso) that you have downloaded to the C:\ISOs folder. Click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
9.On the Summary page, click &lt;strong&gt;Finish&lt;/strong&gt;.&lt;br&gt;
10.In Hyper-V Manager, right-click &lt;strong&gt;TAILWIND-MBR1&lt;/strong&gt; and select &lt;strong&gt;Settings&lt;/strong&gt;.&lt;br&gt;
11.On the TAILWIND-MBR1 Settings page, under Management, select &lt;strong&gt;Checkpoints&lt;/strong&gt;, ensure that the &lt;strong&gt;Use automatic checkpoints&lt;/strong&gt; option isn’t selected, and click &lt;strong&gt;OK&lt;/strong&gt;.&lt;br&gt;
12.Double click TAILWIND-MBR1. This brings up the Virtual Machine Connection window. Click &lt;strong&gt;Start&lt;/strong&gt;. When the Press any key to boot from CD or DVD message appears, use the mouse to select inside the virtual machine window and press the Space bar. This sets the virtual machine to boot from the attached ISO file.&lt;br&gt;
13.On the Microsoft Server Operating System Setup page, accept the defaults and click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
14.On the Install now page, click &lt;strong&gt;Install now&lt;/strong&gt;.&lt;br&gt;
15.On the Microsoft Server Operating System Setup page, select &lt;strong&gt;Windows Server 2022 Standard Evaluation (Desktop Experience)&lt;/strong&gt; and click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
16.On the Applicable notices and license terms page, review the license and then select the &lt;strong&gt;I Accept&lt;/strong&gt; checkbox. Click &lt;strong&gt;Next&lt;/strong&gt;.&lt;br&gt;
17.On the Which type of installation do you want? page, select &lt;strong&gt;Custom&lt;/strong&gt;.&lt;br&gt;
18.On the Where do you want to install the operating system? page, select &lt;strong&gt;Drive 0&lt;/strong&gt; and click &lt;strong&gt;Next&lt;/strong&gt;. The operating system will install. This takes several minutes depending on the speed of the computer you’re using. The virtual machine will restart.&lt;br&gt;
19.On the Customize settings page, you are asked to provide a password for the built-in Administrator account. Enter the password: &lt;strong&gt;Pa55w.rdPa55w.rd&lt;/strong&gt; twice. The password is a demonstration password and shouldn’t be used on production systems. You can also choose your own password here. After you have entered the Administrator password twice, select &lt;strong&gt;Finish&lt;/strong&gt;. You won’t be connected to the running virtual machine.&lt;br&gt;
20.On the virtual machine’s lock screen, enter the Administrator password &lt;strong&gt;Pa55w.rdPa55w.rd&lt;/strong&gt; to sign in.&lt;br&gt;
21.After you have signed in, right-click the network icon, represented by a globe on the task bar, and select &lt;strong&gt;Open Network &amp;amp; Internet Settings&lt;/strong&gt;.&lt;br&gt;
22.On the Network Status page, select &lt;strong&gt;Change adapter options&lt;/strong&gt;.&lt;br&gt;
23.On the Network Connections page, right-click &lt;strong&gt;Ethernet&lt;/strong&gt; and select &lt;strong&gt;Properties&lt;/strong&gt;.&lt;br&gt;
24.On the Ethernet Properties page, select the &lt;strong&gt;Internet Protocol Version 4 (TCP/IPv4)&lt;/strong&gt; item and click &lt;strong&gt;Properties&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;25.On the General tab of the Internet Protocol Version 4 (TCP/IPv4) Properties page, set the IP address configuration as follows and click &lt;strong&gt;OK&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;a.Use the following IP address:&lt;/p&gt;

&lt;p&gt;i.IP address: 10.10.10.20&lt;br&gt;
 ii. Subnet Mask: 255.255.255.0&lt;br&gt;
iii.Default Gateway: 10.10.10.1&lt;/p&gt;

&lt;p&gt;b.Use the following DNS server addresses:&lt;br&gt;
  i.Preferred DNS server: 10.10.10.10&lt;br&gt;
 ii.Alternate DNS server: 8.8.8.8&lt;br&gt;
26.Click &lt;strong&gt;Close&lt;/strong&gt;. When queried about whether you want to allow the computer to be discoverable, select &lt;strong&gt;Yes&lt;/strong&gt;.&lt;br&gt;
27.From the Start menu, open Server Manager, select &lt;strong&gt;Local Server&lt;/strong&gt; and then select the Computer Name. This opens the System Properties dialog box. On the Computer Name page of the System Properties dialog box, select &lt;strong&gt;Change&lt;/strong&gt;.&lt;br&gt;
28.On the Computer Name/Domain Changes dialog box, set the computer name to &lt;strong&gt;TAILWIND-MBR1&lt;/strong&gt; and then click &lt;strong&gt;OK&lt;/strong&gt;.&lt;br&gt;
29.On the dialog informing you that you need to restart your computer, click &lt;strong&gt;OK&lt;/strong&gt;.&lt;br&gt;
30.On the System Properties dialog box, click &lt;strong&gt;Close&lt;/strong&gt;.&lt;br&gt;
31.On the You must restart your computer to apply these changes dialog box, click &lt;strong&gt;Restart Now&lt;/strong&gt;. The computer will restart.&lt;br&gt;
32.When the computer has restarted, sign in as Administrator with the password you configured during installation.&lt;br&gt;
33.In the Server Manager console, select the Local Server section. In the Local Server section, select TAILWIND-MBR1 next to Computer Name. this opens the System Properties dialog box.&lt;br&gt;
34.On the System Properties dialog box, click &lt;strong&gt;Change&lt;/strong&gt;.&lt;br&gt;
35.On the Computer Name/Domain Changes dialog box, select &lt;strong&gt;Domain under Member of&lt;/strong&gt;, enter the domain name &lt;strong&gt;TAILWINDTRADERS&lt;/strong&gt;, and click &lt;strong&gt;OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fudoaach5bz4utdo6z59i.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%2Fudoaach5bz4utdo6z59i.png" alt="memberofdomain" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;36.On the Computer Name/Domain Changes dialog box, enter the following username and password and click OK:&lt;/p&gt;

&lt;p&gt;a.Username: TAILWINDTRADERS\Administrator&lt;br&gt;
b.Password: Pa55w.rdPa55w.rd&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%2Farndmq3lj1lp7sc345ip.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%2Farndmq3lj1lp7sc345ip.png" alt="admin" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;37.Momentarily, the Welcome to the Tailwintraders domain dialog will appear. Click &lt;strong&gt;OK&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fju4leeiztpykmxvmzctu.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%2Fju4leeiztpykmxvmzctu.png" alt="ok" width="571" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;38.On the System Properties dialog box, click &lt;strong&gt;Close&lt;/strong&gt;.&lt;br&gt;
39.On the dialog asking you to restart the computer, click &lt;strong&gt;Restart Now&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;This project provides practical experience building and administering a Windows Server infrastructure environment.&lt;br&gt;
Hyper-V was used to create an isolated virtual environment for deploying Windows Server 2022.&lt;br&gt;
A dedicated NAT network was configured to enable communication between the virtual machines and external networks.&lt;br&gt;
TAILWIND-DC1 was successfully configured as an Active Directory Domain Controller.&lt;br&gt;
The tailwindtraders.internal domain demonstrated centralized identity and authentication management.&lt;br&gt;
TAILWIND-MBR1 was configured as a domain member server and joined to the organizational domain.&lt;br&gt;
Overall, the lab strengthens practical skills in Hyper-V, networking, Active Directory, DNS, and Windows Server administration.&lt;/p&gt;

</description>
      <category>sysadmin</category>
      <category>virtualization</category>
      <category>activedirectory</category>
      <category>windowserver</category>
    </item>
    <item>
      <title>YAML Learning Lab</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Tue, 04 Aug 2026 15:45:17 +0000</pubDate>
      <link>https://dev.to/rahimah_dev/yaml-learning-lab-1lh7</link>
      <guid>https://dev.to/rahimah_dev/yaml-learning-lab-1lh7</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;YAML is one of the most widely used configuration and data serialization formats across modern cloud engineering, DevOps, automation, and CI/CD environments.&lt;/p&gt;

&lt;p&gt;From GitHub Actions workflows to Kubernetes manifests and infrastructure configuration, YAML provides a human-readable way to represent structured data while remaining easy for machines to process.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;YAML Learning Lab&lt;/strong&gt; is a practical technical repository focused on YAML syntax, structured data representation, configuration patterns, validation, and its application within modern DevOps workflows.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/rahimahisah17/yaml-learning-lab" rel="noopener noreferrer"&gt;YAML Learning Lab&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  A Brief History of YAML
&lt;/h2&gt;

&lt;p&gt;YAML was created in &lt;strong&gt;2001&lt;/strong&gt; by &lt;strong&gt;Clark Evans, Ingy döt Net, and Oren Ben-Kiki&lt;/strong&gt; as a human-friendly data serialization language.&lt;/p&gt;

&lt;p&gt;The name &lt;strong&gt;YAML&lt;/strong&gt; originally stood for &lt;strong&gt;"Yet Another Markup Language."&lt;/strong&gt; It was later reinterpreted as &lt;strong&gt;"YAML Ain't Markup Language"&lt;/strong&gt;, emphasizing that YAML is a &lt;strong&gt;data serialization language&lt;/strong&gt;, rather than a markup language.&lt;/p&gt;

&lt;p&gt;This distinction is important.&lt;/p&gt;

&lt;p&gt;Markup languages such as HTML are primarily concerned with describing the structure and presentation of documents, while YAML focuses on representing structured information and configuration in a format that is readable by both humans and machines.&lt;/p&gt;

&lt;p&gt;Today, YAML is widely used in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud configuration&lt;/li&gt;
&lt;li&gt;CI/CD pipelines&lt;/li&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;li&gt;Infrastructure as Code&lt;/li&gt;
&lt;li&gt;Application configuration&lt;/li&gt;
&lt;li&gt;Automation&lt;/li&gt;
&lt;li&gt;DevOps tooling&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Project Overview
&lt;/h2&gt;

&lt;p&gt;The repository brings together practical YAML examples covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Key-value pairs&lt;/li&gt;
&lt;li&gt;Mappings&lt;/li&gt;
&lt;li&gt;Nested structures&lt;/li&gt;
&lt;li&gt;Sequences&lt;/li&gt;
&lt;li&gt;Lists of objects&lt;/li&gt;
&lt;li&gt;Data types&lt;/li&gt;
&lt;li&gt;Comments&lt;/li&gt;
&lt;li&gt;Quoted strings&lt;/li&gt;
&lt;li&gt;Multiline strings&lt;/li&gt;
&lt;li&gt;Anchors and aliases&lt;/li&gt;
&lt;li&gt;Merge keys&lt;/li&gt;
&lt;li&gt;Multi-document YAML&lt;/li&gt;
&lt;li&gt;GitHub Actions workflows&lt;/li&gt;
&lt;li&gt;YAML validation with Python and PyYAML&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project demonstrates how YAML syntax translates into structured configuration used by modern engineering tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  Project Setup
&lt;/h2&gt;

&lt;p&gt;The project was organized as a Git repository with individual YAML files representing different concepts.&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%2Fh36b3u7ncri3ljadvmaa.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%2Fh36b3u7ncri3ljadvmaa.png" alt="Project setup" width="800" height="91"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository structure keeps each concept isolated while also providing a final configuration challenge that combines multiple YAML features.&lt;/p&gt;




&lt;h2&gt;
  
  
  YAML Fundamentals
&lt;/h2&gt;

&lt;p&gt;The first examples introduce YAML's basic key-value structure.&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;Raphael&lt;/span&gt;
&lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Cloud Engineer&lt;/span&gt;
&lt;span class="na"&gt;country&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Nigeria&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A YAML mapping associates each key with a value:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Raphael&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;role&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Cloud Engineer&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;country&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Nigeria&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This simple structure is the foundation for more complex YAML configurations.&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%2Fd7mrmkgbfpqts0ns36sp.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%2Fd7mrmkgbfpqts0ns36sp.png" alt="YAML basics" width="799" height="185"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Mappings and Nested Structures
&lt;/h2&gt;

&lt;p&gt;YAML uses indentation to represent relationships between data elements.&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 yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;person&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;Raphael&lt;/span&gt;
  &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Cloud Engineer&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;name&lt;/code&gt; and &lt;code&gt;role&lt;/code&gt; are properties nested under &lt;code&gt;person&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Nested structures allow configuration to represent relationships between related pieces of information without requiring complex syntax.&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%2Fj6avg3oivlyeue3ofhzb.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%2Fj6avg3oivlyeue3ofhzb.png" alt="Mappings" width="798" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nested mappings extend this idea by allowing multiple levels of configuration:&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;person&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;Raphael&lt;/span&gt;
  &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;
  &lt;span class="na"&gt;country&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Nigeria&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjgvqxqfq8pacz0drzy61.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%2Fjgvqxqfq8pacz0drzy61.png" alt="Nested mappings" width="799" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One important YAML rule becomes obvious here:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Indentation defines structure.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;YAML configuration should use spaces for indentation rather than tabs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sequences
&lt;/h2&gt;

&lt;p&gt;YAML sequences represent ordered collections.&lt;/p&gt;

&lt;p&gt;They are identified using a hyphen (&lt;code&gt;-&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;skills&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Azure&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Docker&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Kubernetes&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Git&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a list of four values under the &lt;code&gt;skills&lt;/code&gt; key.&lt;/p&gt;

&lt;p&gt;Sequences are common in configuration files for representing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Packages&lt;/li&gt;
&lt;li&gt;Ports&lt;/li&gt;
&lt;li&gt;Hosts&lt;/li&gt;
&lt;li&gt;Skills&lt;/li&gt;
&lt;li&gt;Resources&lt;/li&gt;
&lt;li&gt;Configuration options&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fetpkfuytirpn94u5earh.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%2Fetpkfuytirpn94u5earh.png" alt="Sequences" width="800" height="231"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Lists of Objects
&lt;/h2&gt;

&lt;p&gt;YAML sequences can contain mappings, making it possible to represent collections of structured objects.&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;employees&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;Raphael&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Cloud Engineer&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;Sarah&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DevOps Engineer&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;David&lt;/span&gt;
    &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Solution Architect&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each list item contains multiple properties.&lt;/p&gt;

&lt;p&gt;This pattern is particularly useful when configuration describes multiple resources that share a common structure.&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%2Fbbltgh6bfvhlmmp1d65v.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%2Fbbltgh6bfvhlmmp1d65v.png" alt="Lists of objects" width="800" height="246"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  YAML Data Types
&lt;/h2&gt;

&lt;p&gt;YAML supports several common data types.&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;person&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;Raphael&lt;/span&gt;
  &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;
  &lt;span class="na"&gt;salary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4500.50&lt;/span&gt;
  &lt;span class="na"&gt;active&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;verified&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;phone&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These values represent different data types:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Raphael&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;String&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;30&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Integer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;4500.50&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Floating-point number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Boolean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Null&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Understanding how YAML interprets values is important when configuration is consumed by automation tools or programming languages.&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%2Fuid0zvuml89dgfrilpw1.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%2Fuid0zvuml89dgfrilpw1.png" alt="YAML data types" width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Comments and Quoted Strings
&lt;/h2&gt;

&lt;p&gt;Comments begin with &lt;code&gt;#&lt;/code&gt; and are ignored by YAML parsers.&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="c1"&gt;# Employee Information Configuration&lt;/span&gt;
&lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Lagos&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comments are useful for documenting configuration and explaining why a particular value or section exists.&lt;/p&gt;

&lt;p&gt;YAML also supports quoted strings:&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;message&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Welcome:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Cloud&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Engineers!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quoting can make the intended value explicit, particularly when a value contains characters that could otherwise be interpreted specially.&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%2Frkvpslqo8p0fp67dqwq0.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%2Frkvpslqo8p0fp67dqwq0.png" alt="Comments and strings" width="800" height="158"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Multiline Strings
&lt;/h2&gt;

&lt;p&gt;YAML provides block scalar syntax for storing multiline text.&lt;/p&gt;

&lt;p&gt;There are two important styles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;|&lt;/code&gt; — literal block&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;gt;&lt;/code&gt; — folded block&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Literal Block
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;|&lt;/code&gt; character preserves line breaks.&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;bio_literal&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
  &lt;span class="s"&gt;I enjoy learning Azure.&lt;/span&gt;
  &lt;span class="s"&gt;I build cloud solutions.&lt;/span&gt;
  &lt;span class="s"&gt;I teach DevOps.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Folded Block
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;&amp;gt;&lt;/code&gt; character folds consecutive lines into a paragraph-like value.&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;bio_folded&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="s"&gt;I enjoy learning Azure.&lt;/span&gt;
  &lt;span class="s"&gt;I build cloud solutions.&lt;/span&gt;
  &lt;span class="s"&gt;I teach DevOps.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difference matters when YAML is being used to store scripts, documentation, certificates, configuration blocks, or other multiline content.&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%2Flwsbl14z2i6a0vcpnknn.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%2Flwsbl14z2i6a0vcpnknn.png" alt="Multiline strings" width="800" height="273"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Anchors, Aliases, and Merge Keys
&lt;/h2&gt;

&lt;p&gt;YAML provides anchors and aliases for reusing configuration without repeatedly defining the same values.&lt;/p&gt;

&lt;p&gt;An anchor is created using &lt;code&gt;&amp;amp;&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;defaults&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;&amp;amp;default&lt;/span&gt;
  &lt;span class="na"&gt;country&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Nigeria&lt;/span&gt;
  &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Student&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The configuration can then be reused using an alias:&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;student1&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;*default&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;Raphael&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt; merge key incorporates the values from the anchored mapping.&lt;/p&gt;

&lt;p&gt;Another object can reuse the same configuration:&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;student2&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;*default&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;Sarah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach reduces duplication and makes shared configuration easier to maintain.&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%2F6hqu2id65h21n5cqnje3.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%2F6hqu2id65h21n5cqnje3.png" alt="Anchors and aliases" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Multi-Document YAML
&lt;/h2&gt;

&lt;p&gt;A YAML file can contain multiple independent documents.&lt;/p&gt;

&lt;p&gt;The document separator is:&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="nn"&gt;---&lt;/span&gt;
&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 yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;student1&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;Raphael&lt;/span&gt;

&lt;span class="nn"&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;Third Document Stream&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The separator marks the beginning of another YAML document.&lt;/p&gt;

&lt;p&gt;This becomes important during validation because a file containing multiple documents must be parsed accordingly.&lt;/p&gt;

&lt;p&gt;The repository demonstrates this concept in &lt;code&gt;anchors.yaml&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  YAML in GitHub Actions
&lt;/h2&gt;

&lt;p&gt;YAML is heavily used in CI/CD systems.&lt;/p&gt;

&lt;p&gt;The repository includes a GitHub Actions workflow:&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;Build Project&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;jobs&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;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;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;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;echo "Building project..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The workflow demonstrates several important GitHub Actions concepts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow Name
&lt;/h3&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;Build Project&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Defines the workflow's name.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trigger
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Specifies that the workflow runs when changes are pushed to the repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Job
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;jobs&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Defines a job named &lt;code&gt;build&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Runner
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Specifies the GitHub-hosted runner that executes the job.&lt;/p&gt;

&lt;h3&gt;
  
  
  Steps
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&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;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;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;echo "Building project..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first step checks out the repository contents.&lt;/p&gt;

&lt;p&gt;The second executes a shell command.&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%2F3sg2ocjibza2jmnjxo02.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%2F3sg2ocjibza2jmnjxo02.png" alt="GitHub Actions workflow" width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Configuration Challenge
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;student-profile.yaml&lt;/code&gt; configuration combines several YAML concepts into one structured document.&lt;/p&gt;

&lt;p&gt;It includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mappings&lt;/li&gt;
&lt;li&gt;Nested mappings&lt;/li&gt;
&lt;li&gt;Sequences&lt;/li&gt;
&lt;li&gt;Strings&lt;/li&gt;
&lt;li&gt;Integers&lt;/li&gt;
&lt;li&gt;Floating-point numbers&lt;/li&gt;
&lt;li&gt;Booleans&lt;/li&gt;
&lt;li&gt;Multiline strings&lt;/li&gt;
&lt;li&gt;Folded strings&lt;/li&gt;
&lt;li&gt;Anchors&lt;/li&gt;
&lt;li&gt;Aliases&lt;/li&gt;
&lt;li&gt;Merge keys&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The shared configuration begins with an anchor:&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;default_profile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nl"&gt;&amp;amp;default&lt;/span&gt;
  &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Student&lt;/span&gt;
  &lt;span class="na"&gt;country&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Nigeria&lt;/span&gt;
  &lt;span class="na"&gt;active&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;score&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;95.5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The configuration is then reused:&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;user1&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;*default&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;Sarah&lt;/span&gt;

&lt;span class="na"&gt;user2&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;*default&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;David&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file also contains sequences:&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;skills&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Azure&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Docker&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Kubernetes&lt;/span&gt;

&lt;span class="na"&gt;hobbies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Coding&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Reading&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nested mappings:&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;address&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;street&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;12 Cloud Way&lt;/span&gt;
  &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Abuja&lt;/span&gt;
  &lt;span class="na"&gt;country&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Nigeria&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And both multiline string styles:&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;bio_literal&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
  &lt;span class="s"&gt;I enjoy learning Azure.&lt;/span&gt;
  &lt;span class="s"&gt;I build cloud solutions.&lt;/span&gt;
  &lt;span class="s"&gt;I teach DevOps.&lt;/span&gt;

&lt;span class="na"&gt;bio_folded&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="s"&gt;I enjoy learning Azure.&lt;/span&gt;
  &lt;span class="s"&gt;I build cloud solutions.&lt;/span&gt;
  &lt;span class="s"&gt;I teach DevOps.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fab26vcb3uhixs140qxcm.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%2Fab26vcb3uhixs140qxcm.png" alt="Student profile configuration" width="633" height="861"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This configuration demonstrates how multiple YAML structures can be combined to represent realistic configuration data.&lt;/p&gt;




&lt;h2&gt;
  
  
  YAML Validation
&lt;/h2&gt;

&lt;p&gt;Configuration should be validated before being used by automation systems.&lt;/p&gt;

&lt;p&gt;This repository uses &lt;strong&gt;Python&lt;/strong&gt;, &lt;strong&gt;PyYAML&lt;/strong&gt;, and Linux command-line tools to validate the YAML files.&lt;/p&gt;

&lt;h3&gt;
  
  
  Validate All YAML Documents
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'import yaml, glob; [list(yaml.safe_load_all(open(f))) for f in glob.glob("*.yaml")]; print("All YAML files valid!")'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ol&gt;
&lt;li&gt;Starts Python 3 using &lt;code&gt;python3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Uses &lt;code&gt;-c&lt;/code&gt; to execute Python code directly from the command line.&lt;/li&gt;
&lt;li&gt;Imports the PyYAML library with &lt;code&gt;import yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Imports Python's &lt;code&gt;glob&lt;/code&gt; module with &lt;code&gt;import glob&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Uses &lt;code&gt;glob.glob("*.yaml")&lt;/code&gt; to find every &lt;code&gt;.yaml&lt;/code&gt; file in the current directory.&lt;/li&gt;
&lt;li&gt;Uses &lt;code&gt;open(f)&lt;/code&gt; to open each YAML file.&lt;/li&gt;
&lt;li&gt;Uses &lt;code&gt;yaml.safe_load_all()&lt;/code&gt; to parse all YAML documents within each file.&lt;/li&gt;
&lt;li&gt;Uses &lt;code&gt;list()&lt;/code&gt; to force all documents to be parsed.&lt;/li&gt;
&lt;li&gt;Uses a list comprehension to apply the validation to every YAML file.&lt;/li&gt;
&lt;li&gt;Uses &lt;code&gt;print()&lt;/code&gt; to display a success message after all files are parsed successfully.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The use of &lt;code&gt;safe_load_all()&lt;/code&gt; is important because &lt;code&gt;anchors.yaml&lt;/code&gt; contains multiple YAML documents separated by &lt;code&gt;---&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check for Illegal Tab Characters
&lt;/h3&gt;

&lt;p&gt;YAML indentation should use spaces rather than tabs.&lt;/p&gt;

&lt;p&gt;The repository also checks for tab characters:&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;grep&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;$'&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;.yaml &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'No illegal tab characters found!'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;grep&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Searches files for a specified pattern.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-n&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Displays the line number where a match is found.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;$'\t'&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Represents a tab character in Bash.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;*.yaml&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Targets all &lt;code&gt;.yaml&lt;/code&gt; files in the current directory.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{% raw %}&lt;code&gt;echo&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Prints text to the terminal.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If no tabs are detected, the command prints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;No illegal tab characters found!
&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%2Fsi9rcqydb3zu619x16u2.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%2Fsi9rcqydb3zu619x16u2.png" alt="YAML validation" width="798" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These checks provide basic validation for both YAML syntax and indentation consistency.&lt;/p&gt;




&lt;h2&gt;
  
  
  Git and Repository Management
&lt;/h2&gt;

&lt;p&gt;The project was maintained using Git and published to GitHub.&lt;/p&gt;

&lt;p&gt;Git was used to track changes, create commits, maintain the &lt;code&gt;main&lt;/code&gt; branch, and synchronize the repository with GitHub.&lt;/p&gt;

&lt;p&gt;The final repository includes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yaml-learning-lab/
├── docs/
│   └── lessons.md
├── screenshots/
├── README.md
├── anchors.yaml
├── lesson1.yaml
├── lesson2.yaml
├── lesson3.yaml
├── lesson4.yaml
├── lesson5.yaml
├── lesson6.yaml
├── lesson7.yaml
├── multiline.yaml
├── student-profile.yaml
└── workflow.yaml
&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%2Ficyhtvz02vmoh0otiyx6.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%2Ficyhtvz02vmoh0otiyx6.png" alt="Git history and status" width="800" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The complete implementation, documentation, YAML files, and supporting evidence are available in the repository:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/rahimahisah17/yaml-learning-lab" rel="noopener noreferrer"&gt;View the YAML Learning Lab on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why YAML Matters in Cloud and DevOps
&lt;/h2&gt;

&lt;p&gt;YAML is more than a configuration format. It is an important component of modern engineering workflows.&lt;/p&gt;

&lt;p&gt;The concepts demonstrated in this repository appear in technologies such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Actions&lt;/li&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;li&gt;Docker Compose&lt;/li&gt;
&lt;li&gt;Ansible&lt;/li&gt;
&lt;li&gt;Azure DevOps&lt;/li&gt;
&lt;li&gt;Infrastructure as Code tools&lt;/li&gt;
&lt;li&gt;Application configuration systems&lt;/li&gt;
&lt;li&gt;Cloud automation platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same fundamental ideas—mappings, sequences, nesting, data types, multiline values, and reusable configuration—appear repeatedly across these technologies.&lt;/p&gt;

&lt;p&gt;Understanding YAML therefore makes it easier to read, write, troubleshoot, and maintain configuration-driven systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;YAML Learning Lab&lt;/strong&gt; demonstrates how YAML progresses from simple key-value pairs to structured configuration used in real-world DevOps environments.&lt;/p&gt;

&lt;p&gt;The repository covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;YAML syntax and structure&lt;/li&gt;
&lt;li&gt;Mappings and nested mappings&lt;/li&gt;
&lt;li&gt;Sequences and lists of objects&lt;/li&gt;
&lt;li&gt;Data types&lt;/li&gt;
&lt;li&gt;Comments and quoted strings&lt;/li&gt;
&lt;li&gt;Literal and folded multiline strings&lt;/li&gt;
&lt;li&gt;Anchors, aliases, and merge keys&lt;/li&gt;
&lt;li&gt;Multi-document YAML streams&lt;/li&gt;
&lt;li&gt;GitHub Actions workflow configuration&lt;/li&gt;
&lt;li&gt;YAML validation using Python and PyYAML&lt;/li&gt;
&lt;li&gt;Git-based project management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project also demonstrates an important engineering principle:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Configuration should be readable, structured, reusable, and validated before it becomes part of an automation workflow.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;YAML Learning Lab&lt;/strong&gt; provides a practical technical reference for YAML and its role in cloud engineering and DevOps.&lt;/p&gt;

&lt;p&gt;From basic mappings and sequences to anchors, multiline strings, GitHub Actions, and automated validation, the repository brings together core YAML patterns required for working with configuration-driven tooling.&lt;/p&gt;

&lt;p&gt;More importantly, the project demonstrates YAML in context—not simply as a file format, but as a foundational component of modern &lt;strong&gt;cloud, DevOps, automation, and CI/CD workflows&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For the complete implementation, configuration files, technical documentation, and supporting evidence:&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;&lt;a href="https://github.com/rahimahisah17/yaml-learning-lab" rel="noopener noreferrer"&gt;YAML Learning Lab — GitHub Repository&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Author
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Rahimah Sulayman&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cloud &amp;amp; DevOps Engineer | Data Analyst&lt;/p&gt;

</description>
      <category>python</category>
      <category>pyyaml</category>
      <category>yaml</category>
      <category>git</category>
    </item>
    <item>
      <title>Dockerfiles: Building and Running a Node.js Application in a Container</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Wed, 29 Jul 2026 12:02:53 +0000</pubDate>
      <link>https://dev.to/rahimah_dev/dockerfiles-building-and-running-a-nodejs-application-in-a-container-bfk</link>
      <guid>https://dev.to/rahimah_dev/dockerfiles-building-and-running-a-nodejs-application-in-a-container-bfk</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Containers provide a consistent way to package applications together with the dependencies and configuration required to run them.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;Dockerfile&lt;/strong&gt; defines how that container image is built.&lt;/p&gt;

&lt;p&gt;In this project, a Node.js application was containerized using a custom Dockerfile, with the image built, tested, inspected, modified, and rebuilt throughout the implementation.&lt;/p&gt;

&lt;p&gt;The project demonstrates how Dockerfile instructions influence the resulting image and, ultimately, the behavior of the running container.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is a Dockerfile?
&lt;/h2&gt;

&lt;p&gt;A Dockerfile is a text file containing a sequence of instructions Docker uses to build an image.&lt;/p&gt;

&lt;p&gt;A simplified workflow 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;Application Source Code
        │
        ▼
    Dockerfile
        │
        │ docker build
        ▼
   Docker Image
        │
        │ docker run
        ▼
 Docker Container
        │
        ▼
 Running Application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Dockerfile describes the environment and instructions required to turn application source code into a runnable container image.&lt;/p&gt;




&lt;h2&gt;
  
  
  Dockerfile vs Docker Image vs Container
&lt;/h2&gt;

&lt;p&gt;These three concepts are closely related but serve different purposes.&lt;/p&gt;

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

&lt;p&gt;The &lt;strong&gt;Dockerfile&lt;/strong&gt; is the build blueprint.&lt;/p&gt;

&lt;p&gt;It defines instructions such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;
&lt;span class="k"&gt;RUN
&lt;/span&gt;EXPOSE
&lt;span class="k"&gt;CMD&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Docker Image
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;image&lt;/strong&gt; is the built artifact produced from the Dockerfile.&lt;/p&gt;

&lt;p&gt;It contains the application, dependencies, filesystem layers, and configuration required to create a container.&lt;/p&gt;

&lt;h3&gt;
  
  
  Docker Container
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;container&lt;/strong&gt; is a running instance of an image.&lt;/p&gt;

&lt;p&gt;In simple terms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dockerfile
    │
    │ docker build
    ▼
Docker Image
    │
    │ docker run
    ▼
Docker Container
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Project Overview
&lt;/h2&gt;

&lt;p&gt;The application used for this project is a simple Node.js web application.&lt;/p&gt;

&lt;p&gt;The containerized application consists of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A Node.js application&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;server.js&lt;/code&gt; entry point&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;package.json&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Installed Node.js dependencies&lt;/li&gt;
&lt;li&gt;A Dockerfile defining the image build process&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Dockerfile is responsible for packaging these components into a reproducible container image.&lt;/p&gt;




&lt;h2&gt;
  
  
  Project Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dockerfiles-lab/
├── screenshots/
├── .gitignore
├── Dockerfile
├── package.json
├── package-lock.json
├── README.md
└── server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repository also contains implementation screenshots documenting the different stages of the Dockerfile and container lifecycle.&lt;/p&gt;

&lt;p&gt;The complete implementation is available in the GitHub repository linked at the end of this article.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Node.js Application
&lt;/h1&gt;

&lt;p&gt;Before building the container, there needs to be an application for Docker to package.&lt;/p&gt;

&lt;p&gt;The application entry point is:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;A simplified Node.js server can look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http&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;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createServer&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;writeHead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text/plain&lt;/span&gt;&lt;span class="dl"&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;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello from Docker!&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;server&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="mi"&gt;3000&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Server running on port 3000&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application listens on port &lt;code&gt;3000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This gives Docker something concrete to package and run inside the container.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why &lt;code&gt;package.json&lt;/code&gt; Matters
&lt;/h1&gt;

&lt;p&gt;The project also contains:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;For Node.js applications, &lt;code&gt;package.json&lt;/code&gt; provides project metadata and dependency information.&lt;/p&gt;

&lt;p&gt;It can also define scripts used to start or manage the application.&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 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;"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 server.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;p&gt;The associated lock file:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;records the resolved dependency versions.&lt;/p&gt;

&lt;p&gt;Together, these files make the Node.js application's dependencies and runtime configuration reproducible.&lt;/p&gt;




&lt;h1&gt;
  
  
  Building the First Docker Image
&lt;/h1&gt;

&lt;p&gt;The first stage of the implementation involved building a Docker image from the Dockerfile.&lt;/p&gt;

&lt;p&gt;The basic command is:&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; docker-node-app:1.0 &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The components of the command are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker build
     │
     ├── -t docker-node-app:1.0
     │       └── image name and tag
     │
     └── .
         └── current directory as build context
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;.&lt;/code&gt; tells Docker to use the current directory as the &lt;strong&gt;build context&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This makes files in the project directory available to Docker during the build, subject to &lt;code&gt;.dockerignore&lt;/code&gt; rules where applicable.&lt;/p&gt;




&lt;h1&gt;
  
  
  Understanding the Dockerfile
&lt;/h1&gt;

&lt;p&gt;A Dockerfile is processed from top to bottom.&lt;/p&gt;

&lt;p&gt;A typical Node.js Dockerfile can contain instructions such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20-alpine&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Each instruction has a specific purpose.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;FROM&lt;/code&gt;: Choosing the Base Image
&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:20-alpine&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;FROM&lt;/code&gt; specifies the base image from which the new image is built.&lt;/p&gt;

&lt;p&gt;For a Node.js application, using a Node.js base image provides the Node.js runtime and supporting environment required to execute the application.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;alpine&lt;/code&gt; variant is based on Alpine Linux and is commonly used when a smaller image footprint is desirable.&lt;/p&gt;

&lt;p&gt;The base image is therefore the starting point for the container environment.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;WORKDIR&lt;/code&gt;: Setting the Working Directory
&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;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;WORKDIR&lt;/code&gt; establishes the working directory for subsequent Dockerfile instructions.&lt;/p&gt;

&lt;p&gt;Instead of placing application files throughout the container filesystem, the application can be organized under:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;It also determines the default working directory when the container starts unless another directory is explicitly configured.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;COPY&lt;/code&gt;: Adding Application Files
&lt;/h2&gt;

&lt;p&gt;The application files need to be transferred from the build context into the image.&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 docker"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This copies the Node.js package definition files into the working directory.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;copies the remaining application files into the image.&lt;/p&gt;

&lt;p&gt;This separation is useful because dependency installation and application source code can be handled as separate build layers.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;RUN&lt;/code&gt;: Installing Dependencies
&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;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;RUN&lt;/code&gt; executes a command while the image is being built.&lt;/p&gt;

&lt;p&gt;Here, npm installs the dependencies defined by the Node.js project.&lt;/p&gt;

&lt;p&gt;The resulting files become part of the image layer produced by this instruction.&lt;/p&gt;

&lt;p&gt;This is different from &lt;code&gt;CMD&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;RUN&lt;/code&gt; happens during &lt;strong&gt;image build time&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  &lt;code&gt;EXPOSE&lt;/code&gt;: Documenting the Application Port
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Node.js application listens on port &lt;code&gt;3000&lt;/code&gt;, so the Dockerfile declares:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is important to understand that &lt;code&gt;EXPOSE&lt;/code&gt; does &lt;strong&gt;not&lt;/strong&gt; publish the port to the host by itself.&lt;/p&gt;

&lt;p&gt;It documents the port the application expects to use inside the container.&lt;/p&gt;

&lt;p&gt;Host-to-container port publishing is configured when the container is started.&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 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:3000 &lt;span class="nt"&gt;--name&lt;/span&gt; docker-node-container docker-node-app:1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The mapping is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Host                  Container
 3000       ───────►    3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  &lt;code&gt;CMD&lt;/code&gt;: Defining the Default Container Command
&lt;/h1&gt;

&lt;p&gt;One of the most important Dockerfile instructions in this project was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "server.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;CMD&lt;/code&gt; defines the default command executed when a container is started from the image.&lt;/p&gt;

&lt;p&gt;In this case, Docker starts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;inside the container.&lt;/p&gt;

&lt;p&gt;This is what launches the Node.js application.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why &lt;code&gt;CMD&lt;/code&gt; Matters
&lt;/h1&gt;

&lt;p&gt;During the implementation, the application command was changed between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "server.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "app.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This demonstrated an important container behavior.&lt;/p&gt;

&lt;p&gt;If the file referenced by &lt;code&gt;CMD&lt;/code&gt; does not exist in the image, the container cannot successfully start the application.&lt;/p&gt;

&lt;p&gt;This can result in a container that starts and immediately exits.&lt;/p&gt;

&lt;p&gt;For example, if the Dockerfile contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "app.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;but the image does not contain:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Node.js cannot execute the requested entry point.&lt;/p&gt;

&lt;p&gt;This is why examining container logs is an important troubleshooting step.&lt;/p&gt;




&lt;h1&gt;
  
  
  Building After a Dockerfile Change
&lt;/h1&gt;

&lt;p&gt;A Docker image is a built artifact.&lt;/p&gt;

&lt;p&gt;Changing the Dockerfile does not automatically modify an existing image.&lt;/p&gt;

&lt;p&gt;After making changes, the image must be rebuilt:&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; docker-node-app:2.0 &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a new image version containing the updated Dockerfile instructions.&lt;/p&gt;

&lt;p&gt;The general workflow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Modify Dockerfile
       │
       ▼
docker build
       │
       ▼
New Image
       │
       ▼
docker run
       │
       ▼
Test Application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This build-test cycle was repeated during the project to validate changes to the container configuration.&lt;/p&gt;




&lt;h1&gt;
  
  
  Inspecting Docker Images
&lt;/h1&gt;

&lt;p&gt;After building an image, available images can be inspected with:&lt;br&gt;
&lt;/p&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;This provides information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository&lt;/li&gt;
&lt;li&gt;Tag&lt;/li&gt;
&lt;li&gt;Image ID&lt;/li&gt;
&lt;li&gt;Creation time&lt;/li&gt;
&lt;li&gt;Image size&lt;/li&gt;
&lt;/ul&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;REPOSITORY       TAG       IMAGE ID       CREATED        SIZE
docker-node-app  1.0       abc123...      ...            ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tags such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1.0
2.0
final
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can be used to distinguish different image versions during development and testing.&lt;/p&gt;




&lt;h1&gt;
  
  
  Running the Container
&lt;/h1&gt;

&lt;p&gt;Once the image has been built, it can be started with:&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; 3000:3000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; docker-node-container &lt;span class="se"&gt;\&lt;/span&gt;
  docker-node-app:final
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important options are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Runs the container in detached mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-p 3000:3000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Maps host port 3000 to container port 3000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--name&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Assigns a name to the container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker-node-app:final&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Specifies the image to run&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The application can then be accessed from the host through:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Verifying a Running Container
&lt;/h1&gt;

&lt;p&gt;After starting the container, its status can be checked with:&lt;br&gt;
&lt;/p&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;This displays currently running containers.&lt;/p&gt;

&lt;p&gt;Typical information includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Container ID&lt;/li&gt;
&lt;li&gt;Image&lt;/li&gt;
&lt;li&gt;Command&lt;/li&gt;
&lt;li&gt;Creation time&lt;/li&gt;
&lt;li&gt;Status&lt;/li&gt;
&lt;li&gt;Port mappings&lt;/li&gt;
&lt;li&gt;Container name&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The port mapping should show that host port &lt;code&gt;3000&lt;/code&gt; is forwarded to port &lt;code&gt;3000&lt;/code&gt; inside the container.&lt;/p&gt;




&lt;h1&gt;
  
  
  Testing the Application
&lt;/h1&gt;

&lt;p&gt;Once the container is running, the application can be accessed through a browser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point, the request flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
   │
   │ localhost:3000
   ▼
Host Port 3000
   │
   │ Docker port mapping
   ▼
Container Port 3000
   │
   ▼
Node.js
   │
   ▼
server.js
   │
   ▼
HTTP Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This demonstrates the relationship between the host, container networking, and the application process.&lt;/p&gt;




&lt;h1&gt;
  
  
  Troubleshooting a Failed Container
&lt;/h1&gt;

&lt;p&gt;Not every container starts successfully on the first attempt.&lt;/p&gt;

&lt;p&gt;During the implementation, an invalid application entry point was used to demonstrate container troubleshooting.&lt;/p&gt;

&lt;p&gt;A failed run can be identified using:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Unlike &lt;code&gt;docker ps&lt;/code&gt;, the &lt;code&gt;-a&lt;/code&gt; option also displays stopped containers.&lt;/p&gt;

&lt;p&gt;This is particularly useful when a container starts and then exits immediately.&lt;/p&gt;




&lt;h1&gt;
  
  
  Using Docker Logs for Troubleshooting
&lt;/h1&gt;

&lt;p&gt;When a container fails, logs are often the fastest way to determine why.&lt;/p&gt;

&lt;p&gt;The logs can be viewed with:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;For example, if the Dockerfile attempts to execute a file that does not exist:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "app.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Node.js may report that it cannot find the specified module.&lt;/p&gt;

&lt;p&gt;The important troubleshooting pattern is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Container exits
      │
      ▼
docker ps -a
      │
      ▼
Identify exited container
      │
      ▼
docker logs &amp;lt;container&amp;gt;
      │
      ▼
Identify application/configuration error
      │
      ▼
Fix Dockerfile or application
      │
      ▼
Rebuild image
      │
      ▼
Run container again
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This workflow is useful well beyond simple Docker labs.&lt;/p&gt;




&lt;h1&gt;
  
  
  Stopping and Removing a Container
&lt;/h1&gt;

&lt;p&gt;Once a container is no longer needed, it can be stopped and removed with:&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 docker-node-container &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker &lt;span class="nb"&gt;rm &lt;/span&gt;docker-node-container
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first command:&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 docker-node-container
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;stops the running container.&lt;/p&gt;

&lt;p&gt;The second:&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;docker-node-container
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;removes the stopped container.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; operator ensures the second command runs only if the first command succeeds.&lt;/p&gt;




&lt;h1&gt;
  
  
  Rebuilding and Retesting
&lt;/h1&gt;

&lt;p&gt;After correcting the Dockerfile, the image was rebuilt and the container started again.&lt;/p&gt;

&lt;p&gt;A typical sequence is:&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; docker-node-app:final &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;followed by:&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; 3000:3000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; docker-node-container &lt;span class="se"&gt;\&lt;/span&gt;
  docker-node-app:final
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&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;and finally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can be used to verify the result.&lt;/p&gt;

&lt;p&gt;This build → run → inspect → troubleshoot → rebuild cycle is fundamental to working effectively with Dockerfiles.&lt;/p&gt;




&lt;h1&gt;
  
  
  Changing Application Output
&lt;/h1&gt;

&lt;p&gt;The application response was also modified during testing.&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 javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Welcome to my Docker Node.js application!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After changing application source code, the image must be rebuilt if the source code is copied into the image during the build:&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; docker-node-app:final &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The updated image then needs to be used when starting a new container.&lt;/p&gt;

&lt;p&gt;This demonstrates an important principle:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A running container does not automatically become a new image when the source code or Dockerfile changes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The image must be rebuilt when the application contents packaged into it need to change.&lt;/p&gt;




&lt;h1&gt;
  
  
  Docker Build Cache
&lt;/h1&gt;

&lt;p&gt;Docker builds are made up of layers.&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 docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20-alpine&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Each instruction can contribute to the image's layer structure.&lt;/p&gt;

&lt;p&gt;Docker can reuse unchanged layers during subsequent builds, which can significantly improve build performance.&lt;/p&gt;

&lt;p&gt;This is one reason Dockerfiles are commonly structured to copy dependency definition files before copying the rest of the application source:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If only application source code changes, Docker may be able to reuse the dependency installation layer.&lt;/p&gt;




&lt;h1&gt;
  
  
  Dockerfile Best Practices
&lt;/h1&gt;

&lt;p&gt;A production-oriented Dockerfile should be designed with efficiency, security, and reproducibility in mind.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Use an appropriate base image
&lt;/h3&gt;

&lt;p&gt;Choose a maintained base image that provides only what the application needs.&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 docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20-alpine&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A smaller base image can reduce the image footprint and attack surface, although compatibility should always be considered.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Keep the image focused
&lt;/h3&gt;

&lt;p&gt;Only copy files required by the application.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;.dockerignore&lt;/code&gt; file can prevent unnecessary files from being included in the build context.&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 plaintext"&gt;&lt;code&gt;node_modules
.git
.env
npm-debug.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Take advantage of layer caching
&lt;/h3&gt;

&lt;p&gt;Copy dependency files before application source code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can prevent unnecessary dependency reinstallation when only source files change.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Avoid embedding secrets
&lt;/h3&gt;

&lt;p&gt;Do not place passwords, API keys, tokens, or other sensitive values directly into a Dockerfile.&lt;/p&gt;

&lt;p&gt;Use appropriate runtime configuration and secrets-management mechanisms instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Run as a non-root user
&lt;/h3&gt;

&lt;p&gt;Where appropriate, configure the container to run the application as a non-root user.&lt;/p&gt;

&lt;p&gt;This reduces the impact of a potential application compromise.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Use explicit image tags
&lt;/h3&gt;

&lt;p&gt;Rather than relying blindly on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;consider using an explicit version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:20-alpine&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes builds more predictable and reproducible.&lt;/p&gt;




&lt;h1&gt;
  
  
  Dockerfile Instructions at a Glance
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Instruction&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FROM&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Defines the base image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WORKDIR&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Sets the working directory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;COPY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Copies files into the image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RUN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Executes commands during image build&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;EXPOSE&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Documents a container port&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CMD&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Defines the default runtime command&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A useful distinction is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RUN
└── Build time

CMD
└── Container runtime
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Understanding this difference is essential when diagnosing why a container behaves differently from the image build process.&lt;/p&gt;




&lt;h1&gt;
  
  
  Dockerfile Workflow
&lt;/h1&gt;

&lt;p&gt;The complete workflow demonstrated in this project can be summarized as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application Source
       │
       ▼
   Dockerfile
       │
       │ docker build
       ▼
   Docker Image
       │
       │ docker images
       ▼
   Image Inspection
       │
       │ docker run
       ▼
 Docker Container
       │
       ├── docker ps
       │
       ├── Browser Test
       │
       └── docker logs
               │
               ▼
          Troubleshooting
               │
               ▼
        Modify Application
               │
               ▼
          Rebuild Image
               │
               ▼
        Run &amp;amp; Test Again
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This workflow provides a repeatable approach to packaging and validating containerized applications.&lt;/p&gt;




&lt;h1&gt;
  
  
  Dockerfile vs Docker Compose
&lt;/h1&gt;

&lt;p&gt;Dockerfiles and Docker Compose solve different problems, but they complement each other.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dockerfile&lt;/th&gt;
&lt;th&gt;Docker Compose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Defines how an image is built&lt;/td&gt;
&lt;td&gt;Defines how multiple services run together&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Creates a custom image&lt;/td&gt;
&lt;td&gt;Orchestrates application services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Focuses on image construction&lt;/td&gt;
&lt;td&gt;Focuses on service configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uses Dockerfile instructions&lt;/td&gt;
&lt;td&gt;Uses YAML configuration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker build&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker compose up&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;docker run&lt;/code&gt; starts the resulting image&lt;/td&gt;
&lt;td&gt;Compose manages the defined application stack&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A Dockerfile might create the image for an application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dockerfile
     │
     ▼
Application Image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docker Compose can then use that image as part of a larger application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                Docker Compose
                     │
          ┌──────────┴──────────┐
          ▼                     ▼
    Application             Database
     Container              Container
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Understanding both technologies provides a stronger foundation for building and operating containerized applications.&lt;/p&gt;




&lt;h1&gt;
  
  
  Key Docker Commands
&lt;/h1&gt;

&lt;p&gt;The primary commands used throughout the project include:&lt;/p&gt;

&lt;h3&gt;
  
  
  Build an image
&lt;/h3&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; docker-node-app:final &lt;span class="nb"&gt;.&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 images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run a container
&lt;/h3&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:3000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; docker-node-container &lt;span class="se"&gt;\&lt;/span&gt;
  docker-node-app:final
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  List running containers
&lt;/h3&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;h3&gt;
  
  
  List all containers
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;h3&gt;
  
  
  View container logs
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Stop and remove a container
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker stop docker-node-container &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; docker &lt;span class="nb"&gt;rm &lt;/span&gt;docker-node-container
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Skills Demonstrated
&lt;/h1&gt;

&lt;p&gt;This implementation demonstrates practical experience with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dockerfile authoring&lt;/li&gt;
&lt;li&gt;Docker image creation&lt;/li&gt;
&lt;li&gt;Docker image tagging&lt;/li&gt;
&lt;li&gt;Docker build context&lt;/li&gt;
&lt;li&gt;Docker build layers and caching&lt;/li&gt;
&lt;li&gt;Node.js containerization&lt;/li&gt;
&lt;li&gt;Base image selection&lt;/li&gt;
&lt;li&gt;Working directory configuration&lt;/li&gt;
&lt;li&gt;Application file management with &lt;code&gt;COPY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Dependency installation with &lt;code&gt;RUN&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Container port configuration&lt;/li&gt;
&lt;li&gt;Runtime commands with &lt;code&gt;CMD&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Docker container lifecycle management&lt;/li&gt;
&lt;li&gt;Port mapping&lt;/li&gt;
&lt;li&gt;Container inspection&lt;/li&gt;
&lt;li&gt;Container log analysis&lt;/li&gt;
&lt;li&gt;Troubleshooting failed containers&lt;/li&gt;
&lt;li&gt;Image rebuild and validation workflows&lt;/li&gt;
&lt;li&gt;Linux command-line operations&lt;/li&gt;
&lt;li&gt;Git and GitHub&lt;/li&gt;
&lt;li&gt;Technical documentation&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;A Dockerfile provides the foundation for turning application source code into a portable, reproducible container image.&lt;/p&gt;

&lt;p&gt;By defining the base runtime, working directory, application files, dependencies, exposed port, and startup command, the Dockerfile establishes how the application is packaged and executed.&lt;/p&gt;

&lt;p&gt;The implementation also demonstrates that containerization is more than simply building an image. A reliable workflow includes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build
  ↓
Run
  ↓
Inspect
  ↓
Test
  ↓
Troubleshoot
  ↓
Rebuild
  ↓
Validate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These concepts form a practical foundation for container-based application development and provide the building blocks for more advanced workflows involving Docker Compose, CI/CD pipelines, container registries, orchestration platforms, and cloud-native deployments.&lt;/p&gt;




&lt;h2&gt;
  
  
  Project Repository
&lt;/h2&gt;

&lt;p&gt;The complete implementation, Dockerfile iterations, application files, and supporting screenshots are available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rahimahisah17/dockerfiles-lab" rel="noopener noreferrer"&gt;https://github.com/rahimahisah17/dockerfiles-lab&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository provides the complete implementation and evidence of the build, run, troubleshooting, and validation process documented in this article.&lt;/p&gt;




&lt;h2&gt;
  
  
  Related Work
&lt;/h2&gt;

&lt;p&gt;This Dockerfile implementation pairs naturally with a multi-container deployment workflow using &lt;strong&gt;Docker Compose&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Docker Compose can be used to take individually containerized applications and combine them with supporting services such as databases, caches, and other dependencies into a complete application stack.&lt;/p&gt;

</description>
      <category>dockerfile</category>
      <category>node</category>
      <category>container</category>
      <category>dockerimages</category>
    </item>
  </channel>
</rss>
