<?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>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>
    <item>
      <title>Docker Compose: Running WordPress and MySQL as a Multi-Container Application</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Wed, 29 Jul 2026 11:30:19 +0000</pubDate>
      <link>https://dev.to/rahimah_dev/docker-compose-running-wordpress-and-mysql-as-a-multi-container-application-4mbf</link>
      <guid>https://dev.to/rahimah_dev/docker-compose-running-wordpress-and-mysql-as-a-multi-container-application-4mbf</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Managing containers individually with &lt;code&gt;docker run&lt;/code&gt; works well for simple applications, but once an application depends on multiple services, managing each container separately quickly becomes inefficient.&lt;/p&gt;

&lt;p&gt;A typical WordPress deployment, for example, requires more than the WordPress application itself. It also needs a database service, networking between the services, configuration, and persistent storage.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;Docker Compose&lt;/strong&gt; becomes useful.&lt;/p&gt;

&lt;p&gt;In this project, I configured a multi-container WordPress environment using Docker Compose, with WordPress and MySQL defined as separate services and managed through a single &lt;code&gt;compose.yml&lt;/code&gt; file.&lt;/p&gt;




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

&lt;p&gt;Docker Compose is a tool for defining and managing multi-container applications using a YAML configuration file.&lt;/p&gt;

&lt;p&gt;Instead of manually creating and configuring each container with multiple &lt;code&gt;docker run&lt;/code&gt; commands, the required services and their configuration can be declared in one file.&lt;/p&gt;

&lt;p&gt;For this project, the architecture is:&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
                          │
              ┌───────────┴───────────┐
              │                       │
              ▼                       ▼
        WordPress Service       MySQL Service
        wordpress:latest          mysql:8.0
              │                       │
              └─────── Network ───────┘
                         │
                  Persistent Volumes
                   ┌─────┴─────┐
                   ▼           ▼
                wp_data     db_data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The two services work together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WordPress&lt;/strong&gt; provides the web application.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MySQL&lt;/strong&gt; provides the database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Compose networking&lt;/strong&gt; allows WordPress to communicate with MySQL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Named volumes&lt;/strong&gt; provide persistent storage.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Project Architecture
&lt;/h2&gt;

&lt;p&gt;The environment consists of two services:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Image&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;wordpress&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;wordpress:latest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Web application&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;db&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mysql:8.0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The WordPress container exposes port &lt;code&gt;80&lt;/code&gt; internally, which is mapped to port &lt;code&gt;8080&lt;/code&gt; on the host.&lt;/p&gt;

&lt;p&gt;The MySQL service is not exposed directly to the host because WordPress communicates with it through the internal Docker network.&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;my-wordpress-site/
├── screenshots/
├── compose.yml
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The core configuration is contained in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Creating the Project Workspace
&lt;/h2&gt;

&lt;p&gt;The project begins with a dedicated directory:&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;mkdir &lt;/span&gt;my-wordpress-site
&lt;span class="nb"&gt;cd &lt;/span&gt;my-wordpress-site
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps the Compose configuration and project documentation organized in a single workspace.&lt;/p&gt;

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




&lt;h2&gt;
  
  
  Defining the Docker Compose Configuration
&lt;/h2&gt;

&lt;p&gt;The environment is defined in &lt;code&gt;compose.yml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The file contains two services:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql:8.0&lt;/span&gt;

  &lt;span class="na"&gt;wordpress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wordpress:latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;services&lt;/code&gt; section is the foundation of the Compose configuration. Each service represents a containerized component of the application.&lt;/p&gt;

&lt;p&gt;The complete configuration defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Container images&lt;/li&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;Service dependencies&lt;/li&gt;
&lt;li&gt;Port mapping&lt;/li&gt;
&lt;li&gt;Persistent volumes&lt;/li&gt;
&lt;li&gt;Service-to-service communication&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%2Fobwudmbhfv2jcda2wvdm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fobwudmbhfv2jcda2wvdm.png" alt="Compose file created" width="800" height="670"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Inspecting &lt;code&gt;compose.yml&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Before starting the application, the Compose configuration can be inspected directly from the terminal:&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;cat &lt;/span&gt;compose.yml
&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%2Fyc96dy7dnw6hhgrjji06.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyc96dy7dnw6hhgrjji06.png" alt="Compose file content" width="800" height="652"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Configuring the MySQL Service
&lt;/h1&gt;

&lt;p&gt;The database service is defined as:&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;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql:8.0&lt;/span&gt;
  &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;supersecretpassword&lt;/span&gt;
    &lt;span class="na"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wordpress&lt;/span&gt;
    &lt;span class="na"&gt;MYSQL_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wordpressuser&lt;/span&gt;
    &lt;span class="na"&gt;MYSQL_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wordpresspassword&lt;/span&gt;
  &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db_data:/var/lib/mysql&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Image
&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;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql:8.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docker Compose uses the official MySQL 8.0 image rather than building a custom database image.&lt;/p&gt;

&lt;h3&gt;
  
  
  Restart Policy
&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;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This instructs Docker to automatically restart the container when appropriate.&lt;/p&gt;

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

&lt;p&gt;The database configuration is supplied through environment variables:&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;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;supersecretpassword&lt;/span&gt;
&lt;span class="na"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wordpress&lt;/span&gt;
&lt;span class="na"&gt;MYSQL_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wordpressuser&lt;/span&gt;
&lt;span class="na"&gt;MYSQL_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wordpresspassword&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These variables configure the initial MySQL database, user, and credentials.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Production note:&lt;/strong&gt; Credentials should not be committed directly into a public repository. In production environments, use environment files, Docker secrets, or an appropriate secrets-management solution.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Persistent Database Storage
&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;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db_data:/var/lib/mysql&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The named volume &lt;code&gt;db_data&lt;/code&gt; is mounted to MySQL's data directory.&lt;/p&gt;

&lt;p&gt;This allows database data to persist independently of the container lifecycle.&lt;/p&gt;




&lt;h1&gt;
  
  
  Configuring the WordPress Service
&lt;/h1&gt;

&lt;p&gt;The WordPress service is defined as:&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;wordpress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wordpress:latest&lt;/span&gt;
  &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:80"&lt;/span&gt;
  &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;WORDPRESS_DB_HOST&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;db:3306&lt;/span&gt;
    &lt;span class="na"&gt;WORDPRESS_DB_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wordpressuser&lt;/span&gt;
    &lt;span class="na"&gt;WORDPRESS_DB_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wordpresspassword&lt;/span&gt;
    &lt;span class="na"&gt;WORDPRESS_DB_NAME&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wordpress&lt;/span&gt;
  &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;wp_data:/var/www/html&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Image
&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;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;wordpress:latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The official WordPress image is used as the application container.&lt;/p&gt;

&lt;h3&gt;
  
  
  Port Mapping
&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;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:80"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Host port 8080 → Container port 80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows the WordPress application to be accessed through port &lt;code&gt;8080&lt;/code&gt; on the host.&lt;/p&gt;

&lt;h3&gt;
  
  
  Database Connection
&lt;/h3&gt;

&lt;p&gt;The WordPress container is configured to connect to MySQL using:&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;WORDPRESS_DB_HOST&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;db:3306&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an important Docker Compose concept.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;db&lt;/code&gt; is &lt;strong&gt;not&lt;/strong&gt; a hostname from the host machine. It is the &lt;strong&gt;service name&lt;/strong&gt; defined in the Compose file.&lt;/p&gt;

