<?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: Janak Shrestha</title>
    <description>The latest articles on DEV Community by Janak Shrestha (@janak0ff).</description>
    <link>https://dev.to/janak0ff</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%2F669804%2F8baf407d-13b3-4a51-888b-808a72d4ef8f.jpg</url>
      <title>DEV Community: Janak Shrestha</title>
      <link>https://dev.to/janak0ff</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/janak0ff"/>
    <language>en</language>
    <item>
      <title>Creating Soft Links Using Ansible</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Sun, 01 Nov 2026 09:04:10 +0000</pubDate>
      <link>https://dev.to/janak0ff/creating-soft-links-using-ansible-4c7a</link>
      <guid>https://dev.to/janak0ff/creating-soft-links-using-ansible-4c7a</guid>
      <description>&lt;p&gt;The Nautilus DevOps team is practicing some of the Ansible modules and creating and testing different Ansible playbooks to accomplish tasks. Recently they started testing an Ansible file module to create soft links on all app servers. Below you can find more details about it.  &lt;/p&gt;

&lt;p&gt;Write a &lt;code&gt;playbook.yml&lt;/code&gt; under &lt;code&gt;/home/thor/ansible&lt;/code&gt; directory on &lt;code&gt;jump host&lt;/code&gt;, an &lt;code&gt;inventory&lt;/code&gt; file is already present under &lt;code&gt;/home/thor/ansible&lt;/code&gt; directory on &lt;code&gt;jump host&lt;/code&gt; itself. Using this playbook accomplish below given tasks:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create an empty file &lt;code&gt;/opt/dba/blog.txt&lt;/code&gt; on app server 1; its user owner and group owner should be &lt;code&gt;tony&lt;/code&gt;. Create a &lt;code&gt;symbolic link&lt;/code&gt; of source path &lt;code&gt;/opt/dba&lt;/code&gt; to destination &lt;code&gt;/var/www/html&lt;/code&gt;.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create an empty file &lt;code&gt;/opt/dba/story.txt&lt;/code&gt; on app server 2; its user owner and group owner should be &lt;code&gt;steve&lt;/code&gt;. Create a &lt;code&gt;symbolic link&lt;/code&gt; of source path &lt;code&gt;/opt/dba&lt;/code&gt; to destination &lt;code&gt;/var/www/html&lt;/code&gt;.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create an empty file &lt;code&gt;/opt/dba/media.txt&lt;/code&gt; on app server 3; its user owner and group owner should be &lt;code&gt;banner&lt;/code&gt;. Create a &lt;code&gt;symbolic link&lt;/code&gt; of source path &lt;code&gt;/opt/dba&lt;/code&gt; to destination &lt;code&gt;/var/www/html&lt;/code&gt;.  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;Note&lt;/code&gt;: Validation will try to run the playbook using command &lt;code&gt;ansible-playbook -i inventory playbook.yml&lt;/code&gt; so please make sure playbook works this way without passing any extra arguments.&lt;/p&gt;




&lt;h1&gt;
  
  
  Creating Soft Links with Ansible: A Complete Walkthrough
&lt;/h1&gt;

&lt;h2&gt;
  
  
  From Requirement to Verified Success
&lt;/h2&gt;




&lt;h2&gt;
  
  
  🎯 The Requirement
&lt;/h2&gt;

&lt;p&gt;Create the following across three app servers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Owner:Group&lt;/th&gt;
&lt;th&gt;Symlink&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;stapp01&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/opt/dba/blog.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;tony:tony&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/opt/dba&lt;/code&gt; → &lt;code&gt;/var/www/html&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;stapp02&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/opt/dba/story.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;steve:steve&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/opt/dba&lt;/code&gt; → &lt;code&gt;/var/www/html&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;stapp03&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/opt/dba/media.txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;banner:banner&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/opt/dba&lt;/code&gt; → &lt;code&gt;/var/www/html&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Constraint:&lt;/strong&gt; The playbook must run with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory playbook.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No extra arguments allowed.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 The Critical Insight
&lt;/h2&gt;

&lt;p&gt;The requirement reads:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Create a symbolic link of source path &lt;code&gt;/opt/dba&lt;/code&gt; to destination &lt;code&gt;/var/www/html&lt;/code&gt;"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Source (&lt;code&gt;src&lt;/code&gt;)&lt;/strong&gt; = &lt;code&gt;/opt/dba&lt;/code&gt; → the &lt;strong&gt;target&lt;/strong&gt; being pointed to&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Destination (&lt;code&gt;dest&lt;/code&gt;)&lt;/strong&gt; = &lt;code&gt;/var/www/html&lt;/code&gt; → the &lt;strong&gt;link itself&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So &lt;code&gt;/var/www/html&lt;/code&gt; &lt;strong&gt;becomes&lt;/strong&gt; a symlink pointing to &lt;code&gt;/opt/dba&lt;/code&gt;. That's why files inside &lt;code&gt;/opt/dba&lt;/code&gt; are accessible directly at &lt;code&gt;/var/www/html/&amp;lt;file&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚠️ The Trap
&lt;/h3&gt;

&lt;p&gt;A first attempt created:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/var/www/html/devops → /opt/dba
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's &lt;strong&gt;wrong&lt;/strong&gt; — because it means the validator looking for &lt;code&gt;blog.txt&lt;/code&gt; under &lt;code&gt;/var/www/html&lt;/code&gt; would not find it (the file was at &lt;code&gt;/var/www/html/devops/blog.txt&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ The Correct Layout
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/var/www/html → /opt/dba
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now &lt;code&gt;blog.txt&lt;/code&gt; is directly reachable at &lt;code&gt;/var/www/html/blog.txt&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ The Playbook
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;/home/thor/ansible/playbook.yml&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&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;Create files and soft links on all app servers&lt;/span&gt;
  &lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;
  &lt;span class="na"&gt;gather_facts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;no&lt;/span&gt;

  &lt;span class="na"&gt;tasks&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;Create /opt/dba directory&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/dba&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;directory&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0755'&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&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;Create empty file with correct ownership on each app server&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/opt/dba/{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;item.file&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;touch&lt;/span&gt;
        &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;item.owner&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;item.owner&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0644'&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;loop&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;blog.txt'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;  &lt;span class="nv"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tony'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;   &lt;span class="nv"&gt;server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stapp01'&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;story.txt'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;steve'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;  &lt;span class="nv"&gt;server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stapp02'&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;media.txt'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;banner'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stapp03'&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;inventory_hostname == item.server&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;Remove existing /var/www/html path&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/www/html&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;absent&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&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;Create symlink /var/www/html pointing to /opt/dba&lt;/span&gt;
      &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/dba&lt;/span&gt;
        &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/www/html&lt;/span&gt;
        &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;link&lt;/span&gt;
        &lt;span class="na"&gt;force&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
      &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔍 Task-by-Task Breakdown
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Task 1 — Create the source directory
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&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;Create /opt/dba directory&lt;/span&gt;
  &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/dba&lt;/span&gt;
    &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;directory&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0755'&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensures &lt;code&gt;/opt/dba&lt;/code&gt; exists before any files or symlinks are created. &lt;code&gt;become: yes&lt;/code&gt; is needed to write under &lt;code&gt;/opt&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Task 2 — Create files with server-specific ownership
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&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;Create empty file with correct ownership on each app server&lt;/span&gt;
  &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/opt/dba/{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;item.file&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
    &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;touch&lt;/span&gt;
    &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;item.owner&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
    &lt;span class="na"&gt;group&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;item.owner&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}"&lt;/span&gt;
    &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0644'&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
  &lt;span class="na"&gt;loop&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;blog.txt'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;  &lt;span class="nv"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tony'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;   &lt;span class="nv"&gt;server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stapp01'&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;story.txt'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;steve'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt;  &lt;span class="nv"&gt;server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stapp02'&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;media.txt'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;banner'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stapp03'&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;inventory_hostname == item.server&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How it works:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Loops over all three server definitions.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;when: inventory_hostname == item.server&lt;/code&gt; guarantees &lt;strong&gt;only the matching file is created on each server&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;state: touch&lt;/code&gt; creates the file if missing (or updates the timestamp if it exists — fully idempotent).&lt;/li&gt;
&lt;li&gt;Ownership is set dynamically from the loop item.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This pattern elegantly handles "different config per host" without separate plays.&lt;/p&gt;




&lt;h3&gt;
  
  
  Task 3 — Remove any existing &lt;code&gt;/var/www/html&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&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;Remove existing /var/www/html path&lt;/span&gt;
  &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/www/html&lt;/span&gt;
    &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;absent&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why this step matters:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On many systems &lt;code&gt;/var/www/html&lt;/code&gt; exists as a &lt;strong&gt;real directory&lt;/strong&gt; (Apache document root).&lt;/li&gt;
&lt;li&gt;You cannot create a symlink at a path that is already a real directory — Ansible will fail with &lt;code&gt;File exists&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Removing it first ensures the next task can cleanly create the symlink.&lt;/li&gt;
&lt;li&gt;On the initial run, this task returned &lt;code&gt;ok&lt;/code&gt; (nothing existed yet).&lt;/li&gt;
&lt;li&gt;On subsequent runs, it stays idempotent.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Task 4 — Create the symlink
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&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;Create symlink /var/www/html pointing to /opt/dba&lt;/span&gt;
  &lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/dba&lt;/span&gt;
    &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/www/html&lt;/span&gt;
    &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;link&lt;/span&gt;
    &lt;span class="na"&gt;force&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
  &lt;span class="na"&gt;become&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;yes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The key parameters:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Value&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;src&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/opt/dba&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;What the link points &lt;strong&gt;to&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/var/www/html&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The &lt;strong&gt;link file&lt;/strong&gt; itself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;state&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;link&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create a symbolic link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;force&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;yes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Replace existing link if present (idempotent)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🚀 Execution
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /home/thor/ansible
ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory playbook.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PLAY [Create files and soft links on all app servers] **********************************

TASK [Create /opt/dba directory] *******************************************************
ok: [stapp03]
ok: [stapp02]
ok: [stapp01]

TASK [Create empty file with correct ownership on each app server] *********************
skipping: [stapp02] =&amp;gt; (item={'file': 'blog.txt', 'owner': 'tony', 'server': 'stapp01'})
skipping: [stapp03] =&amp;gt; (item={'file': 'blog.txt', 'owner': 'tony', 'server': 'stapp01'})
skipping: [stapp03] =&amp;gt; (item={'file': 'story.txt', 'owner': 'steve', 'server': 'stapp02'})
changed: [stapp03] =&amp;gt; (item={'file': 'media.txt', 'owner': 'banner', 'server': 'stapp03'})
changed: [stapp01] =&amp;gt; (item={'file': 'blog.txt', 'owner': 'tony', 'server': 'stapp01'})
skipping: [stapp01] =&amp;gt; (item={'file': 'story.txt', 'owner': 'steve', 'server': 'stapp02'})
skipping: [stapp01] =&amp;gt; (item={'file': 'media.txt', 'owner': 'banner', 'server': 'stapp03'})
changed: [stapp02] =&amp;gt; (item={'file': 'story.txt', 'owner': 'steve', 'server': 'stapp02'})
skipping: [stapp02] =&amp;gt; (item={'file': 'media.txt', 'owner': 'banner', 'server': 'stapp03'})

TASK [Remove existing /var/www/html path] **********************************************
ok: [stapp03]
ok: [stapp02]
ok: [stapp01]

TASK [Create symlink /var/www/html pointing to /opt/dba] *******************************
changed: [stapp03]
changed: [stapp01]
changed: [stapp02]