&lt;p&gt;Docker Compose creates a network for the application, allowing services to communicate with each other using their service names.&lt;/p&gt;

&lt;p&gt;The connection therefore looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WordPress
    │
    │ db:3306
    ▼
MySQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Service Dependency
&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;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This establishes a dependency relationship between WordPress and the database service.&lt;/p&gt;

&lt;h3&gt;
  
  
  WordPress Persistent Storage
&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;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;wp_data:/var/www/html&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;wp_data&lt;/code&gt; named volume stores WordPress application data outside the container's writable layer.&lt;/p&gt;




&lt;h1&gt;
  
  
  Starting the Multi-Container Application
&lt;/h1&gt;

&lt;p&gt;Once the Compose configuration is ready, the complete environment 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 compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;up&lt;/code&gt; command creates and starts the services defined in &lt;code&gt;compose.yml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;-d&lt;/code&gt; option starts them in detached mode, allowing the terminal to remain available while the containers run in the background.&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
       │
       └── up
            │
            └── -d
                 │
                 ├── MySQL container
                 └── WordPress container
&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%2Ffooi5713uty5cgwvojzr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffooi5713uty5cgwvojzr.png" alt="Docker Compose up" width="800" height="208"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Verifying the Services
&lt;/h1&gt;

&lt;p&gt;After starting the environment, the service 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 compose ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This provides a quick overview of the containers managed by the Compose project.&lt;/p&gt;

&lt;p&gt;It can be used to verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service names&lt;/li&gt;
&lt;li&gt;Container status&lt;/li&gt;
&lt;li&gt;Ports&lt;/li&gt;
&lt;li&gt;Running state&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%2Fjyp0gb6csa4mxoh1exb1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjyp0gb6csa4mxoh1exb1.png" alt="Compose services status" width="800" height="60"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Inspecting Container Logs
&lt;/h1&gt;

&lt;p&gt;Logs are essential when troubleshooting containerized applications.&lt;/p&gt;

&lt;p&gt;Docker Compose provides a convenient way to inspect logs from all services:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose logs &lt;span class="nt"&gt;--tail&lt;/span&gt; 20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;--tail 20&lt;/code&gt; option limits the output to the most recent 20 log lines.&lt;/p&gt;

&lt;p&gt;This is useful for identifying:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Startup issues&lt;/li&gt;
&lt;li&gt;Configuration problems&lt;/li&gt;
&lt;li&gt;Database connection errors&lt;/li&gt;
&lt;li&gt;Application errors&lt;/li&gt;
&lt;li&gt;Service initialization messages&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%2Fg8r9ughph8ehmacumcig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg8r9ughph8ehmacumcig.png" alt="Compose logs" width="799" height="236"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Managing Persistent Volumes
&lt;/h1&gt;

&lt;p&gt;The Compose configuration defines two named volumes:&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;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;db_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;wp_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are mounted into the respective services:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;db_data
   │
   └── /var/lib/mysql

wp_data
   │
   └── /var/www/html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Named volumes are useful because container storage is otherwise tied to the container's lifecycle.&lt;/p&gt;

&lt;p&gt;For a database-backed application, separating persistent data from the container itself is particularly important.&lt;/p&gt;




&lt;h1&gt;
  
  
  Cleaning Up the Environment
&lt;/h1&gt;

&lt;p&gt;Once the deployment has been verified, the entire Compose environment can be 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 compose down &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;down&lt;/code&gt; command stops and removes the containers and the Compose network.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;-v&lt;/code&gt; option additionally removes the named volumes created by the project.&lt;/p&gt;

&lt;p&gt;In this lab, that means:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WordPress container   → removed
MySQL container       → removed
Compose network       → removed
wp_data volume        → removed
db_data volume        → removed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; &lt;code&gt;docker compose down -v&lt;/code&gt; removes the project's named volumes and therefore deletes the persistent data stored in them. Use this carefully when working with real application data.&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%2F4tkhgmsrdem1gebd8bob.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4tkhgmsrdem1gebd8bob.png" alt="Docker Compose down" width="798" height="166"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Verifying the Cleanup
&lt;/h1&gt;

&lt;p&gt;The cleanup can be verified 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 compose ps
docker ps &lt;span class="nt"&gt;-a&lt;/span&gt;
docker volume &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The verification confirms that the project's containers and named volumes have been removed.&lt;/p&gt;

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




&lt;h1&gt;
  
  
  Docker Compose vs. Individual &lt;code&gt;docker run&lt;/code&gt; Commands
&lt;/h1&gt;

&lt;p&gt;Without Compose, running this type of environment manually would require separate commands for the database and WordPress containers, along with their networking, environment variables, volumes, and port configuration.&lt;/p&gt;

&lt;p&gt;Docker Compose consolidates those requirements into a single declarative configuration.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Manual Docker&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;Multiple &lt;code&gt;docker run&lt;/code&gt; commands&lt;/td&gt;
&lt;td&gt;One &lt;code&gt;compose.yml&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configuration spread across commands&lt;/td&gt;
&lt;td&gt;Configuration centralized in YAML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual container relationships&lt;/td&gt;
&lt;td&gt;Services defined together&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual volume configuration&lt;/td&gt;
&lt;td&gt;Named volumes declared in Compose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple commands to start services&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Individual cleanup commands&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker compose down&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This becomes increasingly valuable as application architectures grow.&lt;/p&gt;




&lt;h1&gt;
  
  
  Key Docker Compose Commands
&lt;/h1&gt;

&lt;p&gt;The main commands used in this project were:&lt;/p&gt;

&lt;h3&gt;
  
  
  Start services
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check service status
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Inspect logs
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose logs &lt;span class="nt"&gt;--tail&lt;/span&gt; 20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Stop and remove services
&lt;/h3&gt;



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

&lt;/div&gt;






&lt;h1&gt;
  
  
  Skills Demonstrated
&lt;/h1&gt;

&lt;p&gt;This project demonstrates practical experience with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker Compose&lt;/li&gt;
&lt;li&gt;Multi-container application architecture&lt;/li&gt;
&lt;li&gt;YAML configuration&lt;/li&gt;
&lt;li&gt;WordPress containerization&lt;/li&gt;
&lt;li&gt;MySQL containerization&lt;/li&gt;
&lt;li&gt;Docker networking and service discovery&lt;/li&gt;
&lt;li&gt;Docker named volumes&lt;/li&gt;
&lt;li&gt;Persistent application storage&lt;/li&gt;
&lt;li&gt;Environment-based service configuration&lt;/li&gt;
&lt;li&gt;Container lifecycle management&lt;/li&gt;
&lt;li&gt;Container log inspection&lt;/li&gt;
&lt;li&gt;Docker CLI&lt;/li&gt;
&lt;li&gt;Linux command-line operations&lt;/li&gt;
&lt;li&gt;Technical documentation&lt;/li&gt;
&lt;li&gt;Git and GitHub project management&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Docker Compose provides a practical way to define, configure, and manage applications composed of multiple containers.&lt;/p&gt;

&lt;p&gt;By defining WordPress and MySQL as services in a single &lt;code&gt;compose.yml&lt;/code&gt;, the application environment becomes easier to deploy, inspect, manage, and remove.&lt;/p&gt;