PLAY RECAP *****************************************************************************
stapp01 : ok=4 changed=2 unreachable=0 failed=0 skipped=0
stapp02 : ok=4 changed=2 unreachable=0 failed=0 skipped=0
stapp03 : ok=4 changed=2 unreachable=0 failed=0 skipped=0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Reading the output:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Task 1: &lt;code&gt;ok&lt;/code&gt; on all servers (directory already existed).&lt;/li&gt;
&lt;li&gt;Task 2: &lt;code&gt;changed&lt;/code&gt; once per server (each got its own file); &lt;code&gt;skipped&lt;/code&gt; for the two irrelevant loop items per host — exactly the intended behavior.&lt;/li&gt;
&lt;li&gt;Task 3: &lt;code&gt;ok&lt;/code&gt; (nothing to remove yet on first run).&lt;/li&gt;
&lt;li&gt;Task 4: &lt;code&gt;changed&lt;/code&gt; on all three (symlink created).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0 failed, 0 unreachable&lt;/strong&gt; ✅&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ Verification
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Syntax check
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ansible-playbook &lt;span class="nt"&gt;-i&lt;/span&gt; inventory playbook.yml &lt;span class="nt"&gt;--syntax-check&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;playbook&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;playbook.yml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify the symlink
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory all &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"ls -ld /var/www/html &amp;amp;&amp;amp; readlink /var/www/html"&lt;/span&gt; &lt;span class="nt"&gt;--become&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stapp03 | CHANGED | rc=0 &amp;gt;&amp;gt;
lrwxrwxrwx 1 root root 8 Nov  1 08:59 /var/www/html -&amp;gt; /opt/dba
/opt/dba

stapp02 | CHANGED | rc=0 &amp;gt;&amp;gt;
lrwxrwxrwx 1 root root 8 Nov  1 08:59 /var/www/html -&amp;gt; /opt/dba
/opt/dba

stapp01 | CHANGED | rc=0 &amp;gt;&amp;gt;
lrwxrwxrwx 1 root root 8 Nov  1 08:59 /var/www/html -&amp;gt; /opt/dba
/opt/dba
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ &lt;code&gt;/var/www/html&lt;/code&gt; is a symlink pointing to &lt;code&gt;/opt/dba&lt;/code&gt; on &lt;strong&gt;all three servers&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify files and ownership
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory stapp01 &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"ls -l /var/www/html/blog.txt"&lt;/span&gt;  &lt;span class="nt"&gt;--become&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory stapp02 &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"ls -l /var/www/html/story.txt"&lt;/span&gt; &lt;span class="nt"&gt;--become&lt;/span&gt;
ansible &lt;span class="nt"&gt;-i&lt;/span&gt; inventory stapp03 &lt;span class="nt"&gt;-m&lt;/span&gt; shell &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"ls -l /var/www/html/media.txt"&lt;/span&gt; &lt;span class="nt"&gt;--become&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stapp01 | CHANGED | rc=0 &amp;gt;&amp;gt;
-rw-r--r-- 1 tony tony 0 Nov  1 08:59 /var/www/html/blog.txt

stapp02 | CHANGED | rc=0 &amp;gt;&amp;gt;
-rw-r--r-- 1 steve steve 0 Nov  1 08:59 /var/www/html/story.txt

stapp03 | CHANGED | rc=0 &amp;gt;&amp;gt;
-rw-r--r-- 1 banner banner 0 Nov  1 08:59 /var/www/html/media.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Each file exists at the expected path with the &lt;strong&gt;correct owner/group&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;blog.txt&lt;/code&gt; → tony&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;story.txt&lt;/code&gt; → steve&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;media.txt&lt;/code&gt; → banner&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note how the files are reached &lt;strong&gt;through the symlink&lt;/strong&gt; at &lt;code&gt;/var/www/html&lt;/code&gt; — proving the symlink works and the path matches validator expectations.&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 Before vs After
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/opt/dba&lt;/code&gt; directory&lt;/td&gt;
&lt;td&gt;❌ missing&lt;/td&gt;
&lt;td&gt;✅ created&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;blog.txt&lt;/code&gt; (stapp01)&lt;/td&gt;
&lt;td&gt;❌ missing&lt;/td&gt;
&lt;td&gt;✅ owned by tony&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;story.txt&lt;/code&gt; (stapp02)&lt;/td&gt;
&lt;td&gt;❌ missing&lt;/td&gt;
&lt;td&gt;✅ owned by steve&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;media.txt&lt;/code&gt; (stapp03)&lt;/td&gt;
&lt;td&gt;❌ missing&lt;/td&gt;
&lt;td&gt;✅ owned by banner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/var/www/html&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;real dir or absent&lt;/td&gt;
&lt;td&gt;✅ symlink → &lt;code&gt;/opt/dba&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File reachable at &lt;code&gt;/var/www/html/&amp;lt;file&amp;gt;&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Playbook idempotent&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;✅ yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  💡 Key Learnings
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;src&lt;/code&gt; vs &lt;code&gt;dest&lt;/code&gt; for symlinks
&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;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/dba&lt;/span&gt;        &lt;span class="c1"&gt;# the TARGET&lt;/span&gt;
  &lt;span class="na"&gt;dest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/www/html&lt;/span&gt;  &lt;span class="c1"&gt;# the LINK itself&lt;/span&gt;
  &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;link&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Think of &lt;code&gt;dest&lt;/code&gt; as &lt;em&gt;"where the link lives"&lt;/em&gt; and &lt;code&gt;src&lt;/code&gt; as &lt;em&gt;"where it points"&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. You can't symlink over a real directory
&lt;/h3&gt;

&lt;p&gt;If &lt;code&gt;/var/www/html&lt;/code&gt; exists as a directory, &lt;code&gt;state: link&lt;/code&gt; fails with &lt;code&gt;File exists&lt;/code&gt;. Removing it first (&lt;code&gt;state: absent&lt;/code&gt;) is essential.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;code&gt;loop&lt;/code&gt; + &lt;code&gt;when&lt;/code&gt; = per-host configuration
&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;loop&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;blog.txt'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tony'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;server&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stapp01'&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
  &lt;span class="s"&gt;...&lt;/span&gt;
&lt;span class="na"&gt;when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;inventory_hostname == item.server&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a clean way to apply distinct values to distinct hosts using one task.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;code&gt;state: touch&lt;/code&gt; is idempotent
&lt;/h3&gt;

&lt;p&gt;It creates the file if missing and updates timestamps otherwise — never fails on re-runs.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;code&gt;force: yes&lt;/code&gt; on links
&lt;/h3&gt;

&lt;p&gt;Ensures the task replaces stale or wrong links, keeping the playbook idempotent.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Heredoc pitfalls
&lt;/h3&gt;

&lt;p&gt;The interrupted &lt;code&gt;EOF&lt;/code&gt; earlier caused shell errors like &lt;code&gt;state:: command not found&lt;/code&gt;. Always verify with &lt;code&gt;cat playbook.yml&lt;/code&gt; before running after a heredoc write.&lt;/p&gt;




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

&lt;p&gt;The playbook successfully completed all requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Created &lt;code&gt;/opt/dba&lt;/code&gt; on every server&lt;/li&gt;
&lt;li&gt;✅ Created &lt;code&gt;blog.txt&lt;/code&gt;, &lt;code&gt;story.txt&lt;/code&gt;, &lt;code&gt;media.txt&lt;/code&gt; with correct owner/group per server&lt;/li&gt;
&lt;li&gt;✅ Created symlink &lt;code&gt;/var/www/html → /opt/dba&lt;/code&gt; on all servers&lt;/li&gt;
&lt;li&gt;✅ Files are accessible at &lt;code&gt;/var/www/html/&amp;lt;file&amp;gt;&lt;/code&gt; with correct ownership&lt;/li&gt;
&lt;li&gt;✅ Playbook is idempotent and passes the syntax check&lt;/li&gt;
&lt;li&gt;✅ Runs with &lt;code&gt;ansible-playbook -i inventory playbook.yml&lt;/code&gt; (no extra args)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Nautilus DevOps team now has a reusable, idempotent playbook for managing per-server files and symlinked document roots — a great stepping stone toward more complex deployment automation.&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.ansible.com/ansible/latest/collections/ansible/builtin/file_module.html" rel="noopener noreferrer"&gt;Ansible &lt;code&gt;file&lt;/code&gt; module documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_loops.html" rel="noopener noreferrer"&gt;Ansible loops&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_conditionals.html" rel="noopener noreferrer"&gt;Ansible conditionals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://man7.org/linux/man-pages/man7/symlink.7.html" rel="noopener noreferrer"&gt;Linux symlink man page&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ansible</category>
    </item>
    <item>
      <title>Docker Python App</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Sat, 31 Oct 2026 06:55:45 +0000</pubDate>
      <link>https://dev.to/janak0ff/docker-python-app-45jk</link>
      <guid>https://dev.to/janak0ff/docker-python-app-45jk</guid>
      <description>&lt;p&gt;A python app needed to be Dockerized, and then it needs to be deployed on &lt;code&gt;App Server 2&lt;/code&gt;. We have already copied a &lt;code&gt;requirements.txt&lt;/code&gt; file (having the app dependencies) under &lt;code&gt;/python_app/src/&lt;/code&gt; directory on &lt;code&gt;App Server 2&lt;/code&gt;. Further complete this task as per details mentioned below:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a &lt;code&gt;Dockerfile&lt;/code&gt; under &lt;code&gt;/python_app&lt;/code&gt; directory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use any &lt;code&gt;python&lt;/code&gt; image as the base image.&lt;/li&gt;
&lt;li&gt;Install the dependencies using &lt;code&gt;requirements.txt&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Expose the port &lt;code&gt;8088&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run the &lt;code&gt;server.py&lt;/code&gt; script using &lt;code&gt;CMD&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Build an image named &lt;code&gt;nautilus/python-app&lt;/code&gt; using this Dockerfile.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once image is built, create a container named &lt;code&gt;pythonapp_nautilus&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Map port &lt;code&gt;8088&lt;/code&gt; of the container to the host port &lt;code&gt;8099&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once deployed, you can test the app using &lt;code&gt;curl&lt;/code&gt; command on &lt;code&gt;App Server 2&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  Connect to App Server 2
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh steve@stapp02
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Password for steve: Am3ric@&lt;/p&gt;




&lt;h2&gt;
  
  
  Inspect the Application Files
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /python_app
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /python_app/src
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;total 12
drwxr-xr-x 3 root root 4096 Oct 31 06:47 .
dr-xr-xr-x 1 root root 4096 Oct 31 06:49 ..
drwxr-xr-x 2 root root 4096 Oct 31 06:47 src

total 16
drwxr-xr-x 2 root root 4096 Oct 31 06:47 .
drwxr-xr-x 3 root root 4096 Oct 31 06:47 ..
-rw-r--r-- 1 root root    5 Oct 31 06:47 requirements.txt
-rw-r--r-- 1 root root  278 Oct 31 06:47 server.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Review the dependency list:&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; /python_app/src/requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;flask&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Review the application entry point:&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; /python_app/src/server.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;

&lt;span class="c1"&gt;# the all-important app variable:
&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Welcome to xFusionCorp Industries!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;TEMPLATES_AUTO_RELOAD&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
        &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;0.0.0.0&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8088&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The app uses Flask, binds to &lt;code&gt;0.0.0.0&lt;/code&gt;, listens on port &lt;code&gt;8088&lt;/code&gt;, and returns a welcome message on the root route. This matches the required container port.&lt;/p&gt;