&lt;p&gt;The key concepts demonstrated in this implementation include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Declarative multi-container configuration&lt;/li&gt;
&lt;li&gt;Service-to-service communication&lt;/li&gt;
&lt;li&gt;Docker Compose networking&lt;/li&gt;
&lt;li&gt;Persistent volumes&lt;/li&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;Container lifecycle management&lt;/li&gt;
&lt;li&gt;Log-based troubleshooting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same principles can be extended to more complex architectures involving application servers, databases, caches, message brokers, reverse proxies, and other supporting services.&lt;/p&gt;




&lt;h2&gt;
  
  
  Project Repository
&lt;/h2&gt;

&lt;p&gt;The complete project, including the &lt;code&gt;compose.yml&lt;/code&gt; configuration and implementation screenshots, is available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rahimahisah17/my-wordpress-site" rel="noopener noreferrer"&gt;https://github.com/rahimahisah17/my-wordpress-site&lt;/a&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>dockercompose</category>
      <category>wordpress</category>
      <category>mysql</category>
    </item>
    <item>
      <title>Building a Production-Style Azure Infrastructure with Azure CLI: Lessons from a Real Deployment</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Tue, 21 Jul 2026 11:11:27 +0000</pubDate>
      <link>https://dev.to/rahimah_dev/building-a-production-style-azure-infrastructure-with-azure-cli-lessons-from-a-real-deployment-2fdl</link>
      <guid>https://dev.to/rahimah_dev/building-a-production-style-azure-infrastructure-with-azure-cli-lessons-from-a-real-deployment-2fdl</guid>
      <description>&lt;p&gt;&lt;em&gt;How I deployed Linux and Windows virtual machines, configured networking, secured public access, and troubleshot real Azure deployment issues using only Azure CLI.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;One of the best ways to learn cloud engineering is to build infrastructure the same way it is deployed in real environments.&lt;/p&gt;

&lt;p&gt;Instead of clicking through the Azure Portal, I challenged myself to provision an entire production-style environment using &lt;strong&gt;Azure CLI&lt;/strong&gt;. The objective wasn't simply to deploy virtual machines: it was to understand the deployment process, solve real-world problems, validate every resource, and document the entire journey.&lt;/p&gt;

&lt;p&gt;The final environment included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ubuntu Server running Nginx&lt;/li&gt;
&lt;li&gt;Windows Server running IIS&lt;/li&gt;
&lt;li&gt;Windows 11 client VM&lt;/li&gt;
&lt;li&gt;Shared Virtual Network&lt;/li&gt;
&lt;li&gt;Network Security Groups&lt;/li&gt;
&lt;li&gt;Public connectivity validation&lt;/li&gt;
&lt;li&gt;Complete cleanup after deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More importantly, the project involved several real Azure deployment challenges that required investigation and troubleshooting before the infrastructure was fully operational.&lt;/p&gt;




&lt;h2&gt;
  
  
  Project Objectives
&lt;/h2&gt;

&lt;p&gt;The goals of this lab were to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provision Azure infrastructure entirely with Azure CLI&lt;/li&gt;
&lt;li&gt;Deploy Linux and Windows virtual machines&lt;/li&gt;
&lt;li&gt;Configure virtual networking&lt;/li&gt;
&lt;li&gt;Deploy a Windows 11 client VM&lt;/li&gt;
&lt;li&gt;Install and configure Nginx&lt;/li&gt;
&lt;li&gt;Install and configure IIS&lt;/li&gt;
&lt;li&gt;Configure Network Security Groups&lt;/li&gt;
&lt;li&gt;Validate public connectivity&lt;/li&gt;
&lt;li&gt;Practice troubleshooting real Azure deployment issues&lt;/li&gt;
&lt;li&gt;Document the entire implementation&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;The deployed environment consisted of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure Resource Group&lt;/li&gt;
&lt;li&gt;Virtual Network&lt;/li&gt;
&lt;li&gt;Shared Subnet&lt;/li&gt;
&lt;li&gt;Ubuntu Server VM&lt;/li&gt;
&lt;li&gt;Windows Server VM&lt;/li&gt;
&lt;li&gt;Windows 11 Client VM&lt;/li&gt;
&lt;li&gt;Network Security Groups&lt;/li&gt;
&lt;li&gt;Nginx Web Server&lt;/li&gt;
&lt;li&gt;IIS Web Server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Although this is a learning project, the overall deployment closely resembles the structure used in many production Azure environments.&lt;/p&gt;




&lt;h2&gt;
  
  
  Infrastructure Deployed
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Resource Group&lt;/td&gt;
&lt;td&gt;rg-globalretail-prod-001&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;td&gt;West Europe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu VM&lt;/td&gt;
&lt;td&gt;vm-linux-web-01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows Server VM&lt;/td&gt;
&lt;td&gt;vm-win-admin01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Windows 11 VM&lt;/td&gt;
&lt;td&gt;vm-win11-ha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virtual Network&lt;/td&gt;
&lt;td&gt;vm-linux-web-01VNET&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subnet&lt;/td&gt;
&lt;td&gt;vm-linux-web-01Subnet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  Deployment Process
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Step 1 — Creating the Resource Group
&lt;/h2&gt;

&lt;p&gt;Everything began by creating a dedicated Resource Group to logically organize every Azure resource used throughout the project.&lt;/p&gt;

&lt;p&gt;This became the container for all virtual machines, networking resources, storage, and security components.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Resource Group Created&lt;/em&gt;&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%2F2uac2d8k35c4q1dua3z3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2uac2d8k35c4q1dua3z3.png" alt="rg" width="800" height="261"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2 — Deploying the Ubuntu Server
&lt;/h2&gt;

&lt;p&gt;The first virtual machine deployed was an Ubuntu Server running Ubuntu 22.04 LTS.&lt;/p&gt;

&lt;p&gt;This server would later host the Nginx web server.&lt;/p&gt;

&lt;p&gt;Deployment was completed using Azure CLI without touching the Azure Portal.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Linux VM Created&lt;/em&gt;&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%2F1bwws16znhjwjidgxok2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1bwws16znhjwjidgxok2.png" alt="linux vm" width="799" height="308"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3 — Deploying Windows Server
&lt;/h2&gt;

&lt;p&gt;Next came the Windows Server virtual machine.&lt;/p&gt;

&lt;p&gt;This VM would later host Internet Information Services (IIS).&lt;/p&gt;

&lt;p&gt;The deployment wasn't completely smooth, however...&lt;/p&gt;




&lt;h1&gt;
  
  
  Real-World Troubleshooting
&lt;/h1&gt;

&lt;p&gt;One thing I appreciated about this project was that it wasn't a perfect "follow-the-lab" experience.&lt;/p&gt;

&lt;p&gt;Several real deployment issues occurred along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Windows Computer Name Limitation
&lt;/h2&gt;

&lt;p&gt;The initial deployment failed because the Windows computer name exceeded Microsoft's 15-character limit.&lt;/p&gt;

&lt;p&gt;After shortening the VM name, deployment continued successfully.&lt;/p&gt;




&lt;h2&gt;
  
  
  Azure CLI Returned &lt;code&gt;ResourceNotFound&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Immediately after deployment, Azure CLI displayed a &lt;code&gt;ResourceNotFound&lt;/code&gt; error for the Windows VM.&lt;/p&gt;