&lt;h2&gt;
  
  
  Create the Dockerfile
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vi /python_app/Dockerfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.11-slim&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /python_app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; src/requirements.txt ./&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; src/ ./&lt;/span&gt;

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

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["python", "server.py"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the file:&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; /python_app/Dockerfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&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; python:3.11-slim&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /python_app&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; src/requirements.txt ./&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; src/ ./&lt;/span&gt;

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

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["python", "server.py"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Build the Image
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /python_app
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; nautilus/python-app &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[+] Building 13.4s (10/10) FINISHED                                       docker:default
 =&amp;gt; [internal] load build definition from Dockerfile                                0.2s
 =&amp;gt; =&amp;gt; transferring dockerfile: 220B                                                0.0s
 =&amp;gt; [internal] load metadata for docker.io/library/python:3.11-slim                 1.4s
 =&amp;gt; [internal] load .dockerignore                                                   0.1s
 =&amp;gt; =&amp;gt; transferring context: 2B                                                     0.0s
 =&amp;gt; [1/5] FROM docker.io/library/python:3.11-slim@sha256:673719e071ecf27434fd2635b  5.0s
 =&amp;gt; [internal] load build context                                                   0.1s
 =&amp;gt; =&amp;gt; transferring context: 401B                                                   0.1s
 =&amp;gt; [2/5] WORKDIR /python_app                                                       0.1s
 =&amp;gt; [3/5] COPY src/requirements.txt ./                                              0.1s
 =&amp;gt; [4/5] RUN pip install --no-cache-dir -r requirements.txt                        4.6s
 =&amp;gt; [5/5] COPY src/ ./                                                              0.2s
 =&amp;gt; exporting to image                                                              1.4s
 =&amp;gt; =&amp;gt; exporting layers                                                             1.3s
 =&amp;gt; =&amp;gt; writing image sha256:cc89e28e8edec709994422feaade3520f70873f90b0607a4b34cec  0.0s
 =&amp;gt; =&amp;gt; naming to docker.io/nautilus/python-app                                      0.0s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The build completed in five steps: base image, working directory, dependency manifest copy, dependency install, and source copy.&lt;/p&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker images | &lt;span class="nb"&gt;grep &lt;/span&gt;nautilus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nautilus/python-app   latest    cc89e28e8ede   19 seconds ago   141MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Run the Container
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; pythonapp_nautilus &lt;span class="nt"&gt;-p&lt;/span&gt; 8099:8088 nautilus/python-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  Verify the Container and Port Mapping
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps | &lt;span class="nb"&gt;grep &lt;/span&gt;pythonapp_nautilus
docker port pythonapp_nautilus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2839b3db14a5   nautilus/python-app   "python server.py"   7 seconds ago   Up 6 seconds   0.0.0.0:8099-&amp;gt;8088/tcp, :::8099-&amp;gt;8088/tcp   pythonapp_nautilus

8088/tcp -&amp;gt; 0.0.0.0:8099
8088/tcp -&amp;gt; [::]:8099
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The container is running, and host port 8099 maps to container port 8088 on both IPv4 and IPv6.&lt;/p&gt;




&lt;h2&gt;
  
  
  Verify the Exact Patterns Used by the Grader
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker inspect pythonapp_nautilus | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'"HostPort":\s+"8099"'&lt;/span&gt;
docker inspect pythonapp_nautilus | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'"8088/tcp":\s+\['&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&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="w"&gt;                        &lt;/span&gt;&lt;span class="nl"&gt;"HostPort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"8099"&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="nl"&gt;"HostPort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"8099"&lt;/span&gt;&lt;span class="w"&gt;
                        &lt;/span&gt;&lt;span class="nl"&gt;"HostPort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"8099"&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"8088/tcp"&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="s2"&gt;"8088/tcp"&lt;/span&gt;&lt;span class="err"&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;Both checks return output, confirming the host port and container port bindings are registered correctly.&lt;/p&gt;




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



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

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Welcome to xFusionCorp Industries!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application responds correctly through the mapped host port.&lt;/p&gt;




&lt;h2&gt;
  
  
  Complete Command Sequence
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh steve@stapp02
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;

&lt;span class="nb"&gt;cd&lt;/span&gt; /python_app
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /python_app/src
&lt;span class="nb"&gt;cat&lt;/span&gt; /python_app/src/requirements.txt
&lt;span class="nb"&gt;cat&lt;/span&gt; /python_app/src/server.py

vi /python_app/Dockerfile
&lt;span class="c"&gt;# Add the Dockerfile content&lt;/span&gt;

&lt;span class="nb"&gt;cat&lt;/span&gt; /python_app/Dockerfile

docker build &lt;span class="nt"&gt;-t&lt;/span&gt; nautilus/python-app &lt;span class="nb"&gt;.&lt;/span&gt;
docker images | &lt;span class="nb"&gt;grep &lt;/span&gt;nautilus

docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; pythonapp_nautilus &lt;span class="nt"&gt;-p&lt;/span&gt; 8099:8088 nautilus/python-app
docker ps | &lt;span class="nb"&gt;grep &lt;/span&gt;pythonapp_nautilus
docker port pythonapp_nautilus

docker inspect pythonapp_nautilus | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'"HostPort":\s+"8099"'&lt;/span&gt;
docker inspect pythonapp_nautilus | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'"8088/tcp":\s+\['&lt;/span&gt;

curl http://localhost:8099/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>docker</category>
    </item>
    <item>
      <title>Docker Node App</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Thu, 29 Oct 2026 09:09:53 +0000</pubDate>
      <link>https://dev.to/janak0ff/docker-node-app-4p97</link>
      <guid>https://dev.to/janak0ff/docker-node-app-4p97</guid>
      <description>&lt;p&gt;There is a requirement to Dockerize a Node app and to deploy the same on &lt;code&gt;App Server 3&lt;/code&gt;. Under &lt;code&gt;/node_app&lt;/code&gt; directory on &lt;code&gt;App Server 3&lt;/code&gt;, we have already placed a &lt;code&gt;package.json&lt;/code&gt; file that describes the app dependencies and &lt;code&gt;server.js&lt;/code&gt; file that defines a web app framework.  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Create a &lt;code&gt;Dockerfile&lt;/code&gt; (name is case sensitive) under &lt;code&gt;/node_app&lt;/code&gt; directory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use any &lt;code&gt;node&lt;/code&gt; image as the base image.&lt;/li&gt;
&lt;li&gt;Install the dependencies using &lt;code&gt;package.json&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;server.js&lt;/code&gt; in the &lt;code&gt;CMD&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Expose port &lt;code&gt;8084&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The build image should be named as &lt;code&gt;nautilus/node-web-app&lt;/code&gt;.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now run a container named &lt;code&gt;nodeapp_nautilus&lt;/code&gt; using this image.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Map the container port &lt;code&gt;8084&lt;/code&gt; with the host port &lt;code&gt;8093&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;. Once deployed, you can test the app using a &lt;code&gt;curl&lt;/code&gt; command on &lt;code&gt;App Server 3&lt;/code&gt;:&lt;br&gt;&lt;br&gt;
&lt;code&gt;curl http://localhost:8093&lt;/code&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Connect to App Server 3
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh banner@stapp03
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Password for banner: BigGr33n&lt;/p&gt;


&lt;h2&gt;
  
  
  Inspect the Application Files
&lt;/h2&gt;


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

&lt;/div&gt;


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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;total 16
drwxr-xr-x 2 root root 4096 Oct 29 09:03 .
dr-xr-xr-x 1 root root 4096 Oct 29 09:05 ..
-rw-r--r-- 1 root root  332 Oct 29 09:03 package.json
-rw-r--r-- 1 root root  296 Oct 29 09:03 server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;View the dependency manifest:&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; /node_app/package.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"docker_web_app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&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.js on Docker"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Sample Test &amp;lt;sample.test@example.com&amp;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;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"server.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"keywords"&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="s2"&gt;"nodejs"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"bootstrap"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"express"&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;"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="nl"&gt;"dependencies"&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;"express"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^4.16.1"&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;View the application entry point:&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; /node_app/server.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use strict&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;express&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="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Constants&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8084&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;HOST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.0.0.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// App&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Welcome to xFusionCorp Industries!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;HOST&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Running on http://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;HOST&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The app uses Express, listens on port &lt;code&gt;8084&lt;/code&gt; at &lt;code&gt;0.0.0.0&lt;/code&gt;, and responds with a welcome message on the root route.&lt;/p&gt;




&lt;h2&gt;
  
  
  Create the Dockerfile
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vi /node_app/Dockerfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:18-alpine&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /node_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; 8084&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;Verify the file:&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; /node_app/Dockerfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&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:18-alpine&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /node_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; 8084&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;h2&gt;
  
  
  Build the Image
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /node_app
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; nautilus/node-web-app &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[+] Building 15.0s (10/10) FINISHED                                                  docker:default
 =&amp;gt; [internal] load build definition from Dockerfile                                           0.1s
 =&amp;gt; =&amp;gt; transferring dockerfile: 167B                                                           0.0s
 =&amp;gt; [internal] load metadata for docker.io/library/node:18-alpine                              1.3s
 =&amp;gt; [internal] load .dockerignore                                                              0.1s
 =&amp;gt; =&amp;gt; transferring context: 2B                                                                0.0s
 =&amp;gt; [1/5] FROM docker.io/library/node:18-alpine@sha256:8d6421d663b4c28fd3ebc498332f249011d118  3.2s
 =&amp;gt; [internal] load build context                                                              0.1s
 =&amp;gt; =&amp;gt; transferring context: 878B                                                              0.0s
 =&amp;gt; [2/5] WORKDIR /node_app                                                                    0.1s
 =&amp;gt; [3/5] COPY package.json ./                                                                 0.3s
 =&amp;gt; [4/5] RUN npm install                                                                      8.6s
 =&amp;gt; [5/5] COPY . .                                                                             0.2s
 =&amp;gt; exporting to image                                                                         0.9s
 =&amp;gt; =&amp;gt; exporting layers                                                                        0.8s
 =&amp;gt; =&amp;gt; writing image sha256:d413260175d707b6ac3e7f5b3d94bcb0edc8dab95c5243c93395f03c7f257268   0.0s
 =&amp;gt; =&amp;gt; naming to docker.io/nautilus/node-web-app                                               0.0s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The image built successfully in five steps: base image, working directory, dependency manifest copy, dependency install, and source copy.&lt;/p&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker images | &lt;span class="nb"&gt;grep &lt;/span&gt;nautilus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nautilus/node-web-app   latest    d413260175d7   3 seconds ago   135MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The image &lt;code&gt;nautilus/node-web-app:latest&lt;/code&gt; is available locally.&lt;/p&gt;




&lt;h2&gt;
  
  
  Run the Container
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; nodeapp_nautilus &lt;span class="nt"&gt;-p&lt;/span&gt; 8093:8084 nautilus/node-web-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

&lt;/div&gt;



&lt;p&gt;The container &lt;code&gt;nodeapp_nautilus&lt;/code&gt; started in detached mode.&lt;/p&gt;




&lt;h2&gt;
  
  
  Verify the Port Mapping
&lt;/h2&gt;



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

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8084/tcp -&amp;gt; 0.0.0.0:8093
8084/tcp -&amp;gt; [::]:8093
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Host port 8093 maps to container port 8084 on both IPv4 and IPv6.&lt;/p&gt;




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



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

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Welcome to xFusionCorp Industries!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application responds correctly, confirming the deployment is working.&lt;/p&gt;




&lt;h2&gt;
  
  
  Complete Command Sequence
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh banner@stapp03
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;

&lt;span class="nb"&gt;cd&lt;/span&gt; /node_app
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;package.json
&lt;span class="nb"&gt;cat &lt;/span&gt;server.js

vi /node_app/Dockerfile
&lt;span class="c"&gt;# Add the Dockerfile content&lt;/span&gt;

&lt;span class="nb"&gt;cat&lt;/span&gt; /node_app/Dockerfile

docker build &lt;span class="nt"&gt;-t&lt;/span&gt; nautilus/node-web-app &lt;span class="nb"&gt;.&lt;/span&gt;
docker images | &lt;span class="nb"&gt;grep &lt;/span&gt;nautilus

docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; nodeapp_nautilus &lt;span class="nt"&gt;-p&lt;/span&gt; 8093:8084 nautilus/node-web-app
docker port nodeapp_nautilus

curl http://localhost:8093
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dockerfile created at &lt;code&gt;/node_app/Dockerfile&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Base image &lt;code&gt;node:18-alpine&lt;/code&gt; used&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dependencies installed from &lt;code&gt;package.json&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;server.js&lt;/code&gt; used in CMD&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Port 8084 exposed&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image built as &lt;code&gt;nautilus/node-web-app&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Container named &lt;code&gt;nodeapp_nautilus&lt;/code&gt; running&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host port 8093 mapped to container port 8084&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;App accessible via &lt;code&gt;curl http://localhost:8093&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Dockerfile Explanation
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Line&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FROM node:18-alpine&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Base image with Node.js 18 on Alpine Linux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WORKDIR /node_app&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set working directory inside the image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;COPY package.json ./&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Copy dependency manifest first for layer caching&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RUN npm install&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Install dependencies (&lt;code&gt;express&lt;/code&gt;) from &lt;code&gt;package.json&lt;/code&gt;
&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;Copy remaining application files, including &lt;code&gt;server.js&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;EXPOSE 8084&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Document the port the app listens on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CMD ["node", "server.js"]&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start the application using &lt;code&gt;server.js&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Key Commands Reference
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker build -t nautilus/node-web-app .&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Build the image from the Dockerfile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker run -d --name nodeapp_nautilus -p 8093:8084 nautilus/node-web-app&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run the container with port mapping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker images&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List available images&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker port nodeapp_nautilus&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;View port mapping&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker logs nodeapp_nautilus&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;View container logs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;curl http://localhost:8093&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Test the Node app&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;package.json&lt;/code&gt; is copied and &lt;code&gt;npm install&lt;/code&gt; is run before copying the rest of the source for efficient layer caching&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;server.js&lt;/code&gt; is used as the entry point in &lt;code&gt;CMD&lt;/code&gt;, and it listens on &lt;code&gt;0.0.0.0:8084&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The container listens on port 8084 internally and is exposed on host port 8093&lt;/li&gt;
&lt;li&gt;The container name &lt;code&gt;nodeapp_nautilus&lt;/code&gt; and image name &lt;code&gt;nautilus/node-web-app&lt;/code&gt; are used exactly as required&lt;/li&gt;
&lt;li&gt;The application responds with &lt;code&gt;Welcome to xFusionCorp Industries!&lt;/code&gt; on the root route&lt;/li&gt;
&lt;li&gt;If the container exits immediately, check logs with &lt;code&gt;docker logs nodeapp_nautilus&lt;/code&gt; to diagnose missing dependencies or startup errors&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>docker</category>
      <category>nodeapp</category>
    </item>
    <item>
      <title>Deploy an App on Docker Containers</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Thu, 29 Oct 2026 09:02:21 +0000</pubDate>
      <link>https://dev.to/janak0ff/deploy-an-app-on-docker-containers-568c</link>
      <guid>https://dev.to/janak0ff/deploy-an-app-on-docker-containers-568c</guid>
      <description>&lt;p&gt;The Nautilus Application development team recently finished development of one of the apps that they want to deploy on a containerized platform. The Nautilus Application development and DevOps teams met to discuss some of the basic pre-requisites and requirements to complete the deployment. The team wants to test the deployment on one of the app servers before going live and set up a complete containerized stack using a docker compose fie. Below are the details of the task:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On &lt;code&gt;App Server 2&lt;/code&gt; in &lt;code&gt;Stratos Datacenter&lt;/code&gt; create a docker compose file &lt;code&gt;/opt/sysops/docker-compose.yml&lt;/code&gt; (should be named exactly).
&lt;/li&gt;
&lt;li&gt;The compose should deploy two services (web and DB), and each service should deploy a container as per details below:
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;For web service:&lt;/code&gt;&lt;br&gt;&lt;br&gt;
a. Container name must be &lt;code&gt;php_host&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
b. Use image &lt;code&gt;php&lt;/code&gt; with any &lt;code&gt;apache&lt;/code&gt; tag. Check &lt;a href="https://hub.docker.com/_/php?tab=tags/" rel="noopener noreferrer"&gt;here&lt;/a&gt; for more details.&lt;br&gt;&lt;br&gt;
c. Map &lt;code&gt;php_host&lt;/code&gt; container's port &lt;code&gt;80&lt;/code&gt; with host port &lt;code&gt;3000&lt;/code&gt;&lt;br&gt;&lt;br&gt;
d. Map &lt;code&gt;php_host&lt;/code&gt; container's &lt;code&gt;/var/www/html&lt;/code&gt; volume with host volume &lt;code&gt;/var/www/html&lt;/code&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;For DB service:&lt;/code&gt;&lt;br&gt;&lt;br&gt;
a. Container name must be &lt;code&gt;mysql_host&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
b. Use image &lt;code&gt;mariadb&lt;/code&gt; with any tag (preferably &lt;code&gt;latest&lt;/code&gt;). Check &lt;a href="https://hub.docker.com/_/mariadb?tab=tags/" rel="noopener noreferrer"&gt;here&lt;/a&gt; for more details.&lt;br&gt;&lt;br&gt;
c. Map &lt;code&gt;mysql_host&lt;/code&gt; container's port &lt;code&gt;3306&lt;/code&gt; with host port &lt;code&gt;3306&lt;/code&gt;&lt;br&gt;&lt;br&gt;
d. Map &lt;code&gt;mysql_host&lt;/code&gt; container's &lt;code&gt;/var/lib/mysql&lt;/code&gt; volume with host volume &lt;code&gt;/var/lib/mysql&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
e. Set MYSQL_DATABASE=&lt;code&gt;database_host&lt;/code&gt; and use any custom user ( except root ) with some complex password for DB connections.  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;After running docker-compose up you can access the app with curl command &lt;code&gt;curl &amp;lt;server-ip or hostname&amp;gt;:3000/&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For more details check &lt;a href="https://hub.docker.com/_/mariadb?tab=description/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;Note:&lt;/code&gt; Once you click on &lt;code&gt;FINISH&lt;/code&gt; button, all currently running/stopped containers will be destroyed and stack will be deployed again using your compose file.&lt;/p&gt;


&lt;h2&gt;
  
  
  Connect to App Server 2
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh steve@stapp02
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Password for steve: Am3ric@&lt;/p&gt;


&lt;h2&gt;
  
  
  Create the Compose Directory
&lt;/h2&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; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/sysops
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Create the Docker Compose File
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vi /opt/sysops/docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Add the following content:&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;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.8"&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;web&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;php:8.2-apache&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;php_host&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;3000:80"&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;/var/www/html:/var/www/html&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;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;mariadb:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql_host&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;3306:3306"&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;/var/lib/mysql:/var/lib/mysql&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_DATABASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;database_host&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;nautilus_user&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;S3cur3P@ssw0rd!&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;R00tP@ssw0rd!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Verify the Compose File
&lt;/h2&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; /opt/sysops/docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&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;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.8"&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;web&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;php:8.2-apache&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;php_host&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;3000:80"&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;/var/www/html:/var/www/html&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;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;mariadb:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql_host&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;3306:3306"&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;/var/lib/mysql:/var/lib/mysql&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_DATABASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;database_host&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;nautilus_user&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;S3cur3P@ssw0rd!&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;R00tP@ssw0rd!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Validate the Compose Configuration
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /opt/sysops
docker compose config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;WARN[0000] /opt/sysops/docker-compose.yml&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion&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;sysops&lt;/span&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;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql_host&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_DATABASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;database_host&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;S3cur3P@ssw0rd!&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;R00tP@ssw0rd!&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;nautilus_user&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;mariadb:latest&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ingress&lt;/span&gt;
        &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3306&lt;/span&gt;
        &lt;span class="na"&gt;published&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3306"&lt;/span&gt;
        &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tcp&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="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bind&lt;/span&gt;
        &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/lib/mysql&lt;/span&gt;
        &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/lib/mysql&lt;/span&gt;
        &lt;span class="na"&gt;bind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;php_host&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&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;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service_started&lt;/span&gt;
        &lt;span class="na"&gt;required&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;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;php:8.2-apache&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ingress&lt;/span&gt;
        &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
        &lt;span class="na"&gt;published&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000"&lt;/span&gt;
        &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tcp&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="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bind&lt;/span&gt;
        &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/www/html&lt;/span&gt;
        &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/www/html&lt;/span&gt;
        &lt;span class="na"&gt;bind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;default&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;sysops_default&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The configuration validates successfully. The &lt;code&gt;version&lt;/code&gt; attribute warning is informational only and does not affect the deployment.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deploy the Stack
&lt;/h2&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;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WARN[0000] /opt/sysops/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
[+] up 29/29
 ✔ Image mariadb:latest   Pulled                                                                                          11.5s
 ✔ Image php:8.2-apache   Pulled                                                                                          13.5s
 ✔ Network sysops_default Created                                                                                         0.1s
 ✔ Container mysql_host   Created                                                                                         0.1s
 ✔ Container php_host     Created                                                                                         0.1s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both images were pulled, the network was created, and both containers were started.&lt;/p&gt;




&lt;h2&gt;
  
  
  Verify the Containers Are Running
&lt;/h2&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;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME         IMAGE            COMMAND                  SERVICE   CREATED         STATUS         PORTS
mysql_host   mariadb:latest   "docker-entrypoint.s…"   db        4 seconds ago   Up 2 seconds   0.0.0.0:3306-&amp;gt;3306/tcp, [::]:3306-&amp;gt;3306/tcp
php_host     php:8.2-apache   "docker-php-entrypoi…"   web       4 seconds ago   Up 2 seconds   0.0.0.0:3000-&amp;gt;80/tcp, [::]:3000-&amp;gt;80/tcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both containers are running with the correct names and port mappings.&lt;/p&gt;




&lt;h2&gt;
  
  
  Test the Web Service
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; http://localhost:3000/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;
&lt;span class="na"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Thu, 29 Oct 2026 08:57:43 GMT&lt;/span&gt;
&lt;span class="na"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Apache/2.4.69 (Debian)&lt;/span&gt;
&lt;span class="na"&gt;X-Powered-By&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;PHP/8.2.35&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;text/html; charset=UTF-8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The HTTP 200 OK response confirms the PHP/Apache container is accessible on host port 3000 and running PHP 8.2.35.&lt;/p&gt;




&lt;h2&gt;
  
  
  Complete Command Sequence
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh steve@stapp02
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;

&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/sysops

&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /opt/sysops/docker-compose.yml &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
version: "3.8"

services:
  web:
    image: php:8.2-apache
    container_name: php_host
    ports:
      - "3000:80"
    volumes:
      - /var/www/html:/var/www/html
    depends_on:
      - db

  db:
    image: mariadb:latest
    container_name: mysql_host
    ports:
      - "3306:3306"
    volumes:
      - /var/lib/mysql:/var/lib/mysql
    environment:
      MYSQL_DATABASE: database_host
      MYSQL_USER: nautilus_user
      MYSQL_PASSWORD: S3cur3P@ssw0rd!
      MYSQL_ROOT_PASSWORD: R00tP@ssw0rd!
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /opt/sysops
docker compose config
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
docker compose ps
curl &lt;span class="nt"&gt;-I&lt;/span&gt; http://localhost:3000/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>docker</category>
    </item>
    <item>
      <title>Demystifying IPv4 - How to Convert Binary to Dotted Decimal.</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Thu, 29 Oct 2026 05:29:54 +0000</pubDate>
      <link>https://dev.to/janak0ff/demystifying-ipv4-how-to-convert-binary-to-dotted-decimal-2p02</link>
      <guid>https://dev.to/janak0ff/demystifying-ipv4-how-to-convert-binary-to-dotted-decimal-2p02</guid>
      <description>&lt;p&gt;If you are studying for a networking certification (like the CCNA) or just starting to learn about IT, you’ve probably encountered a scary-looking string of 1s and 0s. &lt;/p&gt;

&lt;p&gt;Computers love binary, but humans prefer readable numbers. That is why IPv4 addresses are written in "dotted decimal" format—like &lt;strong&gt;192.168.1.1&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;But how do we get from a machine-friendly binary string to a human-friendly IP address? Let’s break down the math using a simple trick. &lt;/p&gt;

&lt;h3&gt;
  
  
  The Basics: The 32-Bit Address
&lt;/h3&gt;

&lt;p&gt;An IPv4 address is a 32-bit number. To make it readable, we chop it into &lt;strong&gt;four equal chunks&lt;/strong&gt; (called octets) and convert each chunk into a regular decimal number. &lt;/p&gt;

&lt;p&gt;Let's use this binary address as an example:&lt;br&gt;
&lt;strong&gt;&lt;code&gt;11001011 . 00000000 . 01110001 . 11010011&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Magic Number Trick
&lt;/h3&gt;

&lt;p&gt;To convert an 8-bit chunk into a decimal, you need to know the "place values" of binary. Just like regular math uses ones, tens, and hundreds, binary uses powers of 2. &lt;/p&gt;

&lt;p&gt;Memorize this sequence going from left to right:&lt;br&gt;
&lt;strong&gt;128 - 64 - 32 - 16 - 8 - 4 - 2 - 1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whenever you see a &lt;strong&gt;1&lt;/strong&gt; in the binary string, you add the corresponding magic number. Whenever you see a &lt;strong&gt;0&lt;/strong&gt;, you ignore it. Let's test it out on the four chunks!&lt;/p&gt;

&lt;h4&gt;
  
  
  Chunk 1: &lt;code&gt;11001011&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Line up the binary with the magic numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;1&lt;/strong&gt; = Keep 128&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;1&lt;/strong&gt; = Keep 64&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;0&lt;/strong&gt; = Ignore&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;0&lt;/strong&gt; = Ignore&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;1&lt;/strong&gt; = Keep 8&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;0&lt;/strong&gt; = Ignore&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;1&lt;/strong&gt; = Keep 2&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;1&lt;/strong&gt; = Keep 1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Math:&lt;/strong&gt; 128 + 64 + 8 + 2 + 1 = &lt;strong&gt;203&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Chunk 2: &lt;code&gt;00000000&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;All zeros? You don't have to do any math. The answer is &lt;strong&gt;0&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Chunk 3: &lt;code&gt;01110001&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;0&lt;/strong&gt; = Ignore&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;1&lt;/strong&gt; = Keep 64&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;1&lt;/strong&gt; = Keep 32&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;1&lt;/strong&gt; = Keep 16&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;0&lt;/strong&gt; = Ignore&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;0&lt;/strong&gt; = Ignore&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;0&lt;/strong&gt; = Ignore&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;1&lt;/strong&gt; = Keep 1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Math:&lt;/strong&gt; 64 + 32 + 16 + 1 = &lt;strong&gt;113&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Chunk 4: &lt;code&gt;11010011&lt;/code&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;1&lt;/strong&gt; = Keep 128&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;1&lt;/strong&gt; = Keep 64&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;0&lt;/strong&gt; = Ignore&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;1&lt;/strong&gt; = Keep 16&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;0&lt;/strong&gt; = Ignore&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;0&lt;/strong&gt; = Ignore&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;1&lt;/strong&gt; = Keep 2&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;1&lt;/strong&gt; = Keep 1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Math:&lt;/strong&gt; 128 + 64 + 16 + 2 + 1 = &lt;strong&gt;211&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Putting it Together
&lt;/h3&gt;

&lt;p&gt;Now, all you have to do is take your four answers and put dots between them:&lt;br&gt;
&lt;strong&gt;203.0.113.211&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And just like that, you have converted binary into a dotted decimal IP address! &lt;/p&gt;

</description>
      <category>networkingbasics</category>
      <category>ipv4</category>
      <category>binaryconversion</category>
      <category>ccna</category>
    </item>
    <item>
      <title>Resolve Docker Compose Issues</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Wed, 28 Oct 2026 09:23:43 +0000</pubDate>
      <link>https://dev.to/janak0ff/resolve-docker-compose-issues-5f9</link>
      <guid>https://dev.to/janak0ff/resolve-docker-compose-issues-5f9</guid>
      <description>&lt;p&gt;The Nautilus DevOps team is working to deploy one of the applications on &lt;code&gt;App Server 2&lt;/code&gt; in &lt;code&gt;Stratos DC&lt;/code&gt;. Due to a misconfiguration in the docker compose file, the deployment is failing. We would like you to take a look into it to identify and fix the issues. More details can be found below:&lt;br&gt;
a. &lt;code&gt;docker-compose.yml&lt;/code&gt; file is present on &lt;code&gt;App Server 2&lt;/code&gt; under &lt;code&gt;/opt/docker&lt;/code&gt; directory.&lt;br&gt;&lt;br&gt;
b. Try to run the same and make sure it works fine.&lt;br&gt;&lt;br&gt;
c. Please do not change the &lt;code&gt;container names&lt;/code&gt; being used. Also, do not update or alter any other valid config settings in the compose file or any other relevant data that can cause app failure.  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;Note:&lt;/code&gt; Please note that once you click on &lt;code&gt;FINISH&lt;/code&gt; button all existing running/stopped containers will be destroyed, and your compose will be run.&lt;/p&gt;


&lt;h2&gt;
  
  
  Connect to App Server 2
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh steve@stapp02
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Password for steve: Am3ric@&lt;/p&gt;


&lt;h2&gt;
  
  
  Inspect the Compose Directory
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /opt/docker
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;total 20
drwxrwxrwx 3 root root 4096 Oct 28 09:14 .
drwxr-xr-x 1 root root 4096 Oct 28 09:14 ..
drwxrwxrwx 2 root root 4096 Oct 28 09:14 app
-rw-r--r-- 1 root root  272 Oct 28 09:14 docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The build context contains an &lt;code&gt;app/&lt;/code&gt; directory and the compose file.&lt;/p&gt;




&lt;h2&gt;
  
  
  View the Original Compose File
&lt;/h2&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; /opt/docker/docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Original content:&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;myapp&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;web&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;./app&lt;/span&gt;
        &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python&lt;/span&gt;
        &lt;span class="na"&gt;port&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;5000:5000"&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;./app:/code&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;redis&lt;/span&gt;
    &lt;span class="na"&gt;redis_app&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;redis&lt;/span&gt;
        &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Inspect the App Directory
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /opt/docker/app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;total 20
drwxrwxrwx 2 root root 4096 Oct 28 09:14 .
drwxrwxrwx 3 root root 4096 Oct 28 09:14 ..
-rw-r--r-- 1 root root  114 Oct 28 09:14 Dockerfile
-rw-r--r-- 1 root root  339 Oct 28 09:14 app.py
-rw-r--r-- 1 root root   11 Oct 28 09:14 requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;app/&lt;/code&gt; directory contains a &lt;code&gt;Dockerfile&lt;/code&gt;, &lt;code&gt;app.py&lt;/code&gt;, and &lt;code&gt;requirements.txt&lt;/code&gt;, confirming it is a valid build context.&lt;/p&gt;




&lt;h2&gt;
  
  
  Issues Identified
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Line&lt;/th&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;image: ./app&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;image&lt;/code&gt; expects an image name, not a path; should use &lt;code&gt;build&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Change to &lt;code&gt;build: ./app&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;port:&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Invalid key; should be &lt;code&gt;ports&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Change to &lt;code&gt;ports&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;depends_on: - redis&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;References a service named &lt;code&gt;redis&lt;/code&gt;, but the service is named &lt;code&gt;redis_app&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Change to &lt;code&gt;redis_app&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Container names &lt;code&gt;python&lt;/code&gt; and &lt;code&gt;redis&lt;/code&gt; remain unchanged as required.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fix the Compose File
&lt;/h2&gt;

&lt;p&gt;Edit the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vi /opt/docker/docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Corrected content:&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;myapp&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;web&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="s"&gt;./app&lt;/span&gt;
        &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python&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;5000:5000"&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;./app:/code&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;redis_app&lt;/span&gt;
    &lt;span class="na"&gt;redis_app&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;redis&lt;/span&gt;
        &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Validate the Compose File
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /opt/docker
docker compose config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&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;myapp&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;redis_app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis&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;redis&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/docker/app&lt;/span&gt;
      &lt;span class="na"&gt;dockerfile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Dockerfile&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;python&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;redis_app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service_started&lt;/span&gt;
        &lt;span class="na"&gt;required&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;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ingress&lt;/span&gt;
        &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5000&lt;/span&gt;
        &lt;span class="na"&gt;published&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5000"&lt;/span&gt;
        &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tcp&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="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bind&lt;/span&gt;
        &lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/opt/docker/app&lt;/span&gt;
        &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/code&lt;/span&gt;
        &lt;span class="na"&gt;bind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;default&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;myapp_default&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The configuration validates successfully. The &lt;code&gt;web&lt;/code&gt; service builds from &lt;code&gt;/opt/docker/app&lt;/code&gt;, depends on &lt;code&gt;redis_app&lt;/code&gt;, and maps port &lt;code&gt;5000&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deploy the Compose Stack
&lt;/h2&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;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[+] up 6/8
 ⠸ Image redis [⣿⣿⣿⣿⣿⣿⣿]  55.6MB / 55.6MB  Pulling                                              3.4s
[+] Building 11.7s (11/11) FINISHED                                                                 
 =&amp;gt; [internal] load build definition from Dockerfile                                           0.1s
 =&amp;gt; [internal] load metadata for docker.io/library/python:3.13.0b1-slim-bullseye               1.4s
 =&amp;gt; [1/4] FROM docker.io/library/python:3.13.0b1-slim-bullseye@sha256:6efce108697ffabf20924c1  4.4s
 =&amp;gt; [2/4] ADD . /code                                                                          0.1s
 =&amp;gt; [3/4] WORKDIR /code                                                                        0.1s
 =&amp;gt; [4/4] RUN pip install -r requirements.txt                                                  4.0s
 =&amp;gt; exporting to image                                                                         1.2s 
[+] up 12/12g to docker.io/library/myapp-web                                                   0.0s 
 ✔ Image redis           Pulled                                                                3.5s 
 ✔ Image myapp-web       Built                                                                 11.8s
 ✔ Network myapp_default Created                                                               0.1s
 ✔ Container redis       Created                                                               0.1s
 ✔ Container python      Created                                                               0.1s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;web&lt;/code&gt; image built from &lt;code&gt;app/Dockerfile&lt;/code&gt;, the &lt;code&gt;redis&lt;/code&gt; image was pulled, and both containers were created.&lt;/p&gt;




&lt;h2&gt;
  
  
  Verify the Containers Are Running
&lt;/h2&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;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME      IMAGE       COMMAND                  SERVICE     CREATED          STATUS          PORTS
python    myapp-web   "/bin/sh -c 'python …"   web         13 seconds ago   Up 12 seconds   0.0.0.0:5000-&amp;gt;5000/tcp, [::]:5000-&amp;gt;5000/tcp
redis     redis       "docker-entrypoint.s…"   redis_app   14 seconds ago   Up 12 seconds   6379/tcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both containers are running with the preserved names &lt;code&gt;python&lt;/code&gt; and &lt;code&gt;redis&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Check Container Logs
&lt;/h2&gt;



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

&lt;/div&gt;



&lt;p&gt;Output (abridged):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python  |  * Serving Flask app 'app'
python  |  * Debug mode: on
python  |  * Running on all addresses (0.0.0.0)
python  |  * Running on http://127.0.0.1:5000
python  |  * Running on http://172.17.0.3:5000
python  | Press CTRL+C to quit
python  |  * Restarting with stat
python  |  * Debugger is active!
redis   | Starting Redis Server
redis   | 1:C 28 Oct 2026 09:19:34.548 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis   | 1:M 28 Oct 2026 09:19:34.549 * Running mode=standalone, port=6379.
redis   | 1:M 28 Oct 2026 09:19:34.555 * Ready to accept connections tcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Flask application is serving on port 5000, and Redis is ready to accept connections on port 6379.&lt;/p&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; http://localhost:5000/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;
&lt;span class="na"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Werkzeug/3.1.9 Python/3.13.0b1&lt;/span&gt;
&lt;span class="na"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Wed, 28 Oct 2026 09:20:17 GMT&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;text/html; charset=utf-8&lt;/span&gt;
&lt;span class="na"&gt;Content-Length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;53&lt;/span&gt;
&lt;span class="na"&gt;Connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;close&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The HTTP 200 OK response confirms the application is accessible through the mapped port.&lt;/p&gt;




&lt;h2&gt;
  
  
  Complete Command Sequence
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh steve@stapp02
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;

&lt;span class="nb"&gt;cd&lt;/span&gt; /opt/docker
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /opt/docker/app
&lt;span class="nb"&gt;cat&lt;/span&gt; /opt/docker/docker-compose.yml

vi /opt/docker/docker-compose.yml
&lt;span class="c"&gt;# Apply fixes: build, ports, depends_on&lt;/span&gt;

docker compose config
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
docker compose ps
docker compose logs
curl &lt;span class="nt"&gt;-I&lt;/span&gt; http://localhost:5000/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>devops</category>
      <category>docker</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title>Resolve Dockerfile Issues</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Tue, 27 Oct 2026 12:02:20 +0000</pubDate>
      <link>https://dev.to/janak0ff/resolve-dockerfile-issues-5ck4</link>
      <guid>https://dev.to/janak0ff/resolve-dockerfile-issues-5ck4</guid>
      <description>&lt;p&gt;The Nautilus DevOps team is working to create new images per requirements shared by the development team. One of the team members is working to create a &lt;code&gt;Dockerfile&lt;/code&gt; on &lt;code&gt;App Server 1&lt;/code&gt; in &lt;code&gt;Stratos DC&lt;/code&gt;. While working on it she ran into issues in which the docker build is failing and displaying errors. Look into the issue and fix it to build an image as per details mentioned below:&lt;br&gt;
a. The &lt;code&gt;Dockerfile&lt;/code&gt; is placed on &lt;code&gt;App Server 1&lt;/code&gt; under &lt;code&gt;/opt/docker&lt;/code&gt; directory.&lt;br&gt;&lt;br&gt;
b. Fix the issues with this file and make sure it is able to build the image.&lt;br&gt;&lt;br&gt;
c. Do not change base image, any other valid configuration within Dockerfile, or any of the data been used — for example, index.html.  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;Note:&lt;/code&gt; Please note that once you click on &lt;code&gt;FINISH&lt;/code&gt; button all the existing containers will be destroyed and new image will be built from your &lt;code&gt;Dockerfile&lt;/code&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Connect to App Server 1
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh tony@stapp01
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Password for tony: Ir0nM@n&lt;/p&gt;


&lt;h2&gt;
  
  
  Inspect the Build Context
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /opt/docker
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;total 24
drwxrwxrwx 4 root root 4096 Oct 27 11:53 .
drwxr-xr-x 1 root root 4096 Oct 27 11:53 ..
-rw-r--r-- 1 root root  504 Oct 27 11:53 Dockerfile
drwxr-xr-x 2 root root 4096 Oct 27 11:53 certs
drwxr-xr-x 2 root root 4096 Oct 27 11:53 html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The build context contains the Dockerfile, a &lt;code&gt;certs/&lt;/code&gt; directory, and an &lt;code&gt;html/&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;Verify the actual file locations:&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;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /opt/docker/certs/
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /opt/docker/html/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;total 16
drwxr-xr-x 2 root root 4096 Oct 27 11:53 .
drwxrwxrwx 4 root root 4096 Oct 27 11:53 ..
-rw-r--r-- 1 root root 1305 Oct 27 11:53 server.crt
-rw-r--r-- 1 root root 1674 Oct 27 11:53 server.key

total 12
drwxr-xr-x 2 root root 4096 Oct 27 11:53 .
drwxrwxrwx 4 root root 4096 Oct 27 11:53 ..
-rw-r--r-- 1 root root   22 Oct 27 11:53 index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The certificate files are inside &lt;code&gt;certs/&lt;/code&gt; and the website file is inside &lt;code&gt;html/&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  View the Original Dockerfile
&lt;/h2&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; /opt/docker/Dockerfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Original content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; httpd:2.4.43&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"s/Listen 80/Listen 8080/g"&lt;/span&gt; /usr/local/apache2/conf/httpd.conf

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/LoadModule\ ssl_module modules\/mod_ssl.so/s/^#//g'&lt;/span&gt; conf/httpd.conf

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/LoadModule\ socache_shmcb_module modules\/mod_socache_shmcb.so/s/^#//g'&lt;/span&gt; conf/httpd.conf

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/Include\ conf\/extra\/httpd-ssl.conf/s/^#//g'&lt;/span&gt; conf/httpd.conf

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; /server.crt /usr/local/apache2/conf/server.crt&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; /server.key /usr/local/apache2/conf/server.key&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; ./index.html /usr/local/apache2/htdocs/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Issues Identified
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Line&lt;/th&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;COPY /server.crt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Absolute path &lt;code&gt;/server.crt&lt;/code&gt; does not exist in the build context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;COPY /server.key&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Absolute path &lt;code&gt;/server.key&lt;/code&gt; does not exist in the build context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;COPY ./index.html&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;index.html&lt;/code&gt; is not in the build context root; it is inside &lt;code&gt;html/&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;conf/httpd.conf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Relative path used instead of full path for consistency&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Fix the Dockerfile
&lt;/h2&gt;

&lt;p&gt;Edit the file:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Corrected content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; httpd:2.4.43&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"s/Listen 80/Listen 8080/g"&lt;/span&gt; /usr/local/apache2/conf/httpd.conf

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/LoadModule\ ssl_module modules\/mod_ssl.so/s/^#//g'&lt;/span&gt; /usr/local/apache2/conf/httpd.conf

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/LoadModule\ socache_shmcb_module modules\/mod_socache_shmcb.so/s/^#//g'&lt;/span&gt; /usr/local/apache2/conf/httpd.conf

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/Include\ conf\/extra\/httpd-ssl.conf/s/^#//g'&lt;/span&gt; /usr/local/apache2/conf/httpd.conf

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; certs/server.crt /usr/local/apache2/conf/server.crt&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; certs/server.key /usr/local/apache2/conf/server.key&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; html/index.html /usr/local/apache2/htdocs/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the corrected file:&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; /opt/docker/Dockerfile
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&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; httpd:2.4.43&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"s/Listen 80/Listen 8080/g"&lt;/span&gt; /usr/local/apache2/conf/httpd.conf

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/LoadModule\ ssl_module modules\/mod_ssl.so/s/^#//g'&lt;/span&gt; /usr/local/apache2/conf/httpd.conf

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/LoadModule\ socache_shmcb_module modules\/mod_socache_shmcb.so/s/^#//g'&lt;/span&gt; /usr/local/apache2/conf/httpd.conf

&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/Include\ conf\/extra\/httpd-ssl.conf/s/^#//g'&lt;/span&gt; /usr/local/apache2/conf/httpd.conf

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; certs/server.crt /usr/local/apache2/conf/server.crt&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; certs/server.key /usr/local/apache2/conf/server.key&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; html/index.html /usr/local/apache2/htdocs/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Build the Image
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /opt/docker
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; custom-httpd:latest &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[+] Building 11.1s (13/13) FINISHED                                                  docker:default
 =&amp;gt; [internal] load build definition from Dockerfile                                           0.1s
 =&amp;gt; =&amp;gt; transferring dockerfile: 614B                                                           0.0s
 =&amp;gt; [internal] load metadata for docker.io/library/httpd:2.4.43                                1.3s
 =&amp;gt; [internal] load .dockerignore                                                              0.1s
 =&amp;gt; =&amp;gt; transferring context: 2B                                                                0.0s
 =&amp;gt; [1/8] FROM docker.io/library/httpd:2.4.43@sha256:cd88fee4eab37f0d8cd04b06ef97285ca981c27b  4.9s
 =&amp;gt; =&amp;gt; resolve docker.io/library/httpd:2.4.43@sha256:cd88fee4eab37f0d8cd04b06ef97285ca981c27b  0.1s
 =&amp;gt; =&amp;gt; sha256:b5fc3125d9129e4cdd43f496195cc8f39d43e9bad171044ecb5b8f82b2f6e 10.37MB / 10.37MB  0.5s
 =&amp;gt; =&amp;gt; sha256:cd88fee4eab37f0d8cd04b06ef97285ca981c27b4d685f0321e65c5d4fd4935 1.86kB / 1.86kB  0.0s
 =&amp;gt; =&amp;gt; sha256:53729354a74c9c146aa8726a8906e833755066ada1a478782f4dfb2ea6994b5 1.37kB / 1.37kB  0.0s
 =&amp;gt; =&amp;gt; sha256:f1455599cc2e008a4555f14451e590f071371d371a3b87790651a367357d252 7.35kB / 7.35kB  0.0s
 =&amp;gt; =&amp;gt; sha256:bf59529304463f62efa7179fa1a32718a611528cc4ce9f30c0d1bbc6724ec 27.09MB / 27.09MB  0.6s
 =&amp;gt; =&amp;gt; sha256:3d3fecf6569b94e406086a2b68a7c8930254490b45c0de4911f497ea9cf0876c 146B / 146B     0.5s
 =&amp;gt; =&amp;gt; extracting sha256:bf59529304463f62efa7179fa1a32718a611528cc4ce9f30c0d1bbc6724ec3fb      1.1s
 =&amp;gt; =&amp;gt; sha256:34b7e9053f76ca3c9dc574c5034679769256a596008efbfbff1d1b1546600841 298B / 298B     0.8s
 =&amp;gt; =&amp;gt; sha256:3c61041685c0f65e0b375bae6ae6bdeab9b6c20960dbef5e30201db18a4e6 24.47MB / 24.47MB  1.1s
 =&amp;gt; =&amp;gt; extracting sha256:3d3fecf6569b94e406086a2b68a7c8930254490b45c0de4911f497ea9cf0876c      0.0s
 =&amp;gt; =&amp;gt; extracting sha256:b5fc3125d9129e4cdd43f496195cc8f39d43e9bad171044ecb5b8f82b2f6e30d      0.6s
 =&amp;gt; =&amp;gt; extracting sha256:3c61041685c0f65e0b375bae6ae6bdeab9b6c20960dbef5e30201db18a4e6d4a      0.8s
 =&amp;gt; =&amp;gt; extracting sha256:34b7e9053f76ca3c9dc574c5034679769256a596008efbfbff1d1b1546600841      0.1s
 =&amp;gt; [internal] load build context                                                              0.1s
 =&amp;gt; =&amp;gt; transferring context: 3.19kB                                                            0.0s
 =&amp;gt; [2/8] RUN sed -i "s/Listen 80/Listen 8080/g" /usr/local/apache2/conf/httpd.conf            0.4s
 =&amp;gt; [3/8] RUN sed -i '/LoadModule\ ssl_module modules\/mod_ssl.so/s/^#//g' /usr/local/apache2  0.4s
 =&amp;gt; [4/8] RUN sed -i '/LoadModule\ socache_shmcb_module modules\/mod_socache_shmcb.so/s/^#//g  0.4s
 =&amp;gt; [5/8] RUN sed -i '/Include\ conf\/extra\/httpd-ssl.conf/s/^#//g' /usr/local/apache2/conf/  0.4s
 =&amp;gt; [6/8] COPY certs/server.crt /usr/local/apache2/conf/server.crt                             0.2s
 =&amp;gt; [7/8] COPY certs/server.key /usr/local/apache2/conf/server.key                             0.2s
 =&amp;gt; [8/8] COPY html/index.html /usr/local/apache2/htdocs/                                      0.2s
 =&amp;gt; exporting to image                                                                         2.2s
 =&amp;gt; =&amp;gt; exporting layers                                                                        2.1s
 =&amp;gt; =&amp;gt; writing image sha256:5e09aa4b303916f8711b6a5fe65a7ec15b14ae21d15e12ee326d17930ef3fc64   0.0s
 =&amp;gt; =&amp;gt; naming to docker.io/library/custom-httpd:latest                                         0.0s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The build completed successfully with all 13 steps finished.&lt;/p&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker images | &lt;span class="nb"&gt;grep &lt;/span&gt;custom-httpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;custom-httpd   latest    5e09aa4b3039   5 seconds ago   166MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The image &lt;code&gt;custom-httpd:latest&lt;/code&gt; was built successfully.&lt;/p&gt;




&lt;h2&gt;
  
  
  Complete Command Sequence
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh tony@stapp01
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;

&lt;span class="nb"&gt;cd&lt;/span&gt; /opt/docker
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /opt/docker/certs/
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /opt/docker/html/
&lt;span class="nb"&gt;cat&lt;/span&gt; /opt/docker/Dockerfile

vi /opt/docker/Dockerfile
&lt;span class="c"&gt;# Fix the COPY paths&lt;/span&gt;

&lt;span class="nb"&gt;cat&lt;/span&gt; /opt/docker/Dockerfile

docker build &lt;span class="nt"&gt;-t&lt;/span&gt; custom-httpd:latest &lt;span class="nb"&gt;.&lt;/span&gt;
docker images | &lt;span class="nb"&gt;grep &lt;/span&gt;custom-httpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>debugging</category>
      <category>devops</category>
      <category>docker</category>
    </item>
    <item>
      <title>Write a Docker Compose File</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Tue, 27 Oct 2026 11:40:10 +0000</pubDate>
      <link>https://dev.to/janak0ff/write-a-docker-compose-file-8e2</link>
      <guid>https://dev.to/janak0ff/write-a-docker-compose-file-8e2</guid>
      <description>&lt;p&gt;The Nautilus application development team shared static website content that needs to be hosted on the &lt;code&gt;httpd&lt;/code&gt; web server using a containerised platform. The team has shared details with the DevOps team, and we need to set up an environment according to those guidelines. Below are the details:  &lt;/p&gt;

&lt;p&gt;a. On &lt;code&gt;App Server 3&lt;/code&gt; in &lt;code&gt;Stratos DC&lt;/code&gt; create a container named &lt;code&gt;httpd&lt;/code&gt; using a docker compose file &lt;code&gt;/opt/docker/docker-compose.yml&lt;/code&gt; (please use the exact name for file).&lt;br&gt;&lt;br&gt;
b. Use &lt;code&gt;httpd&lt;/code&gt; (preferably &lt;code&gt;latest&lt;/code&gt; tag) image for container and make sure container is named as &lt;code&gt;httpd&lt;/code&gt;; you can use any name for service.&lt;br&gt;&lt;br&gt;
c. Map &lt;code&gt;80&lt;/code&gt; number port of container with port &lt;code&gt;6000&lt;/code&gt; of docker host.&lt;br&gt;&lt;br&gt;
d. Map container's &lt;code&gt;/usr/local/apache2/htdocs&lt;/code&gt; volume with &lt;code&gt;/opt/itadmin&lt;/code&gt; volume of docker host which is already there. (please do not modify any data within these locations).&lt;/p&gt;


&lt;h2&gt;
  
  
  Connect to App Server 3
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh banner@stapp03
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Password for banner: BigGr33n&lt;/p&gt;


&lt;h2&gt;
  
  
  Create the Docker Directory
&lt;/h2&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; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Verify the Host Volume Exists
&lt;/h2&gt;


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

&lt;/div&gt;


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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;total 16
drwxr-xr-x 2 root root 4096 Oct 27 11:34 .
drwxr-xr-x 1 root root 4096 Oct 27 11:34 ..
-rw-r--r-- 1 root root   34 Oct 27 11:34 index1.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The host directory &lt;code&gt;/opt/itadmin&lt;/code&gt; exists and contains the static website content (&lt;code&gt;index1.html&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  Create the Docker Compose File
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vi /opt/docker/docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the following content:&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;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;httpd&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;httpd:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;httpd&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;6000:80"&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;/opt/itadmin:/usr/local/apache2/htdocs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the file:&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; /opt/docker/docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&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;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;httpd&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;httpd:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;httpd&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;6000:80"&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;/opt/itadmin:/usr/local/apache2/htdocs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Start the Container Using Docker Compose
&lt;/h2&gt;



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

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WARN[0000] /opt/docker/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
[+] up 9/9
 ✔ Image httpd:latest     Pulled                                                                4.9s
 ✔ Network docker_default Created                                                               0.1s
 ✔ Container httpd        Created                                                               0.1s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The warning about the &lt;code&gt;version&lt;/code&gt; attribute is informational only; it does not affect functionality.&lt;/p&gt;




&lt;h2&gt;
  
  
  Verify the Container is Running
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps | &lt;span class="nb"&gt;grep &lt;/span&gt;httpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;c1795d69f717   httpd:latest   "httpd-foreground"   5 seconds ago   Up 4 seconds   0.0.0.0:6000-&amp;gt;80/tcp, :::6000-&amp;gt;80/tcp   httpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The container &lt;code&gt;httpd&lt;/code&gt; is running and port &lt;code&gt;6000&lt;/code&gt; is mapped to container port &lt;code&gt;80&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Verify the Port Mapping
&lt;/h2&gt;



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

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;80/tcp -&amp;gt; 0.0.0.0:6000
80/tcp -&amp;gt; [::]:6000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Verify the Volume Mapping
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker inspect httpd &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{{range .Mounts}}{{.Source}} -&amp;gt; {{.Destination}}{{end}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/opt/itadmin -&amp;gt; /usr/local/apache2/htdocs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The host &lt;code&gt;/opt/itadmin&lt;/code&gt; is correctly mapped to the container document root.&lt;/p&gt;




&lt;h2&gt;
  
  
  Test the Website
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; http://localhost:6000/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;
&lt;span class="na"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Tue, 27 Oct 2026 11:37:44 GMT&lt;/span&gt;
&lt;span class="na"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Apache/2.4.69 (Unix)&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;text/html;charset=ISO-8859-1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The HTTP 200 OK response confirms the web server is accessible on host port 6000.&lt;/p&gt;




&lt;h2&gt;
  
  
  Complete Command Sequence
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh banner@stapp03
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;

&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/docker

&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /opt/docker/docker-compose.yml &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
version: '3.8'

services:
  httpd:
    image: httpd:latest
    container_name: httpd
    ports:
      - "6000:80"
    volumes:
      - /opt/itadmin:/usr/local/apache2/htdocs
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /opt/docker/docker-compose.yml

&lt;span class="nb"&gt;cd&lt;/span&gt; /opt/docker
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;

docker ps | &lt;span class="nb"&gt;grep &lt;/span&gt;httpd
docker port httpd
docker inspect httpd &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{{range .Mounts}}{{.Source}} -&amp;gt; {{.Destination}}{{end}}'&lt;/span&gt;
curl &lt;span class="nt"&gt;-I&lt;/span&gt; http://localhost:6000/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>docker</category>
    </item>
    <item>
      <title>Save, Load and Transfer Docker Image</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Tue, 27 Oct 2026 11:33:42 +0000</pubDate>
      <link>https://dev.to/janak0ff/save-load-and-transfer-docker-image-584l</link>
      <guid>https://dev.to/janak0ff/save-load-and-transfer-docker-image-584l</guid>
      <description>&lt;p&gt;One of the DevOps team members was working on to create a new custom docker image on App Server 1 in Stratos DC. He is done with his changes and image is saved on same server with name apps:nautilus. Recently a requirement has been raised by a team to use that image for testing, but the team wants to test the same on App Server 3. So we need to provide them that image on App Server 3 in Stratos DC.&lt;/p&gt;

&lt;p&gt;a. On App Server 1 save the image apps:nautilus in an archive.&lt;br&gt;
b. Transfer the image archive to App Server 3.&lt;br&gt;
c. Load that image archive on App Server 3 with same name and tag which was used on App Server 1.&lt;/p&gt;

&lt;p&gt;Note: Docker is already installed on both servers; however, if its service is down please make sure to start it.&lt;/p&gt;


&lt;h2&gt;
  
  
  Connect to App Server 1
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh tony@stapp01
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Password for tony: Ir0nM@n&lt;/p&gt;


&lt;h2&gt;
  
  
  Verify the Image Exists
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker images | &lt;span class="nb"&gt;grep &lt;/span&gt;apps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apps         nautilus   4aa886374dbd   About a minute ago   145MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The image &lt;code&gt;apps:nautilus&lt;/code&gt; is present on App Server 1.&lt;/p&gt;




&lt;h2&gt;
  
  
  Save the Image to an Archive
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker save &lt;span class="nt"&gt;-o&lt;/span&gt; /tmp/apps_nautilus.tar apps:nautilus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the archive was created:&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;ls&lt;/span&gt; &lt;span class="nt"&gt;-lh&lt;/span&gt; /tmp/apps_nautilus.tar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-rw------- 1 root root 150M Oct 27 11:27 /tmp/apps_nautilus.tar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The archive is 150MB in size.&lt;/p&gt;




&lt;h2&gt;
  
  
  Transfer the Archive to App Server 3
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;scp /tmp/apps_nautilus.tar banner@stapp03:/tmp/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Transfer progress:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apps_nautilus.tar                                                 100%  149MB 106.4MB/s   00:01
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The archive was transferred successfully to App Server 3.&lt;/p&gt;




&lt;h2&gt;
  
  
  Connect to App Server 3
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh banner@stapp03
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Password for banner: BigGr33n&lt;/p&gt;




&lt;h2&gt;
  
  
  Verify Docker Service is Running
&lt;/h2&gt;



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

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;● docker.service - Docker Application Container Engine
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: disabled)
     Active: active (running) since Tue 2026-10-27 11:17:35 UTC; 11min ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 1379 (dockerd)
      Tasks: 21
     Memory: 29.7M (peak: 32.7M)
        CPU: 227ms
     CGroup: /system.slice/docker.service
             └─1379 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docker service is active and running.&lt;/p&gt;

&lt;p&gt;Ensure Docker starts on boot:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  Verify the Archive on App Server 3
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lh&lt;/span&gt; /tmp/apps_nautilus.tar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-rw------- 1 banner banner 150M Oct 27 11:28 /tmp/apps_nautilus.tar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The archive is present on App Server 3.&lt;/p&gt;




&lt;h2&gt;
  
  
  Load the Image Archive
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker load &lt;span class="nt"&gt;-i&lt;/span&gt; /tmp/apps_nautilus.tar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;5cac300e390e: Loading layer    113MB/113MB
5f4be2c3bade: Loading layer  10.24kB/10.24kB
69aa46425f87: Loading layer   43.6MB/43.6MB
Loaded image: apps:nautilus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The image layers were loaded successfully.&lt;/p&gt;

&lt;p&gt;Alternative syntax:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker load &amp;lt; /tmp/apps_nautilus.tar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Loaded image: apps:nautilus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Verify the Image on App Server 3
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker images | &lt;span class="nb"&gt;grep &lt;/span&gt;apps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apps         nautilus   4aa886374dbd   4 minutes ago   145MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The image &lt;code&gt;apps:nautilus&lt;/code&gt; is loaded on App Server 3 with the same image ID (&lt;code&gt;4aa886374dbd&lt;/code&gt;), name, and tag as on App Server 1.&lt;/p&gt;




&lt;h2&gt;
  
  
  Complete Command Sequence
&lt;/h2&gt;

&lt;h3&gt;
  
  
  On App Server 1
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh tony@stapp01
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;

docker images | &lt;span class="nb"&gt;grep &lt;/span&gt;apps
docker save &lt;span class="nt"&gt;-o&lt;/span&gt; /tmp/apps_nautilus.tar apps:nautilus
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lh&lt;/span&gt; /tmp/apps_nautilus.tar

scp /tmp/apps_nautilus.tar banner@stapp03:/tmp/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  On App Server 3
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh banner@stapp03
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;

systemctl status docker
systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;docker
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-lh&lt;/span&gt; /tmp/apps_nautilus.tar
docker load &lt;span class="nt"&gt;-i&lt;/span&gt; /tmp/apps_nautilus.tar
docker images | &lt;span class="nb"&gt;grep &lt;/span&gt;apps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>devops</category>
      <category>docker</category>
      <category>linux</category>
    </item>
    <item>
      <title>Docker Ports Mapping</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Tue, 27 Oct 2026 11:20:59 +0000</pubDate>
      <link>https://dev.to/janak0ff/docker-ports-mapping-6dg</link>
      <guid>https://dev.to/janak0ff/docker-ports-mapping-6dg</guid>
      <description>&lt;p&gt;The Nautilus DevOps team is planning to host an application on a nginx-based container. There are number of tickets already been created for similar tasks. One of the tickets has been assigned to set up a nginx container on &lt;code&gt;Application Server 1&lt;/code&gt; in &lt;code&gt;Stratos Datacenter&lt;/code&gt;. Please perform the task as per details mentioned below:&lt;/p&gt;

&lt;p&gt;a. Pull &lt;code&gt;nginx:stable&lt;/code&gt; docker image on &lt;code&gt;Application Server 1&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
b. Create a container named &lt;code&gt;cluster&lt;/code&gt; using the image you pulled.&lt;br&gt;&lt;br&gt;
c. Map host port &lt;code&gt;8089&lt;/code&gt; to container port &lt;code&gt;80&lt;/code&gt;. Please keep the container in running state.&lt;/p&gt;


&lt;h2&gt;
  
  
  Connect to App Server 1
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh tony@stapp01
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Password for tony: Ir0nM@n&lt;/p&gt;


&lt;h2&gt;
  
  
  Pull the nginx:stable Image
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull nginx:stable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The image was pulled successfully with digest &lt;code&gt;sha256:a7675fcee220f59b4a99f7098c06a0d5d999c2c0ee37c0211efb780536e5cb20&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Verify the image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker images | &lt;span class="nb"&gt;grep &lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nginx        stable    2cbc7a375718   6 days ago   162MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Create the Container with Port Mapping
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; cluster &lt;span class="nt"&gt;-p&lt;/span&gt; 8089:80 nginx:stable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The container was created with ID &lt;code&gt;be82a3c468a5&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Verify the Container is Running
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps | &lt;span class="nb"&gt;grep &lt;/span&gt;cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;be82a3c468a5   nginx:stable   "/docker-entrypoint.…"   8 seconds ago   Up 7 seconds   0.0.0.0:8089-&amp;gt;80/tcp, :::8089-&amp;gt;80/tcp   cluster
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The container &lt;code&gt;cluster&lt;/code&gt; is running and port &lt;code&gt;8089&lt;/code&gt; is mapped to container port &lt;code&gt;80&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Verify the Port Mapping
&lt;/h2&gt;



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

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;80/tcp -&amp;gt; 0.0.0.0:8089
80/tcp -&amp;gt; [::]:8089
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternative verification:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker inspect cluster &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{{range $p, $conf := .NetworkSettings.Ports}}{{$p}} -&amp;gt; {{(index $conf 0).HostPort}}{{end}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;80/tcp -&amp;gt; 8089
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Test the Port Mapping
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-I&lt;/span&gt; http://localhost:8089/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;
&lt;span class="na"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx/1.30.6&lt;/span&gt;
&lt;span class="na"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Tue, 27 Oct 2026 11:18:14 GMT&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;text/html&lt;/span&gt;
&lt;span class="na"&gt;Content-Length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;896&lt;/span&gt;
&lt;span class="na"&gt;Last-Modified&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Fri, 02 Oct 2026 14:33:28 GMT&lt;/span&gt;
&lt;span class="na"&gt;Connection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keep-alive&lt;/span&gt;
&lt;span class="na"&gt;ETag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"6abfc0b8-380"&lt;/span&gt;
&lt;span class="na"&gt;Accept-Ranges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bytes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The HTTP 200 OK response confirms the nginx container is accessible on host port 8089.&lt;/p&gt;




&lt;h2&gt;
  
  
  Complete Command Sequence
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh tony@stapp01
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;

docker pull nginx:stable

docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; cluster &lt;span class="nt"&gt;-p&lt;/span&gt; 8089:80 nginx:stable

docker ps | &lt;span class="nb"&gt;grep &lt;/span&gt;cluster
docker port cluster
curl &lt;span class="nt"&gt;-I&lt;/span&gt; http://localhost:8089/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>docker</category>
      <category>portsmapping</category>
    </item>
    <item>
      <title>Docker Volumes Mapping</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Tue, 27 Oct 2026 11:14:34 +0000</pubDate>
      <link>https://dev.to/janak0ff/docker-volumes-mapping-3010</link>
      <guid>https://dev.to/janak0ff/docker-volumes-mapping-3010</guid>
      <description>&lt;p&gt;The Nautilus DevOps team is testing applications containerization, which is supposed to be migrated on docker container-based environments soon. In today's stand-up meeting one of the team members has been assigned a task to create and test a docker container with certain requirements. Below are more details:&lt;/p&gt;

&lt;p&gt;a. On &lt;code&gt;App Server 1&lt;/code&gt; in &lt;code&gt;Stratos DC&lt;/code&gt; pull &lt;code&gt;nginx&lt;/code&gt; image (preferably &lt;code&gt;latest&lt;/code&gt; tag but others should work too).  &lt;/p&gt;

&lt;p&gt;b. Create a new container with name &lt;code&gt;news&lt;/code&gt; from the image you just pulled.  &lt;/p&gt;

&lt;p&gt;c. Map the host volume &lt;code&gt;/opt/itadmin&lt;/code&gt; with container volume &lt;code&gt;/tmp&lt;/code&gt;. There is an &lt;code&gt;sample.txt&lt;/code&gt; file present on same server under &lt;code&gt;/tmp&lt;/code&gt;; copy that file to &lt;code&gt;/opt/itadmin&lt;/code&gt;. Also please keep the container in running state.&lt;/p&gt;




&lt;h2&gt;
  
  
  Connect to App Server 1
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh tony@stapp01
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Password for tony: Ir0nM@n&lt;/p&gt;




&lt;h2&gt;
  
  
  Pull the nginx Image
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull nginx:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The image was pulled successfully with digest &lt;code&gt;sha256:4c41e2d0a3a55b325ed572cd0200bdb72af1433c3daa2bca6ef8eea68ce504a2&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Verify the image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker images | &lt;span class="nb"&gt;grep &lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nginx        latest    14700d2ee6c4   5 days ago   163MB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Verify and Copy the Sample File
&lt;/h2&gt;

&lt;p&gt;Confirm the sample file exists:&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;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /tmp/sample.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-rw-r--r-- 1 root root 23 Oct 27 11:05 /tmp/sample.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create the target directory and copy the file:&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; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/itadmin
&lt;span class="nb"&gt;cp&lt;/span&gt; /tmp/sample.txt /opt/itadmin/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the copy:&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;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /opt/itadmin/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-rw-r--r-- 1 root root   23 Oct 27 11:09 sample.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Create the Container with Volume Mapping
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; news &lt;span class="nt"&gt;-v&lt;/span&gt; /opt/itadmin:/tmp nginx:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The container was created with ID &lt;code&gt;f6d16445bdf5&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Verify the Container is Running
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps | &lt;span class="nb"&gt;grep &lt;/span&gt;news
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;f6d16445bdf5   nginx:latest   "/docker-entrypoint.…"   16 seconds ago   Up 15 seconds   80/tcp    news
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The container &lt;code&gt;news&lt;/code&gt; is running.&lt;/p&gt;




&lt;h2&gt;
  
  
  Verify the Volume Mapping
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker inspect news &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{{range .Mounts}}{{.Source}} -&amp;gt; {{.Destination}}{{end}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/opt/itadmin -&amp;gt; /tmp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The host &lt;code&gt;/opt/itadmin&lt;/code&gt; is correctly mapped to container &lt;code&gt;/tmp&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Verify the File Inside the Container
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec &lt;/span&gt;news &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /tmp/sample.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-rw-r--r-- 1 root root 23 Oct 27 11:09 /tmp/sample.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The file is accessible inside the container through the volume mount.&lt;/p&gt;




&lt;h2&gt;
  
  
  Complete Command Sequence
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh tony@stapp01
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;

docker pull nginx:latest

&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/itadmin
&lt;span class="nb"&gt;cp&lt;/span&gt; /tmp/sample.txt /opt/itadmin/

docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; news &lt;span class="nt"&gt;-v&lt;/span&gt; /opt/itadmin:/tmp nginx:latest

docker ps | &lt;span class="nb"&gt;grep &lt;/span&gt;news
docker inspect news &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{{range .Mounts}}{{.Source}} -&amp;gt; {{.Destination}}{{end}}'&lt;/span&gt;
docker &lt;span class="nb"&gt;exec &lt;/span&gt;news &lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; /tmp/sample.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>docker</category>
      <category>volumes</category>
      <category>mapping</category>
    </item>
    <item>
      <title>Create a Docker Network</title>
      <dc:creator>Janak Shrestha</dc:creator>
      <pubDate>Tue, 27 Oct 2026 10:40:28 +0000</pubDate>
      <link>https://dev.to/janak0ff/create-a-docker-network-1n3k</link>
      <guid>https://dev.to/janak0ff/create-a-docker-network-1n3k</guid>
      <description>&lt;p&gt;The Nautilus DevOps team needs to set up several docker environments for different applications. One of the team members has been assigned a ticket where he has been asked to create some docker networks to be used later. Complete the task based on the following ticket description:&lt;/p&gt;

&lt;p&gt;a. Create a docker network named as &lt;code&gt;ecommerce&lt;/code&gt; on App Server &lt;code&gt;2&lt;/code&gt; in &lt;code&gt;Stratos DC&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
b. Configure it to use &lt;code&gt;bridge&lt;/code&gt; drivers.&lt;br&gt;&lt;br&gt;
c. Set it to use subnet &lt;code&gt;10.10.1.0/24&lt;/code&gt; and iprange &lt;code&gt;10.10.1.0/24&lt;/code&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Connect to App Server 2
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh steve@stapp02
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Password for steve: Am3ric@&lt;/p&gt;


&lt;h2&gt;
  
  
  Create the Docker Network
&lt;/h2&gt;

&lt;p&gt;Create the network named &lt;code&gt;ecommerce&lt;/code&gt; using the bridge driver with the specified subnet and IP range:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network create &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--driver&lt;/span&gt; bridge &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--subnet&lt;/span&gt; 10.10.1.0/24 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--ip-range&lt;/span&gt; 10.10.1.0/24 &lt;span class="se"&gt;\&lt;/span&gt;
  ecommerce
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The network was created successfully with ID &lt;code&gt;dff163cd2d75&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Verify the Network
&lt;/h2&gt;

&lt;p&gt;Confirm the network exists:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network &lt;span class="nb"&gt;ls&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;ecommerce
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dff163cd2d75   ecommerce   bridge    local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The network &lt;code&gt;ecommerce&lt;/code&gt; is listed with the bridge driver.&lt;/p&gt;




&lt;h2&gt;
  
  
  Inspect the Network Configuration
&lt;/h2&gt;

&lt;p&gt;View full network details:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Key values from the output:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&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;Name&lt;/td&gt;
&lt;td&gt;ecommerce&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Driver&lt;/td&gt;
&lt;td&gt;bridge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subnet&lt;/td&gt;
&lt;td&gt;10.10.1.0/24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IPRange&lt;/td&gt;
&lt;td&gt;10.10.1.0/24&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Verify individual settings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker network inspect ecommerce &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Driver: {{.Driver}}'&lt;/span&gt;
docker network inspect ecommerce &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Subnet: {{range .IPAM.Config}}{{.Subnet}}{{end}}'&lt;/span&gt;
docker network inspect ecommerce &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'IPRange: {{range .IPAM.Config}}{{.IPRange}}{{end}}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Driver: bridge
Subnet: 10.10.1.0/24
IPRange: 10.10.1.0/24
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All settings confirmed correct.&lt;/p&gt;




&lt;h2&gt;
  
  
  Complete Command Sequence
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh steve@stapp02
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;

docker network create &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--driver&lt;/span&gt; bridge &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--subnet&lt;/span&gt; 10.10.1.0/24 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--ip-range&lt;/span&gt; 10.10.1.0/24 &lt;span class="se"&gt;\&lt;/span&gt;
  ecommerce

docker network &lt;span class="nb"&gt;ls&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;ecommerce
docker network inspect ecommerce
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






</description>
      <category>docker</category>
      <category>dockernetwork</category>
      <category>network</category>
    </item>
  </channel>
</rss>