&lt;p&gt;Instead of assuming the deployment had failed, I verified the environment using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;az vm list &lt;span class="nt"&gt;--resource-group&lt;/span&gt; rg-globalretail-prod-001 &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The VM had actually been created successfully.&lt;/p&gt;

&lt;p&gt;This reinforced an important lesson:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Always verify the actual Azure resource state instead of relying solely on CLI output.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Windows 11 Deployment Failed
&lt;/h2&gt;

&lt;p&gt;The Windows 11 deployment initially failed because Azure attempted to create a subnet that conflicted with the existing virtual network.&lt;/p&gt;

&lt;p&gt;The solution was to query the existing subnet and explicitly specify it during deployment.&lt;/p&gt;




&lt;h2&gt;
  
  
  SSH Authentication Failed
&lt;/h2&gt;

&lt;p&gt;Connecting to Ubuntu initially produced:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Permission denied (publickey)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After investigating, I discovered the local machine did not contain an SSH key pair.&lt;/p&gt;

&lt;p&gt;Generating a new RSA key pair resolved the issue immediately.&lt;/p&gt;




&lt;h1&gt;
  
  
  Configuring the Servers
&lt;/h1&gt;

&lt;p&gt;With the infrastructure successfully deployed, the next phase involved configuring the workloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ubuntu
&lt;/h2&gt;

&lt;p&gt;After connecting through SSH:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Updated package repositories&lt;/li&gt;
&lt;li&gt;Installed Nginx&lt;/li&gt;
&lt;li&gt;Verified the service was running
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Windows Server
&lt;/h2&gt;

&lt;p&gt;After connecting through Remote Desktop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Opened PowerShell&lt;/li&gt;
&lt;li&gt;Installed IIS
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Install-WindowsFeature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Web-Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-IncludeManagementTools&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Network Security
&lt;/h1&gt;

&lt;p&gt;Neither web server was initially reachable.&lt;/p&gt;

&lt;p&gt;The reason?&lt;/p&gt;

&lt;p&gt;HTTP traffic wasn't allowed through the Network Security Groups.&lt;/p&gt;

&lt;p&gt;After creating inbound TCP port 80 rules for both virtual machines, browser access worked immediately.&lt;/p&gt;

&lt;p&gt;This served as a good reminder that:&lt;/p&gt;

&lt;p&gt;Infrastructure deployment is only one part of cloud engineering.&lt;/p&gt;

&lt;p&gt;Networking and security configuration are equally important.&lt;/p&gt;




&lt;h1&gt;
  
  
  Validation
&lt;/h1&gt;

&lt;p&gt;The environment was validated by confirming that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSH access worked correctly&lt;/li&gt;
&lt;li&gt;Remote Desktop access worked correctly&lt;/li&gt;
&lt;li&gt;Nginx was running&lt;/li&gt;
&lt;li&gt;IIS was installed successfully&lt;/li&gt;
&lt;li&gt;HTTP traffic was permitted&lt;/li&gt;
&lt;li&gt;Both web servers were accessible from a web browser&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Browser showing Nginx or IIS page&lt;/em&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%2Fqp710f0smpcpt1qgqnkz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqp710f0smpcpt1qgqnkz.png" alt="nginx" width="800" height="281"&gt;&lt;/a&gt;&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%2Fb81npemdoimvyw804lq6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fb81npemdoimvyw804lq6.png" alt="iis" width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  What I Learned
&lt;/h1&gt;

&lt;p&gt;This project reinforced several important Azure concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure regions don't always have capacity for every VM size.&lt;/li&gt;
&lt;li&gt;Windows virtual machines have naming constraints.&lt;/li&gt;
&lt;li&gt;Existing VNets and subnets should be reused explicitly.&lt;/li&gt;
&lt;li&gt;SSH authentication requires both server-side and client-side configuration.&lt;/li&gt;
&lt;li&gt;Azure CLI responses should always be validated.&lt;/li&gt;
&lt;li&gt;Network Security Groups are critical for application accessibility.&lt;/li&gt;
&lt;li&gt;Cleaning up cloud resources prevents unnecessary costs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most importantly...&lt;/p&gt;

&lt;p&gt;Cloud engineering isn't simply deploying resources.&lt;/p&gt;

&lt;p&gt;It's understanding how infrastructure, networking, security, authentication, and troubleshooting all work together.&lt;/p&gt;




&lt;h1&gt;
  
  
  Source Code
&lt;/h1&gt;

&lt;p&gt;The complete project — including Azure CLI commands, deployment documentation, troubleshooting notes, and screenshots is available on GitHub:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/rahimahisah17/globalretail-prod-lab" rel="noopener noreferrer"&gt;https://github.com/rahimahisah17/globalretail-prod-lab&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;This project pushed me beyond simply following documentation.&lt;/p&gt;

&lt;p&gt;It required investigating deployment failures, validating Azure resources, solving networking issues, configuring Linux and Windows servers, and documenting every stage of the deployment process.&lt;/p&gt;

&lt;p&gt;Every challenge became an opportunity to better understand how Azure behaves in real-world scenarios.&lt;/p&gt;

&lt;p&gt;I'm looking forward to building even more production - style cloud infrastructure projects as I continue developing my Azure and cloud engineering skills.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Thanks for reading! If you have suggestions, questions, or similar experiences deploying infrastructure with Azure CLI, I'd love to hear about them.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  azure #azurecli #cloud #cloudcomputing #devops #linux #windowsserver #nginx #iis #networking #cloudengineering
&lt;/h1&gt;

</description>
      <category>azurecli</category>
      <category>infrastructure</category>
      <category>devops</category>
      <category>linux</category>
    </item>
    <item>
      <title>From Feature Branch to Container Registry: Building a Complete CI/CD Pipeline with Docker and GitHub Actions</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Fri, 17 Jul 2026 21:17:41 +0000</pubDate>
      <link>https://dev.to/rahimah_dev/building-a-complete-cicd-pipeline-with-docker-and-github-actions-471k</link>
      <guid>https://dev.to/rahimah_dev/building-a-complete-cicd-pipeline-with-docker-and-github-actions-471k</guid>
      <description>&lt;h1&gt;
  
  
  Building a Complete CI/CD Pipeline with Docker and GitHub Actions
&lt;/h1&gt;

&lt;p&gt;Modern software delivery is about much more than writing code. Successful engineering teams rely on automation, collaboration, repeatable workflows, and reliable delivery pipelines to move software from development to deployment.&lt;/p&gt;

&lt;p&gt;To strengthen my DevOps skills, I built a &lt;strong&gt;production-inspired CI/CD project&lt;/strong&gt; that simulates the workflow used by modern engineering teams.&lt;/p&gt;

&lt;p&gt;Rather than focusing on building a complex application, I focused on building a professional software delivery pipeline—from planning and development to automated container image publishing.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Git workflow&lt;/li&gt;
&lt;li&gt;Feature branch development&lt;/li&gt;
&lt;li&gt;Pull Requests&lt;/li&gt;
&lt;li&gt;Docker containerization&lt;/li&gt;
&lt;li&gt;GitHub Actions automation&lt;/li&gt;
&lt;li&gt;Continuous Integration (CI)&lt;/li&gt;
&lt;li&gt;Continuous Delivery (CD)&lt;/li&gt;
&lt;li&gt;GitHub Container Registry (GHCR)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This article has been updated to include Continuous Delivery with GitHub Container Registry (GHCR), along with improvements made after the initial publication.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The complete project is available on GitHub:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;GitHub Repository&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/rahimahisah17/cloud-devops-ci-cd-lab" rel="noopener noreferrer"&gt;https://github.com/rahimahisah17/cloud-devops-ci-cd-lab&lt;/a&gt;&lt;/p&gt;


&lt;h1&gt;
  
  
  Project Objectives
&lt;/h1&gt;

&lt;p&gt;The objective was to simulate a realistic DevOps workflow that mirrors how software is developed, reviewed, automated, and delivered in production environments.&lt;/p&gt;

&lt;p&gt;The completed project includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Issues for task tracking&lt;/li&gt;
&lt;li&gt;Feature branch development&lt;/li&gt;
&lt;li&gt;Pull Request-based collaboration&lt;/li&gt;
&lt;li&gt;Docker containerization&lt;/li&gt;
&lt;li&gt;GitHub Actions automation&lt;/li&gt;
&lt;li&gt;Continuous Integration&lt;/li&gt;
&lt;li&gt;Continuous Delivery&lt;/li&gt;
&lt;li&gt;GitHub Container Registry (GHCR)&lt;/li&gt;
&lt;li&gt;Comprehensive project documentation&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  Technology Stack
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Git&lt;/li&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;GitHub Actions&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;GitHub Container Registry (GHCR)&lt;/li&gt;
&lt;li&gt;Nginx&lt;/li&gt;
&lt;li&gt;Linux (WSL)&lt;/li&gt;
&lt;li&gt;Visual Studio Code&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  Development Workflow
&lt;/h1&gt;

&lt;p&gt;Every feature followed a structured Git workflow before reaching the main branch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GitHub Issue
      │
      ▼
Feature Branch
      │
      ▼
Development
      │
      ▼
Commit
      │
      ▼
Push
      │
      ▼
Pull Request
      │
      ▼
GitHub Actions
      │
      ▼
Build Docker Image
      │
      ▼
Publish to GHCR
      │
      ▼
Continuous Delivery
&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%2Fbf3by3lbtut465l3ozej.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbf3by3lbtut465l3ozej.png" alt="pr" width="800" height="737"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  CI/CD Architecture
&lt;/h1&gt;

&lt;p&gt;👩‍💻 Developer&lt;br&gt;
        │&lt;br&gt;
        ▼&lt;br&gt;
📁 GitHub Repository&lt;br&gt;
        │&lt;br&gt;
        ▼&lt;br&gt;
🌿 Feature Branch&lt;br&gt;
        │&lt;br&gt;
        ▼&lt;br&gt;
🔀 Pull Request&lt;br&gt;
        │&lt;br&gt;
        ▼&lt;br&gt;
⚙️ GitHub Actions&lt;br&gt;
        │&lt;br&gt;
        ├── Repository Validation&lt;br&gt;
        ├── Docker Build&lt;br&gt;
        └── Push to GHCR&lt;br&gt;
                    │&lt;br&gt;
                    ▼&lt;br&gt;
📦 GitHub Container Registry&lt;br&gt;
                    │&lt;br&gt;
                    ▼&lt;br&gt;
🚀 Deployable Container Image&lt;/p&gt;


&lt;h1&gt;
  
  
  Continuous Delivery with GitHub Container Registry
&lt;/h1&gt;

&lt;p&gt;The project initially implemented Continuous Integration by automatically validating the repository and building the Docker image.&lt;/p&gt;

&lt;p&gt;To extend the workflow into Continuous Delivery, I enhanced the GitHub Actions pipeline to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authenticate with GitHub Container Registry (GHCR)&lt;/li&gt;
&lt;li&gt;Tag Docker images using the GitHub Container Registry naming convention&lt;/li&gt;
&lt;li&gt;Automatically publish Docker images after successful workflow execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every successful pipeline execution now produces a deployable Docker image stored in GitHub Container Registry, making the workflow suitable for downstream deployment environments.&lt;/p&gt;

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


&lt;h1&gt;
  
  
  Containerizing the Application
&lt;/h1&gt;

&lt;p&gt;The application is packaged inside a lightweight Docker container using Nginx.&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; nginx:alpine&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; index.html /usr/share/nginx/html/index.html&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 80&lt;/span&gt;

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["nginx", "-g", "daemon off;"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Containerization ensures the application behaves consistently regardless of where it runs.&lt;/p&gt;

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




&lt;h1&gt;
  
  
  Automating CI/CD with GitHub Actions
&lt;/h1&gt;

&lt;p&gt;Every push and pull request automatically triggers GitHub Actions.&lt;/p&gt;

&lt;p&gt;The workflow performs the following tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validates the repository&lt;/li&gt;
&lt;li&gt;Builds the Docker image&lt;/li&gt;
&lt;li&gt;Authenticates with GitHub Container Registry&lt;/li&gt;
&lt;li&gt;Publishes the Docker image to GHCR&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This eliminates manual build steps while ensuring every change follows the same automated delivery process.&lt;/p&gt;

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




&lt;h1&gt;
  
  
  Debugging the Pipeline
&lt;/h1&gt;

&lt;p&gt;One of the most valuable aspects of this project wasn't creating the workflow—it was troubleshooting it.&lt;/p&gt;

&lt;p&gt;After migrating the application from Python to an Nginx-based static website, the CI pipeline failed because it was still validating a Python file that no longer existed.&lt;/p&gt;

&lt;p&gt;Instead of simply rerunning the workflow, I:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Investigated the workflow logs&lt;/li&gt;
&lt;li&gt;Identified the obsolete validation step&lt;/li&gt;
&lt;li&gt;Updated the workflow&lt;/li&gt;
&lt;li&gt;Verified the fix by rerunning the pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Watching the workflow transition from ❌ failed to ✅ successful reinforced an important DevOps lesson:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;CI/CD pipelines evolve alongside the applications they support.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Lessons Learned
&lt;/h1&gt;

&lt;p&gt;This project strengthened my practical understanding of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Git workflows&lt;/li&gt;
&lt;li&gt;Feature branch development&lt;/li&gt;
&lt;li&gt;Pull Requests&lt;/li&gt;
&lt;li&gt;Docker containerization&lt;/li&gt;
&lt;li&gt;GitHub Actions&lt;/li&gt;
&lt;li&gt;Continuous Integration&lt;/li&gt;
&lt;li&gt;Continuous Delivery&lt;/li&gt;
&lt;li&gt;GitHub Container Registry (GHCR)&lt;/li&gt;
&lt;li&gt;Pipeline troubleshooting&lt;/li&gt;
&lt;li&gt;Technical documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More importantly, it demonstrated that successful DevOps projects are built through continuous improvement, testing, and iteration.&lt;/p&gt;




&lt;h1&gt;
  
  
  Explore the Complete Project
&lt;/h1&gt;

&lt;p&gt;The repository has continued to evolve beyond the initial publication of this article.&lt;/p&gt;

&lt;p&gt;It now includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📘 Professional README&lt;/li&gt;
&lt;li&gt;📝 Detailed implementation log&lt;/li&gt;
&lt;li&gt;📸 Step-by-step screenshots&lt;/li&gt;
&lt;li&gt;🐳 Dockerized Nginx application&lt;/li&gt;
&lt;li&gt;⚙️ GitHub Actions CI/CD workflow&lt;/li&gt;
&lt;li&gt;🚀 Continuous Delivery to GitHub Container Registry&lt;/li&gt;
&lt;li&gt;🏷️ Official &lt;strong&gt;v1.0.0&lt;/strong&gt; release&lt;/li&gt;
&lt;li&gt;📄 MIT License&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;What began as a simple Docker containerization exercise gradually evolved into a complete CI/CD implementation using GitHub Actions and GitHub Container Registry.&lt;/p&gt;

&lt;p&gt;Beyond the technical outcome, this project strengthened my understanding of Git workflows, automation, pipeline troubleshooting, Docker, and technical documentation.&lt;/p&gt;

&lt;p&gt;More importantly, it reinforced that DevOps is not just about writing automation scripts—it's about designing reliable, repeatable engineering processes that enable teams to deliver software with confidence.&lt;/p&gt;

&lt;p&gt;I hope this walkthrough helps anyone learning DevOps by showing what an end-to-end project looks like in practice.&lt;/p&gt;

&lt;p&gt;Thank you for reading!&lt;/p&gt;

&lt;p&gt;Happy learning! 🚀&lt;/p&gt;




&lt;p&gt;If you found this project helpful, feel free to ⭐ the repository, share your thoughts, or connect with me here on Dev.to. Feedback and suggestions are always welcome!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>docker</category>
      <category>nginx</category>
      <category>git</category>
    </item>
    <item>
      <title>Strengthening Identity Security with Conditional Access Policies in Microsoft Entra ID</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Thu, 09 Jul 2026 14:49:43 +0000</pubDate>
      <link>https://dev.to/rahimah_dev/strengthening-identity-security-with-conditional-access-policies-in-microsoft-entra-id-5bfl</link>
      <guid>https://dev.to/rahimah_dev/strengthening-identity-security-with-conditional-access-policies-in-microsoft-entra-id-5bfl</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;As organizations embrace cloud-first environments, &lt;strong&gt;protecting user identities requires more than just strong passwords&lt;/strong&gt;. Conditional Access in Microsoft Entra ID enables administrators to make intelligent access decisions based on user identity, device compliance, location, application, and risk, ensuring that only trusted users can access organizational resources under the right conditions.&lt;/p&gt;

&lt;p&gt;In this hands-on guide, I'll walk through creating and configuring a Conditional Access policy, targeting specific users and cloud applications, enforcing access controls, and using the &lt;strong&gt;What If&lt;/strong&gt; tool to validate policy behavior before deployment. These practical exercises demonstrate how Conditional Access helps organizations implement Zero Trust principles while &lt;strong&gt;minimizing the risk&lt;/strong&gt; of misconfigured security policies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exercise - Perform basic Conditional Access policy tasks
&lt;/h2&gt;

&lt;p&gt;In this exercise you will learn to create and configure a Conditional Access policy and test its results with the &lt;strong&gt;What If&lt;/strong&gt; analysis tool.&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;
  
  
  Task 1 - Review a Conditional Access policy
&lt;/h2&gt;

&lt;p&gt;1.Open the Microsoft Entra admin center at &lt;a href="https://entra.microsoft.com" rel="noopener noreferrer"&gt;https://entra.microsoft.com&lt;/a&gt;.&lt;br&gt;
2.Log in using the credentials for your tenant.&lt;br&gt;
3.From the menu on the left, select &lt;strong&gt;Conditional access&lt;/strong&gt; submenu.&lt;/p&gt;

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

&lt;p&gt;4.Review the information provided on the Conditional Access Overview page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - You can see how many policies you have enabled, and how many users who have logged in recently that are not covered by a policy, along with other details(if you created any).&lt;br&gt;
5.Select the &lt;strong&gt;+ Create new policy&lt;/strong&gt; from the top 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%2Fv1fzqz2j4lh84kyq4iq6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv1fzqz2j4lh84kyq4iq6.png" alt="create policy" width="799" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.In the &lt;strong&gt;Name&lt;/strong&gt; box enter &lt;strong&gt;Block Bhogeswar from using Sway&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;7.In the &lt;strong&gt;Assignments&lt;/strong&gt; section select &lt;strong&gt;0 users and agents selected&lt;/strong&gt; text.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the &lt;strong&gt;Include&lt;/strong&gt; section mark the &lt;strong&gt;Select users and groups&lt;/strong&gt; item.&lt;/li&gt;
&lt;li&gt;Put a mark in the &lt;strong&gt;Users and groups&lt;/strong&gt; box.&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%2Fumodvtomylquwuavvcop.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fumodvtomylquwuavvcop.png" alt="policy" width="799" height="507"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When the list of users and groups opens, select &lt;strong&gt;Bhogeswar Kalita&lt;/strong&gt; from the list.&lt;/li&gt;
&lt;li&gt;Use the &lt;strong&gt;Select&lt;/strong&gt; button to add the user.&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%2Fnh1h53mgcokkzcf9in3k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnh1h53mgcokkzcf9in3k.png" alt="select" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select the word &lt;strong&gt;Exclude&lt;/strong&gt; to switch tabs.&lt;/li&gt;
&lt;li&gt;Put a mark in the &lt;strong&gt;Users and groups&lt;/strong&gt; box.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8t43261o5x650vgun1ai.png" alt="exclude" width="800" height="516"&gt;
&lt;/li&gt;
&lt;li&gt;When the list of users and groups opens, select &lt;strong&gt;the admin user you are using&lt;/strong&gt; from the list.&lt;/li&gt;
&lt;li&gt;Use the &lt;strong&gt;Select&lt;/strong&gt; button to exclude this user.&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%2Fw71zf2bup5q8jwsnpxik.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw71zf2bup5q8jwsnpxik.png" alt="exclude" width="799" height="366"&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%2F3e04vsfgm68cq5lkzzfp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3e04vsfgm68cq5lkzzfp.png" alt="user" width="799" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lab tip&lt;/strong&gt; - We have added a user for this policy and we have added an exclude for our admin, to make sure they are &lt;em&gt;not accidentally locked out&lt;/em&gt; by a policy change.&lt;/p&gt;

&lt;p&gt;8.Find the section &lt;strong&gt;Target resources&lt;/strong&gt; section.&lt;/p&gt;

&lt;p&gt;9.Select the &lt;strong&gt;No target resources selected&lt;/strong&gt; text from this section.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make sure &lt;strong&gt;Resources (formerly cloud apps)&lt;/strong&gt; is chosen in the dropdown.&lt;/li&gt;
&lt;li&gt;Put a mark in the &lt;strong&gt;Select resources&lt;/strong&gt; item.&lt;/li&gt;
&lt;li&gt;In the section titled &lt;strong&gt;Select&lt;/strong&gt; choose the word &lt;strong&gt;None&lt;/strong&gt;.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgcuimu4twxjzisqy8rc3.png" alt="sway" width="800" height="725"&gt;
&lt;/li&gt;
&lt;li&gt;When the resource selection dialog opens, enter &lt;strong&gt;Sway&lt;/strong&gt; into the search bar.&lt;/li&gt;
&lt;li&gt;Put a check in the box next to &lt;strong&gt;Sway&lt;/strong&gt; then use the &lt;strong&gt;Select&lt;/strong&gt; button to approve the choice.&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%2F0gaj0flmo1i0gci2y3g5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0gaj0flmo1i0gci2y3g5.png" alt="sway" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lab tip&lt;/strong&gt; - We have chosen the app Sway to be the resource this policy works on. You could choose multiple apps, or you could even choose to exclude apps.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Notice the name and target resource&lt;/em&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%2F7kbkdfrnie7x8vlqxry4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7kbkdfrnie7x8vlqxry4.png" alt="done" width="799" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;10.Open and review the &lt;strong&gt;Network&lt;/strong&gt; section, but we are not going to use that for this lab.&lt;/p&gt;

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

&lt;p&gt;11.Open and review the &lt;strong&gt;Conditions&lt;/strong&gt; section, but we are not using it for this lab.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Lab tip&lt;/strong&gt; - Network and Conditions are powerful options in the Conditional Access policy, but they are not required for this simple policy to block access to an app. You would use them if you wanted to do things like restrict access for user working from a specific location, or block access if a user has shown risky behavior. There are many granular options that you can choose from, or even combine together.&lt;/p&gt;

&lt;p&gt;12.Find the section titled &lt;strong&gt;Access controls&lt;/strong&gt;.&lt;br&gt;
13.Under the word &lt;strong&gt;Grant&lt;/strong&gt; select the text &lt;strong&gt;0 controls selected&lt;/strong&gt;.&lt;br&gt;
14.When the Grant dialog opens, select the &lt;strong&gt;Block access&lt;/strong&gt; item.&lt;/p&gt;

&lt;p&gt;15.Use the &lt;strong&gt;Select&lt;/strong&gt; button to accept the change.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Lab tip&lt;/strong&gt; - You have not set the values needed to create a simple block access policy to the Sway app for Bhogeswar. In the Access controls section, we could have allowed access with specific conditions like MFA or a domain joined device.&lt;br&gt;
16.At the bottom of the &lt;strong&gt;Conditional Access&lt;/strong&gt; interface, find the &lt;strong&gt;Enable policy&lt;/strong&gt; item.&lt;br&gt;
17.Set the value to &lt;strong&gt;On&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;18.Select the &lt;strong&gt;Create&lt;/strong&gt; button.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Lab tip&lt;/strong&gt; - You have three options to pick from, and you can change value at any time, without having to change the policy.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On = enables the policy to run&lt;/li&gt;
&lt;li&gt;Off = turn the policy off in case you need to modify it.&lt;/li&gt;
&lt;li&gt;Report-only = use this option to review the outcome of the policy before you fully turn it on.&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%2Fyuvi1d95004r8sc3945c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyuvi1d95004r8sc3945c.png" alt="on" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Task 2 - Perform a What If analysis for a conditional access policy
&lt;/h2&gt;

&lt;p&gt;1.Open the Microsoft Entra admin center at &lt;a href="https://entra.microsoft.com" rel="noopener noreferrer"&gt;https://entra.microsoft.com&lt;/a&gt;.&lt;br&gt;
2.Log in using the credentials for your tenant.&lt;br&gt;
3.From the menu on the left, select &lt;strong&gt;Conditional access&lt;/strong&gt; submenu. &lt;br&gt;
4.From the Conditional access screen select the &lt;strong&gt;What if&lt;/strong&gt; option from the top 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%2Fs7to3ahsbd1dqpjpo04f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs7to3ahsbd1dqpjpo04f.png" alt="ca" width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5.In the section &lt;strong&gt;User or Workload identity&lt;/strong&gt; select the text &lt;strong&gt;No user or service principal selected&lt;/strong&gt;.&lt;br&gt;
6.Make sure the box next to &lt;strong&gt;User&lt;/strong&gt; is marked.&lt;br&gt;
7.Select the text &lt;strong&gt;No user selected&lt;/strong&gt; or &lt;strong&gt;Edit user&lt;/strong&gt;.&lt;br&gt;
8.From the Users list, put a mark next to &lt;strong&gt;Bhogeswar Kalita&lt;/strong&gt;, then use the &lt;strong&gt;Select&lt;/strong&gt; button.&lt;/p&gt;

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

&lt;p&gt;9.In the &lt;strong&gt;Cloud apps, actions, or authentication context&lt;/strong&gt;, select the text &lt;strong&gt;Any cloud app&lt;/strong&gt;.&lt;br&gt;
10.When the &lt;strong&gt;Select target type&lt;/strong&gt; dialog opens, confirm that &lt;strong&gt;Cloud apps&lt;/strong&gt; is chosen in the dropdown.&lt;br&gt;
11.Click on the &lt;strong&gt;+ Select cloud app&lt;/strong&gt;.&lt;br&gt;
12.Use the search to find the &lt;strong&gt;Sway&lt;/strong&gt; app, then use the &lt;strong&gt;Select&lt;/strong&gt; botton to finalize.&lt;/p&gt;

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

&lt;p&gt;13.Scroll down to the bottom of the What If tool.&lt;/p&gt;

&lt;p&gt;14.Select the button &lt;strong&gt;What If&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - the results appear off the bottom of the screen, so you will need to scroll down again.&lt;br&gt;
15.You should see the &lt;strong&gt;Block Bhogeswar from using Sway&lt;/strong&gt; policy listed, and it is blocking access.&lt;/p&gt;

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

&lt;p&gt;16.You have to make selections for Device platform and Client app under &lt;strong&gt;sign-in conditions&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%2F99bc5bahm4013ljaccis.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F99bc5bahm4013ljaccis.png" alt="whatif" width="800" height="808"&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%2Fmye9oscqwz3jkyxcte19.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmye9oscqwz3jkyxcte19.png" alt="policy" width="799" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Subtask 1 - Try a different app in the What If analysis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1.Scroll back to the top of the &lt;strong&gt;What If&lt;/strong&gt; tool.&lt;br&gt;
2.In the &lt;strong&gt;Cloud apps, actions, or authentication context&lt;/strong&gt;, select delete next to &lt;strong&gt;Sway&lt;/strong&gt; and remove it..&lt;/p&gt;

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

&lt;p&gt;3.Then select &lt;strong&gt;select cloud app&lt;/strong&gt; to pick a new app.&lt;br&gt;
4.Search for &lt;strong&gt;Office 365 Reports&lt;/strong&gt; and choose it from the list, then use the &lt;strong&gt;Select&lt;/strong&gt; button.&lt;/p&gt;

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

&lt;p&gt;5.Scroll down to the bottom again.&lt;br&gt;
6.Select the &lt;strong&gt;What If&lt;/strong&gt; button.&lt;br&gt;
7.You should see that the &lt;strong&gt;Block Bhoseswar from using Sway&lt;/strong&gt; policy did not apply.&lt;/p&gt;

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

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

&lt;p&gt;In this article, I demonstrated how to create and configure Conditional Access policies in Microsoft Entra ID, assign policies to specific users and cloud applications, define access controls, and validate policy behavior using the What If analysis tool. By testing policies before enforcement, administrators can confidently implement secure access controls, reduce the risk of unintended user lockouts, and strengthen their organization's identity security posture through a Zero Trust approach.&lt;/p&gt;

</description>
      <category>zerotrust</category>
      <category>microsoft</category>
      <category>security</category>
      <category>azure</category>
    </item>
    <item>
      <title>Securing User Identities with Multi-Factor Authentication (MFA) in Microsoft Entra ID</title>
      <dc:creator>Rahimah Sulayman</dc:creator>
      <pubDate>Wed, 08 Jul 2026 21:54:23 +0000</pubDate>
      <link>https://dev.to/rahimah_dev/securing-user-identities-with-multi-factor-authentication-mfa-in-microsoft-entra-id-20m0</link>
      <guid>https://dev.to/rahimah_dev/securing-user-identities-with-multi-factor-authentication-mfa-in-microsoft-entra-id-20m0</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Passwords alone are no longer enough to protect user accounts from today's evolving cyber threats. &lt;strong&gt;Multi-Factor Authentication (MFA)&lt;/strong&gt; adds an &lt;strong&gt;essential layer of security&lt;/strong&gt; by requiring users to verify their identity using multiple authentication factors, significantly reducing the risk of unauthorized access caused by compromised credentials.&lt;/p&gt;

&lt;p&gt;In this hands-on guide, I'll walk through configuring Multi-Factor Authentication in Microsoft Entra ID, including enabling and disabling per-user MFA, reviewing MFA service settings, and configuring account lockout policies. These practical exercises demonstrate how to strengthen identity security while balancing usability and administrative control in a modern cloud environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exercise - Perform basic Multifactor Authentication tasks
&lt;/h2&gt;

&lt;p&gt;In this exercise you will explore the MFA setup process and configure a basic MFA deployment.&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;
  
  
  Task 1 - Enable / Disable Per-user MFA settings
&lt;/h2&gt;

&lt;p&gt;1.Open the Microsoft Entra admin center at &lt;a href="https://entra.microsoft.com" rel="noopener noreferrer"&gt;https://entra.microsoft.com&lt;/a&gt;.&lt;br&gt;
2.Log in using the credentials for your tenant.&lt;br&gt;
3.From the menu on the left, open the &lt;strong&gt;Identity&lt;/strong&gt; submenu&lt;br&gt;
4.Select &lt;strong&gt;Users&lt;/strong&gt; and then select &lt;strong&gt;All users&lt;/strong&gt;.&lt;br&gt;
5.Look at the menu on the top of the new screen and find &lt;strong&gt;Per-user MFA&lt;/strong&gt;.&lt;br&gt;
6.Select &lt;strong&gt;Per-user MFA&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%2Frc04nfl63iwrednr2no2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frc04nfl63iwrednr2no2.png" alt="per-user mfa" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.Put a mark in the box next to &lt;strong&gt;Bhogeswar Kalita&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;8.Select &lt;strong&gt;Enable MFA&lt;/strong&gt; from the top of the list.&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%2Fsttf251pvo0dhh2kayul.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsttf251pvo0dhh2kayul.png" alt="2mfa" width="800" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;9.Read the message box that pops up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - This is a manual URL that you can email to the user, if you want to let them know to set up MFA.&lt;/p&gt;

&lt;p&gt;10.Select &lt;strong&gt;Enable&lt;/strong&gt; button.&lt;/p&gt;

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

&lt;p&gt;11.Then select the &lt;strong&gt;Enforce&lt;/strong&gt; button.&lt;/p&gt;

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

&lt;p&gt;12.Note that after a few seconds &lt;strong&gt;enforced&lt;/strong&gt; shows up next to Bhogeswar’s 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%2Fn4hknxuncxm7tiucjld4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn4hknxuncxm7tiucjld4.png" alt="verify" width="800" height="548"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Task 2 - Review the Service settings for MFA
&lt;/h2&gt;

&lt;p&gt;1.Open the Microsoft Entra admin center at &lt;a href="https://entra.microsoft.com" rel="noopener noreferrer"&gt;https://entra.microsoft.com&lt;/a&gt;.&lt;br&gt;
2.Log in using the credentials for your tenant.&lt;br&gt;
3.From the menu on the left, open the &lt;strong&gt;Identity&lt;/strong&gt; submenu.&lt;br&gt;
4.Select &lt;strong&gt;Users&lt;/strong&gt; and then select &lt;strong&gt;All users&lt;/strong&gt;.&lt;br&gt;
5.Select &lt;strong&gt;Per-user MFA&lt;/strong&gt; 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%2Fk7cnvrsqeedn6105xz7y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk7cnvrsqeedn6105xz7y.png" alt="2mfa" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6.Select &lt;strong&gt;Service 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%2Fth5phfun5d8kty04nupx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fth5phfun5d8kty04nupx.png" alt="service setting" width="800" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7.Review the settings you can configure:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Setting&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;What is it for&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;App passwords&lt;/td&gt;
&lt;td&gt;There are some legacy apps that won’t work with MFA, use this setting to allow a user to keep using them.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trusted IPs&lt;/td&gt;
&lt;td&gt;If your company has a specifc set of IP-address ranges that are always known safe, you can allow users to by-pass MFA the logging in.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Verification options&lt;/td&gt;
&lt;td&gt;Select the methods you are willing to allow users to use for their second factor of authentication.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remember multifactor authentication on trusted device&lt;/td&gt;
&lt;td&gt;If your users are using a device that you trust, like a company managed laptop, you can allow them to retain thier MFA approved status for a specified number of days.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;8.Select the &lt;strong&gt;Discard&lt;/strong&gt; button if you made any changes. &lt;strong&gt;Save&lt;/strong&gt; if you want to deliberately make changes.&lt;br&gt;
This is one method of configuring MFA for your users.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Task 3 - View MFA account lockout settings
&lt;/h2&gt;

&lt;p&gt;1.Open the Microsoft Entra admin center at &lt;a href="https://entra.microsoft.com" rel="noopener noreferrer"&gt;https://entra.microsoft.com&lt;/a&gt;.&lt;br&gt;
2.Log in using the credentials for your tenant.&lt;br&gt;
3.From the menu on the left, open the &lt;strong&gt;Protection&lt;/strong&gt; submenu.&lt;br&gt;
4.Scroll to the bottom of the list and select &lt;strong&gt;Show more&lt;/strong&gt;.&lt;br&gt;
5.Select &lt;strong&gt;Multifactor authentication&lt;/strong&gt; from the menu.&lt;br&gt;
6.Select &lt;strong&gt;Account lockout&lt;/strong&gt; from the menu.&lt;br&gt;
7.Set the following lockout values:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Field&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Value&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Number of MFA denials to trigger account lockout&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minutes until account lockout counter is reset&lt;/td&gt;
&lt;td&gt;180&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minutes until account is automatically unblocked&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;8.Select the &lt;strong&gt;Save&lt;/strong&gt; option at the top of your screen.&lt;/p&gt;

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

&lt;p&gt;Review some of the other configuration options you have on MFA like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fraud alert&lt;/li&gt;
&lt;li&gt;Block / unblock users&lt;/li&gt;
&lt;li&gt;Notifications&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;In this article, I explored the core aspects of configuring Multi-Factor Authentication (MFA) in Microsoft Entra ID. I demonstrated how to enable and manage per-user MFA, review and customize MFA service settings, and configure account lockout policies to protect against repeated unauthorized sign-in attempts. By implementing these security measures, organizations can significantly improve identity protection, reduce the risk of account compromise, and build a more resilient authentication framework for their cloud environments.&lt;/p&gt;

</description>
      <category>microsoft</category>
      <category>azure</category>
      <category>identity</category>
      <category>azureadmin</category>
    </item>
  </channel>
</rss>
