<?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: Shanmugananthan A K</title>
    <description>The latest articles on DEV Community by Shanmugananthan A K (@iamshanmugananthan).</description>
    <link>https://dev.to/iamshanmugananthan</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3380567%2F49289f7e-cc49-4e07-89a4-56333210fab5.jpg</url>
      <title>DEV Community: Shanmugananthan A K</title>
      <link>https://dev.to/iamshanmugananthan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iamshanmugananthan"/>
    <language>en</language>
    <item>
      <title>🚀 Getting Started with Nagios Core: Monitoring Made Simple</title>
      <dc:creator>Shanmugananthan A K</dc:creator>
      <pubDate>Thu, 25 Sep 2025 11:52:26 +0000</pubDate>
      <link>https://dev.to/iamshanmugananthan/getting-started-with-nagios-core-monitoring-made-simple-2me3</link>
      <guid>https://dev.to/iamshanmugananthan/getting-started-with-nagios-core-monitoring-made-simple-2me3</guid>
      <description>&lt;p&gt;When it comes to &lt;strong&gt;IT infrastructure monitoring&lt;/strong&gt;, &lt;strong&gt;Nagios Core&lt;/strong&gt; is one of the most widely adopted open-source tools. It gives sysadmins the power to keep an eye on servers, networks, applications, and even devices like printers — all in one place.&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk you through &lt;strong&gt;how Nagios works&lt;/strong&gt;, its components, and a real-time example of monitoring a Linux server.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔎 What is Nagios?
&lt;/h2&gt;

&lt;p&gt;Nagios is an &lt;strong&gt;open-source monitoring engine&lt;/strong&gt; that continuously tracks your IT environment. It detects issues (like high CPU usage, disk running out of space, or services going down) and &lt;strong&gt;alerts admins immediately&lt;/strong&gt;, helping reduce downtime.&lt;/p&gt;

&lt;p&gt;Nagios Core can scale to &lt;strong&gt;monitor thousands of hosts and services&lt;/strong&gt;, making it a great fit for small setups as well as large enterprise infrastructures.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Nagios Architecture
&lt;/h2&gt;

&lt;p&gt;A Nagios setup usually has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nagios Server (Central host)&lt;/strong&gt; → Runs Nagios Core, holds all configs, and processes results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugins&lt;/strong&gt; → Small executables/scripts that check specific resources (disk, CPU, HTTP, FTP, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NRPE (Nagios Remote Plugin Executor)&lt;/strong&gt; → Allows Nagios to run plugins on remote Linux/Unix hosts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NSClient++&lt;/strong&gt; → Windows equivalent for running checks remotely.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔄 How Nagios Works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Nagios schedules checks using its &lt;strong&gt;monitoring engine&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It executes plugins locally or remotely (via NRPE/NSClient++).&lt;/li&gt;
&lt;li&gt;Plugins return results like:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;OK (all good)&lt;/li&gt;
&lt;li&gt;WARNING (threshold breached)&lt;/li&gt;
&lt;li&gt;CRITICAL (service down/major problem)

&lt;ol&gt;
&lt;li&gt;Nagios updates its &lt;strong&gt;status database&lt;/strong&gt; and triggers &lt;strong&gt;alerts&lt;/strong&gt; based on configuration.&lt;/li&gt;
&lt;li&gt;Alerts can be sent via email, SMS, Slack, Telegram, or custom scripts.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📬 Active vs Passive Checks
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Active Check&lt;/strong&gt; → Nagios runs the check itself (e.g., &lt;code&gt;check_http&lt;/code&gt; connects to port 80 of a web server).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Passive Check&lt;/strong&gt; → External apps or agents send results back to Nagios (e.g., SNMP traps).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📦 Nagios Directory Structure
&lt;/h2&gt;

&lt;p&gt;When you install Nagios Core, you’ll see something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nagios/
├── bin       &lt;span class="c"&gt;# Nagios main daemon&lt;/span&gt;
├── etc       &lt;span class="c"&gt;# All configuration files&lt;/span&gt;
├── libexec   &lt;span class="c"&gt;# Plugins (check_http, check_ping, etc.)&lt;/span&gt;
├── sbin      &lt;span class="c"&gt;# CGI executables for web interface&lt;/span&gt;
├── share     &lt;span class="c"&gt;# Web interface files (HTML/PHP)&lt;/span&gt;
└── var       &lt;span class="c"&gt;# Runtime data (logs, cache, status.dat)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🖥️ Real-Time Example: Monitoring an HTTP Service
&lt;/h2&gt;

&lt;p&gt;Let’s say you have a server at &lt;strong&gt;44.233.51.131&lt;/strong&gt; and you want to monitor if its web service is up.&lt;/p&gt;

&lt;p&gt;Here’s how a &lt;strong&gt;Nagios service definition&lt;/strong&gt; might look:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;define service {
    use                   local-service
    host_name             web-server-1
    service_description   HTTP
    check_command         check_http!-H 44.233.51.131 -p 80
    check_interval        1
    retry_interval        1
    notifications_enabled 1
    contact_groups        admins
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ What this does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every 1 minute, Nagios checks port 80 on &lt;code&gt;44.233.51.131&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If the service is &lt;strong&gt;down (CRITICAL)&lt;/strong&gt;, Nagios immediately alerts the &lt;code&gt;admins&lt;/code&gt; group.&lt;/li&gt;
&lt;li&gt;Once it’s &lt;strong&gt;back online (RECOVERY)&lt;/strong&gt;, Nagios sends another notification.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This ensures your team knows &lt;strong&gt;the moment downtime happens&lt;/strong&gt;, minimizing business impact.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔧 Extend with Custom Plugins
&lt;/h2&gt;

&lt;p&gt;Nagios comes with many plugins (check_disk, check_ping, check_http, etc.), but you can also write your own in &lt;strong&gt;Python, PHP, or Shell scripts&lt;/strong&gt;. For example, you could monitor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application log files for errors&lt;/li&gt;
&lt;li&gt;Database query response times&lt;/li&gt;
&lt;li&gt;API health endpoints&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎯 Why Nagios?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scalable&lt;/strong&gt; → Monitors 10,000+ hosts easily&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible&lt;/strong&gt; → Active &amp;amp; passive checks, NRPE, SNMP, and custom plugins&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliable&lt;/strong&gt; → Fast alerting system with escalation policies (e.g., L1 alert to on-call admin, L2 alert to ops team)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensible&lt;/strong&gt; → Works with other tools like Grafana, Prometheus, or ELK for visualization&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📂 Key Configuration Files in &lt;code&gt;/etc/nagios&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Nagios stores most of its configuration in the &lt;code&gt;etc&lt;/code&gt; directory. Some of the most important files include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;.htpasswd&lt;/code&gt;&lt;/strong&gt; → Secures the web interface by storing GUI login passwords.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;cgi.cfg&lt;/code&gt;&lt;/strong&gt; → Manages the web interface settings, including login permissions and who can access what.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;resource.cfg&lt;/code&gt;&lt;/strong&gt; → Stores sensitive information such as credentials and common paths, keeping them out of command definitions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;objects/&lt;/code&gt;&lt;/strong&gt; → Contains definitions for what Nagios monitors, including &lt;strong&gt;hosts, services, contacts, and commands&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔹 Important Nagios Config Files
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&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;strong&gt;nagios.cfg&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Main configuration file. Defines global settings, intervals for host/service checks, and points to other object configuration files.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;resource.cfg&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Secure storage for sensitive data like usernames, passwords, and directory paths.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;contacts.cfg&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Defines who gets notifications when hosts or services go down. Includes contacts (users) and contact groups. Typically contains a default contact like &lt;code&gt;Nagios admin&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;command.cfg&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lists the commands Nagios uses for service checks, notifications, and event handlers. You can also add custom commands here.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;templates.cfg&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Contains object templates (blueprints) for hosts, services, and contacts. Real objects can inherit defaults from these templates.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;timeperiods.cfg&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Defines reusable schedules for monitoring and notifications (e.g., &lt;code&gt;24x7&lt;/code&gt;, &lt;code&gt;workhours&lt;/code&gt;). Can be referenced by hosts, services, and contacts.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ⚙️ How Nagios Works
&lt;/h2&gt;

&lt;p&gt;Nagios monitors two main object types:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hosts&lt;/strong&gt; → Any entity on your network: servers, printers, switches, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Services&lt;/strong&gt; → Checks performed on hosts, like CPU load, disk space, web server status, or network connectivity.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nagios uses &lt;strong&gt;commands&lt;/strong&gt; to perform checks, send notifications, and handle events. You can also write custom plugins in &lt;strong&gt;Python, PHP, or Shell scripts&lt;/strong&gt; and add them to &lt;code&gt;libexec&lt;/code&gt;, then reference them in &lt;code&gt;command.cfg&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 Common Nagios Commands
&lt;/h2&gt;

&lt;p&gt;Here are some of the most widely used Nagios plugins:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;check_http&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Checks Apache/Nginx/web server status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;check_ping&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Monitors network connectivity (latency, packet loss)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;check_ssh&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Checks if SSH service is running&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;check_disk&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Checks disk usage on partitions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;check_load&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Monitors CPU load average&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;check_users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Counts logged-in users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;check_procs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Monitors number of processes or specific process status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;check_swap&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Checks swap memory usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;check_snmp&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Monitors SNMP-enabled devices like printers, switches, routers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;check_tcp&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Checks TCP port availability (e.g., DB, mail, custom services)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;check_dns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Checks DNS resolution status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;check_smtp&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Monitors mail server (SMTP) status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;check_mysql&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Checks MySQL/MariaDB availability (if installed)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  🔹 Example: Monitoring a Web Server
&lt;/h3&gt;

&lt;p&gt;Here’s a simple service definition to monitor an HTTP server at IP &lt;code&gt;44.233.51.131&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;define service {
    use                   local-service
    host_name             web-server-1
    service_description   HTTP
    check_command         check_http!-H 44.233.51.131 -p 80
    check_interval        1
    retry_interval        1
    notifications_enabled 1
    contact_groups        admins
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Every 1 minute&lt;/strong&gt;, Nagios checks port 80 on the server.&lt;/li&gt;
&lt;li&gt;Alerts are sent to the &lt;code&gt;admins&lt;/code&gt; group if the service goes &lt;strong&gt;CRITICAL&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Recovery notifications are sent once the server is back online.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🔹 Step-by-Step Guide: Monitoring a Remote Host with NRPE in Nagios
&lt;/h1&gt;

&lt;p&gt;Nagios Core can monitor remote Linux hosts using &lt;strong&gt;NRPE (Nagios Remote Plugin Executor)&lt;/strong&gt;. This allows your &lt;strong&gt;Nagios master server&lt;/strong&gt; to execute checks on a &lt;strong&gt;remote slave host&lt;/strong&gt;. Let’s go through the process step by step.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 1: Configure NRPE on the Slave Host&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The NRPE daemon runs on the remote host you want to monitor. Its configuration file location depends on your installation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Common paths: &lt;code&gt;/etc/nagios/nrpe.cfg&lt;/code&gt; or &lt;code&gt;/usr/local/nagios/etc/nrpe.cfg&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open the file with your editor (I’ll use &lt;code&gt;nano&lt;/code&gt; here):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /usr/local/nagios/etc/nrpe.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Locate the &lt;code&gt;allowed_hosts&lt;/code&gt; directive and add your &lt;strong&gt;Nagios master IP&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;allowed_hosts=127.0.0.1,192.168.1.10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Replace &lt;code&gt;192.168.1.10&lt;/code&gt; with your Nagios master server IP.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Save the file and &lt;strong&gt;restart the NRPE service&lt;/strong&gt; to apply changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nrpe
&lt;span class="c"&gt;# or, depending on your OS:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;service nrpe restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;Step 2: Verify Connection from the Master&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;On your Nagios master server, test if it can communicate with the slave host:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/usr/local/nagios/libexec/check_nrpe &lt;span class="nt"&gt;-H&lt;/span&gt; &amp;lt;Slave_IP_Address&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;Slave_IP_Address&amp;gt;&lt;/code&gt; with the actual IP of your remote host.&lt;/li&gt;
&lt;li&gt;If configured correctly, NRPE should respond with its version number or a test message.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 3: Define the Slave Host in Nagios&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Create a configuration file for the slave host, e.g., &lt;code&gt;/usr/local/nagios/etc/objects/slave.cfg&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;define host{
    use                     linux-server
    host_name               Slave-Server-01
    alias                   My Remote Linux Host
    address                 &amp;lt;Slave_IP_Address&amp;gt;
    max_check_attempts      5
    check_period            24x7
    notification_interval   30
    notification_period     24x7
    contact_groups          admins
    register                1
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;linux-server&lt;/code&gt; is a host template defined in &lt;code&gt;templates.cfg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;register 1&lt;/code&gt; → This is a real host definition&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;Slave_IP_Address&amp;gt;&lt;/code&gt; with the remote host IP&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 4: Define Services (The Actual Checks)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;You can define services in the same file (&lt;code&gt;slave.cfg&lt;/code&gt;) or a separate &lt;code&gt;services.cfg&lt;/code&gt;. Here are some common checks using &lt;code&gt;check_nrpe&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Check CPU Load
define service{
    use                     generic-service
    host_name               Slave-Server-01
    service_description     CPU Load
    check_command           check_nrpe!check_load
}

# Check Current Users
define service{
    use                     generic-service
    host_name               Slave-Server-01
    service_description     Current Users
    check_command           check_nrpe!check_users
}

# Check Root Disk Space
define service{
    use                     generic-service
    host_name               Slave-Server-01
    service_description     Root Disk Space
    check_command           check_nrpe!check_disk
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;check_command = check_nrpe!check_load&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;check_nrpe&lt;/code&gt;&lt;/strong&gt; → Nagios command defined on the master&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;!check_load&lt;/code&gt;&lt;/strong&gt; → Argument passed to NRPE, which corresponds to the remote command defined in the slave’s &lt;code&gt;nrpe.cfg&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 5: Include the New Host Config and Restart Nagios&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Ensure your main Nagios configuration (&lt;code&gt;nagios.cfg&lt;/code&gt;) includes your new host configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cfg_file=/usr/local/nagios/etc/objects/slave.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, &lt;strong&gt;restart Nagios&lt;/strong&gt; to apply the changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nagios
&lt;span class="c"&gt;# or&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;service nagios restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;✅ That's it!&lt;br&gt;
Your Nagios master can now monitor the remote slave host via NRPE. You can repeat this process for additional hosts and customize the services to monitor CPU, memory, disk, users, or any custom script.&lt;/p&gt;


&lt;h1&gt;
  
  
  🔹 How to Configure Email Notifications in Nagios Core
&lt;/h1&gt;

&lt;p&gt;Nagios Core can alert administrators via email whenever a host or service goes down, recovers, or reaches a threshold. Setting up email notifications requires configuring &lt;strong&gt;contacts, contact groups, and ensuring the Nagios server can send emails&lt;/strong&gt;. Here’s a step-by-step guide.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;Step 1: Ensure the Nagios Server Can Send Mail&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Nagios itself does not send emails directly. It relies on a &lt;strong&gt;Mail Transfer Agent (MTA)&lt;/strong&gt; like &lt;code&gt;mail&lt;/code&gt;, &lt;code&gt;sendmail&lt;/code&gt;, &lt;code&gt;Postfix&lt;/code&gt;, or &lt;code&gt;Postmail&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Install and configure your preferred MTA&lt;/strong&gt;. I prefer using &lt;strong&gt;Postfix&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test email sending&lt;/strong&gt; from the command line:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Test email from Nagios"&lt;/span&gt; | mail &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"Nagios Test"&lt;/span&gt; user@example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If the email arrives successfully, your Nagios server can send notifications.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;strong&gt;Step 2: Define the Contact in &lt;code&gt;contacts.cfg&lt;/code&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Open the contacts configuration file (usually &lt;code&gt;/usr/local/nagios/etc/objects/contacts.cfg&lt;/code&gt;) and define a new contact:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;define contact {
    contact_name                shanmugananthan
    use                         generic-contact
    alias                       Shan
    email                       shan@example.com
    service_notification_period 24x7
    host_notification_period    24x7
    service_notification_options w,u,c,r,f,s
    host_notification_options   d,u,r,f,s
    service_notification_commands notify-service-by-email
    host_notification_commands  notify-host-by-email
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;service_notification_options w,u,c,r,f,s&lt;/code&gt; → Notifications for Warning, Unknown, Critical, Recovery, Flapping, Scheduled Downtime&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;host_notification_options d,u,r,f,s&lt;/code&gt; → Notifications for Down, Unreachable, Recovery, Flapping, Scheduled Downtime&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;notify-service-by-email&lt;/code&gt; / &lt;code&gt;notify-host-by-email&lt;/code&gt; → Commands that send email notifications&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 3: Define or Update the Contact Group&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;If you use contact groups, make sure your new contact is included:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;define contactgroup{
    contactgroup_name admins
    alias             Nagios Administrators
    members           nagiosadmin,shanmugananthan
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;You can assign &lt;strong&gt;multiple contacts&lt;/strong&gt; to a group for centralized notifications.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 4: Apply the Contact / Contact Group to Hosts or Services&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When defining hosts or services, reference the contact or contact group so they receive alerts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example Host Definition:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;define host {
    use                     linux-server
    host_name               web-server-01
    alias                   Web Server
    address                 192.168.1.10
    contact_groups          admins
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example Service Definition:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;define service {
    use                     generic-service
    host_name               web-server-01
    service_description     HTTP
    check_command           check_http
    contacts                shanmugananthan
    contact_groups          admins
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;contacts&lt;/code&gt; → individual notifications&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;contact_groups&lt;/code&gt; → group notifications&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Step 5: Verify and Restart Nagios&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check the Nagios configuration&lt;/strong&gt; for errors:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/usr/local/nagios/bin/nagios &lt;span class="nt"&gt;-v&lt;/span&gt; /usr/local/nagios/etc/nagios.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Restart Nagios&lt;/strong&gt; to apply changes:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nagios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;If the verification shows no errors, your email notifications are now active.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;✅ &lt;strong&gt;Tips:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a &lt;strong&gt;generic-contact template&lt;/strong&gt; to avoid repeating notification options.&lt;/li&gt;
&lt;li&gt;Test notifications by manually stopping a service or host to ensure emails are sent correctly.&lt;/li&gt;
&lt;li&gt;Consider integrating &lt;strong&gt;Slack, Telegram, or SMS&lt;/strong&gt; notifications for faster alerts.&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>nagio</category>
      <category>monitoring</category>
      <category>devops</category>
    </item>
    <item>
      <title>Docker – Complete Learning Guide 🐳</title>
      <dc:creator>Shanmugananthan A K</dc:creator>
      <pubDate>Tue, 16 Sep 2025 11:34:19 +0000</pubDate>
      <link>https://dev.to/iamshanmugananthan/docker-complete-learning-guide-1no7</link>
      <guid>https://dev.to/iamshanmugananthan/docker-complete-learning-guide-1no7</guid>
      <description>&lt;h1&gt;
  
  
  🚀 Docker Explained Simply (With Real-Life Examples)
&lt;/h1&gt;

&lt;p&gt;If you’ve ever faced the dreaded &lt;em&gt;“It works on my machine but not on yours”&lt;/em&gt; problem — Docker is the hero you need.&lt;br&gt;
It allows developers to &lt;strong&gt;package applications into isolated environments&lt;/strong&gt; called &lt;strong&gt;containers&lt;/strong&gt;, ensuring they run the same everywhere.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Think of it like this:&lt;/strong&gt;&lt;br&gt;
You built a school project website that runs fine on your laptop. But when you copy it to your friend’s system, it crashes because they have a different PHP version. With Docker, you can package your code, PHP, and dependencies into a single container. Now it works &lt;em&gt;everywhere&lt;/em&gt; 🚀.&lt;/p&gt;


&lt;h2&gt;
  
  
  ⚙️ Docker Architecture
&lt;/h2&gt;

&lt;p&gt;Docker has &lt;strong&gt;two main parts&lt;/strong&gt;:&lt;/p&gt;
&lt;h3&gt;
  
  
  🖥️ 1. Docker Client
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The tool we use to interact with Docker.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Runs commands like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docker run&lt;/code&gt; → Start a container&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker pull&lt;/code&gt; → Download an image&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can even talk to a remote Docker Daemon over a network.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ⚡ 2. Docker Daemon
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;engine&lt;/strong&gt; of Docker running in the background.&lt;/li&gt;
&lt;li&gt;Responsible for building, running, and managing containers, images, networks, and volumes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🔗 Communication
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Client ↔ Daemon communicate via:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST API&lt;/li&gt;
&lt;li&gt;Unix socket&lt;/li&gt;
&lt;li&gt;Network interface&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;Analogy:&lt;/strong&gt; You (client) say &lt;em&gt;“Make tea!”&lt;/em&gt; ☕ and the kitchen (daemon) makes it.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧩 Docker Components
&lt;/h2&gt;
&lt;h3&gt;
  
  
  📦 1. Docker Images
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read-only templates&lt;/strong&gt; used to create containers.&lt;/li&gt;
&lt;li&gt;Built in &lt;strong&gt;layers&lt;/strong&gt;, so if one layer changes, only that part rebuilds.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Base: &lt;code&gt;ubuntu&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Add Python → new layer&lt;/li&gt;
&lt;li&gt;Add Flask → another layer
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker pull ubuntu
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🏃 2. Docker Containers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;running instance&lt;/strong&gt; of an image.&lt;/li&gt;
&lt;li&gt;You can start, stop, delete, or move them.&lt;/li&gt;
&lt;li&gt;Each has its own &lt;strong&gt;read-write layer&lt;/strong&gt; and connects to storage + networks.&lt;/li&gt;
&lt;li&gt;Ephemeral by default (data gone when removed) — unless a &lt;strong&gt;volume&lt;/strong&gt; is attached.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌 &lt;strong&gt;Flow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pull image → 2. Create container → 3. Add read-write layer → 4. Connect to virtual network → 5. Get unique container IP → 6. Interact via terminal.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker container create &lt;span class="nt"&gt;--name&lt;/span&gt; shan ubuntu /bin/bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔥 3. Docker Engine
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;core runtime&lt;/strong&gt; that builds and runs containers locally.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ☁️ 4. Docker Hub
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Cloud-based repo where you &lt;strong&gt;store and share images&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  📝 5. Dockerfile
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A script with step-by-step instructions to build an image.&lt;/li&gt;
&lt;li&gt;Executed &lt;strong&gt;top to bottom&lt;/strong&gt; by Docker Daemon.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📌 Workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dockerfile → docker build → Docker Image → docker run → Container
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; ubuntu&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nginx
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["nginx", "-g", "daemon off;"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📦 Docker Registry
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A service that &lt;strong&gt;stores Docker images&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Hub&lt;/strong&gt; is the most popular public registry.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔧 Common Docker Commands
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 Image Commands
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docker image ls&lt;/code&gt; → List images&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker pull &amp;lt;image&amp;gt;&lt;/code&gt; → Download image&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker rmi &amp;lt;image&amp;gt;&lt;/code&gt; → Remove image&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker history &amp;lt;image&amp;gt;&lt;/code&gt; → View layers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔹 Container Commands
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docker run &amp;lt;image&amp;gt;&lt;/code&gt; → Run container&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker ps -a&lt;/code&gt; → List containers&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker exec -it &amp;lt;id&amp;gt; /bin/bash&lt;/code&gt; → Open terminal inside container&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker logs &amp;lt;id&amp;gt;&lt;/code&gt; → View logs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Example: Run Nginx on port 80&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  🥊 Docker vs Virtual Machine
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Docker (Container)&lt;/th&gt;
&lt;th&gt;Virtual Machine (VM)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Startup Time&lt;/td&gt;
&lt;td&gt;Seconds ⚡&lt;/td&gt;
&lt;td&gt;Minutes 🕒&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resource Usage&lt;/td&gt;
&lt;td&gt;Lightweight 🪶&lt;/td&gt;
&lt;td&gt;Heavy 💻&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS Requirement&lt;/td&gt;
&lt;td&gt;Shares Host OS&lt;/td&gt;
&lt;td&gt;Needs Full OS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;Faster 🚀&lt;/td&gt;
&lt;td&gt;Slower 🐢&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Isolation&lt;/td&gt;
&lt;td&gt;Process-level&lt;/td&gt;
&lt;td&gt;Hardware-level&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;ul&gt;
&lt;li&gt;Want to run &lt;strong&gt;10 microservices&lt;/strong&gt;? Use &lt;strong&gt;containers&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Want to run &lt;strong&gt;Windows on Linux&lt;/strong&gt;? Use a &lt;strong&gt;VM&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Docker has become a must-have skill for developers and DevOps engineers.&lt;br&gt;
It’s lightweight, fast, and makes your apps portable across environments.&lt;/p&gt;

&lt;p&gt;✨ Next time you hear &lt;em&gt;“but it worked on my laptop…”&lt;/em&gt;, just smile and say:&lt;br&gt;
👉 “Let’s put it in Docker.” 🐳&lt;/p&gt;


&lt;h1&gt;
  
  
  🗄️ Docker Storage &amp;amp; Networking (with Real-World Examples)
&lt;/h1&gt;

&lt;p&gt;Containers are &lt;strong&gt;temporary&lt;/strong&gt; by nature → once they’re removed, their data is gone ❌.&lt;br&gt;
That’s where &lt;strong&gt;Docker Storage&lt;/strong&gt; comes in to keep your data safe.&lt;/p&gt;


&lt;h2&gt;
  
  
  📂 Docker Storage – Volumes
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;volume&lt;/strong&gt; is storage that lives &lt;strong&gt;outside of containers&lt;/strong&gt;, so your data survives even if the container is deleted.&lt;/p&gt;
&lt;h3&gt;
  
  
  🔹 Types of Storage
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Bind Mount&lt;/strong&gt; → Maps a host path to a container path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Volume&lt;/strong&gt; → Managed by Docker, stored under &lt;code&gt;/var/lib/docker/volumes&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tmpfs&lt;/strong&gt; → Stores data in RAM (super fast, but temporary).&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  🔹 Volume Commands
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume &lt;span class="nb"&gt;ls&lt;/span&gt;          &lt;span class="c"&gt;# List volumes&lt;/span&gt;
docker volume create ak   &lt;span class="c"&gt;# Create a volume&lt;/span&gt;
docker volume inspect ak  &lt;span class="c"&gt;# Inspect volume&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;👉 Example: Mount a volume inside a container&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; ubuntu &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--mount&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ak,destination&lt;span class="o"&gt;=&lt;/span&gt;/var/app/data ubuntu /bin/bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔹 Volume Drivers
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;local&lt;/code&gt; → Store files on host machine&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;NFS&lt;/code&gt; → Remote storage&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;type=tmpfs&lt;/code&gt; → Store in RAM&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;type=none&lt;/code&gt; → Bind mount&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Example: Create tmpfs volume&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume create &lt;span class="nt"&gt;--driver&lt;/span&gt; &lt;span class="nb"&gt;local&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tmpfs &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;device&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tmpfs myvol
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🌐 Docker Networking
&lt;/h2&gt;

&lt;p&gt;Containers need networking to &lt;strong&gt;talk to each other&lt;/strong&gt; or the &lt;strong&gt;outside world&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 Types of Networks
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;None&lt;/strong&gt; → No network assigned.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Host&lt;/strong&gt; → Shares host machine’s IP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bridge&lt;/strong&gt; (default) → Creates a private network with unique container IPs.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  🔹 Network Commands
&lt;/h3&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="c"&gt;# List networks&lt;/span&gt;
docker network create mynet      &lt;span class="c"&gt;# Create new network&lt;/span&gt;
docker network inspect mynet     &lt;span class="c"&gt;# Inspect network&lt;/span&gt;
docker network prune             &lt;span class="c"&gt;# Delete unused networks&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Example: Create a custom bridge network&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="nt"&gt;--driver&lt;/span&gt; bridge &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--subnet&lt;/span&gt; 192.168.50.1/24 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--ip-range&lt;/span&gt; 192.168.50.128/25 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--gateway&lt;/span&gt; 192.168.50.1 mynet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Assign manual IP to a container&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--network&lt;/span&gt; mynet &lt;span class="nt"&gt;--ip&lt;/span&gt; 192.168.50.50 httpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  📖 Dockerfile – The Recipe of Docker
&lt;/h1&gt;

&lt;p&gt;A &lt;strong&gt;Dockerfile&lt;/strong&gt; is like a &lt;strong&gt;recipe card&lt;/strong&gt; 🍰.&lt;br&gt;
Each line is an &lt;strong&gt;instruction&lt;/strong&gt;, read &lt;strong&gt;top to bottom&lt;/strong&gt;, that builds your image step by step.&lt;/p&gt;

&lt;p&gt;👉 Fun fact: Dockerfile is &lt;strong&gt;case-sensitive&lt;/strong&gt; → &lt;code&gt;FROM&lt;/code&gt; ✅ but &lt;code&gt;from&lt;/code&gt; ❌.&lt;/p&gt;

&lt;p&gt;✅ Example analogy: Baking a cake 🧁&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recipe: &lt;em&gt;Take flour, add sugar, bake&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Dockerfile: &lt;em&gt;FROM Ubuntu, RUN apt-get update, COPY code, CMD run app&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🛠️ Dockerfile Instructions (with Examples)
&lt;/h2&gt;
&lt;h3&gt;
  
  
  📌 Essential Instructions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FROM&lt;/strong&gt; → Base image
&lt;/li&gt;
&lt;/ul&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; ubuntu:latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LABEL&lt;/strong&gt; → Add metadata
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;LABEL&lt;/span&gt;&lt;span class="s"&gt; version="1.0"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ENV&lt;/strong&gt; → Environment variable
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; owner="shan"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VOLUME&lt;/strong&gt; → Persistent storage
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;VOLUME&lt;/span&gt;&lt;span class="s"&gt; ["/data"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WORKDIR&lt;/strong&gt; → Set working directory
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /lak&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;COPY&lt;/strong&gt; → Copy files from host → image
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; AStc /lak&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ADD&lt;/strong&gt; → Like COPY, but can unzip/download
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;ADD&lt;/span&gt;&lt;span class="s"&gt; dumptar /lak&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RUN&lt;/strong&gt; → Run commands while building
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;RUN &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; useradd &lt;span class="nt"&gt;-ms&lt;/span&gt; /bin/bash shan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;USER&lt;/strong&gt; → Change user
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; shan&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;EXPOSE&lt;/strong&gt; → Open port
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CMD&lt;/strong&gt; → Default command (only one allowed)
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["ping", "8.8.8.8"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ENTRYPOINT&lt;/strong&gt; → Make container behave like an executable
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["ping"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎭 Foreground vs Background in Containers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Foreground process&lt;/strong&gt; = Main task (must keep running).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Background process&lt;/strong&gt; = Helper tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 If no &lt;strong&gt;foreground process&lt;/strong&gt; exists, the container &lt;strong&gt;stops immediately&lt;/strong&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Apache server running = foreground&lt;/li&gt;
&lt;li&gt;Logging system = background&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🏷️ Docker Tags
&lt;/h2&gt;

&lt;p&gt;Tags = version labels for images.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker tag &amp;lt;container_id&amp;gt; username/app:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Like: &lt;code&gt;Essay_v1.docx&lt;/code&gt;, &lt;code&gt;Essay_v2.docx&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Fact: If no tag → Docker uses &lt;code&gt;latest&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  📤 Building &amp;amp; Pushing Docker Images
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 Build Image
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; username/app:1.0 &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔹 Push to Docker Hub
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker push username/app:1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Just like saving your project locally (build) and then uploading it to Google Drive (push).&lt;/p&gt;




&lt;h1&gt;
  
  
  ✅ Quick Recap
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Volumes&lt;/strong&gt; keep your data safe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Networking&lt;/strong&gt; connects your containers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dockerfile&lt;/strong&gt; = Recipe card 📝&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instructions&lt;/strong&gt; like FROM, RUN, COPY, CMD, ENTRYPOINT are must-know.&lt;/li&gt;
&lt;li&gt;Containers need a &lt;strong&gt;foreground process&lt;/strong&gt; to stay alive.&lt;/li&gt;
&lt;li&gt;Tags = versions, and pushing = sharing your app with the world 🌍.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🐳 Docker Swarm – Container Orchestration Made Simple
&lt;/h1&gt;

&lt;p&gt;Running a single container is easy. Running &lt;strong&gt;hundreds across multiple servers&lt;/strong&gt;? That’s chaos… unless you use &lt;strong&gt;orchestration&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👉 Enter &lt;strong&gt;Docker Swarm&lt;/strong&gt;: Docker’s &lt;strong&gt;native orchestration tool&lt;/strong&gt; that makes managing containers across multiple hosts simple, scalable, and reliable.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ 1. What is Docker Swarm?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Definition:&lt;/strong&gt; A clustering and orchestration tool built into Docker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Purpose:&lt;/strong&gt; Ensures &lt;strong&gt;high availability&lt;/strong&gt;, &lt;strong&gt;load balancing&lt;/strong&gt;, and &lt;strong&gt;scaling&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why:&lt;/strong&gt; Real-world apps need many containers across many servers → orchestration makes this manageable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Fun fact:&lt;/strong&gt; Kubernetes is the industry leader, but Docker Swarm is &lt;strong&gt;simpler to set up&lt;/strong&gt; and works out of the box with Docker.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Analogy:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One pizza shop = One Docker host 🍕&lt;/li&gt;
&lt;li&gt;Many shops across the city = Swarm cluster 🏙️&lt;/li&gt;
&lt;li&gt;Manager decides which shop handles orders = Swarm Manager assigns containers to nodes.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧩 2. Key Concepts in Docker Swarm
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Swarm Mode&lt;/strong&gt; → Special mode that enables clustering.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swarm Manager&lt;/strong&gt; → Brain of the cluster (handles scheduling, scaling, service mgmt).&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Swarm Nodes&lt;/strong&gt; → Machines in the cluster (Manager or Worker).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manager node = controls cluster&lt;/li&gt;
&lt;li&gt;Worker node = runs containers&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;👉 Only &lt;strong&gt;one leader manager&lt;/strong&gt; exists at a time (others are backups).&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 3. Setting Up a Swarm
&lt;/h2&gt;

&lt;h3&gt;
  
  
  On Manager Node
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker swarm init &lt;span class="nt"&gt;--advertise-addr&lt;/span&gt; &amp;lt;IP&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  On Worker Nodes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker swarm &lt;span class="nb"&gt;join&lt;/span&gt; &lt;span class="nt"&gt;--token&lt;/span&gt; &amp;lt;token&amp;gt; &amp;lt;manager-ip&amp;gt;:2377
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify Nodes
&lt;/h3&gt;



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

&lt;/div&gt;






&lt;h2&gt;
  
  
  🛠️ 4. Services in Docker Swarm
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Service&lt;/strong&gt; is Swarm’s way of managing containers. Instead of “just run this container,” you say:&lt;br&gt;
👉 “Run 3 copies of this app across the cluster.” Swarm makes it happen ✅.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker service create &lt;span class="nt"&gt;--replicas&lt;/span&gt; 2 &lt;span class="nt"&gt;-p&lt;/span&gt; 80:80 &lt;span class="nt"&gt;--name&lt;/span&gt; myweb nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Runs &lt;strong&gt;2 replicas&lt;/strong&gt; of Nginx web server on port 80.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check services:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;






&lt;h2&gt;
  
  
  📦 5. Service Modes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Replicated Mode&lt;/strong&gt; → You choose how many replicas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global Mode&lt;/strong&gt; → Runs &lt;strong&gt;one container on every node&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ul&gt;
&lt;li&gt;Replicated → Run &lt;strong&gt;5 replicas&lt;/strong&gt; of Nginx across 3 nodes.&lt;/li&gt;
&lt;li&gt;Global → Run &lt;strong&gt;monitoring agents&lt;/strong&gt; (like Prometheus) everywhere.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📈 6. Scaling Services
&lt;/h2&gt;

&lt;p&gt;Scale up/down instantly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker service scale &lt;span class="nv"&gt;myweb&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5   &lt;span class="c"&gt;# scale up&lt;/span&gt;
docker service scale &lt;span class="nv"&gt;myweb&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2   &lt;span class="c"&gt;# scale down&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Swarm will redistribute replicas automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 7. Service Updates &amp;amp; Rollbacks
&lt;/h2&gt;

&lt;p&gt;Update app version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker service update &lt;span class="nt"&gt;--image&lt;/span&gt; nginx:1.25 myweb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rollback if things break:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;👉 Just like deploying &lt;strong&gt;v2.5&lt;/strong&gt;, and rolling back to &lt;strong&gt;v2.1&lt;/strong&gt; if users complain 🚨.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧑‍💻 8. Node Management
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Promote worker → manager
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Demote manager → worker
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Drain node (move workloads away)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker node update &lt;span class="nt"&gt;--availability&lt;/span&gt; drain worker2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Pause node (keep current workloads, stop new ones)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker node update &lt;span class="nt"&gt;--availability&lt;/span&gt; pause worker2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Drain&lt;/strong&gt; = closing a shop, orders shift to others.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pause&lt;/strong&gt; = shop still runs, but no new orders.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🌐 9. Networks in Swarm
&lt;/h2&gt;

&lt;p&gt;When Swarm starts, it creates an &lt;strong&gt;ingress overlay network&lt;/strong&gt; by default.&lt;br&gt;
This lets containers across &lt;strong&gt;different nodes&lt;/strong&gt; talk securely.&lt;/p&gt;

&lt;p&gt;👉 Example:&lt;br&gt;
Two replicas of a web app running on Node1 &amp;amp; Node2 → both accessible under the &lt;strong&gt;same service name&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  📝 10. Useful Commands Summary
&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 swarm init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Initialize swarm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker swarm leave&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Leave swarm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker node ls&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List nodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker node promote &amp;lt;node&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Promote worker → manager&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker node demote &amp;lt;node&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Demote manager → worker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker node rm &amp;lt;node&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remove node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker node update --availability drain &amp;lt;node&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Drain containers from node&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker service create ...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create new service&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker service ls&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;List services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker service ps &amp;lt;service&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show service tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker service scale &amp;lt;service&amp;gt;=&amp;lt;n&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scale replicas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker service update --image &amp;lt;image&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Update service image&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docker service rollback &amp;lt;service&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Rollback service&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h1&gt;
  
  
  ✅ Final Recap
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker Swarm = Cluster &amp;amp; orchestration tool&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manager nodes&lt;/strong&gt; control, &lt;strong&gt;workers&lt;/strong&gt; run containers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Services&lt;/strong&gt; = higher-level objects (can have replicas).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modes&lt;/strong&gt;: Replicated vs Global.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scaling&lt;/strong&gt; = instant with &lt;code&gt;docker service scale&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Updates &amp;amp; Rollbacks&lt;/strong&gt; = safe deployments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Node Management&lt;/strong&gt; = promote, demote, drain, pause.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Networking&lt;/strong&gt; = ingress overlay ensures secure communication.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;👉 With Docker Swarm, you can manage &lt;strong&gt;hundreds of containers like a pro&lt;/strong&gt; — no manual chaos, just smooth orchestration 🐳✨.&lt;/p&gt;


&lt;h1&gt;
  
  
  📖 &lt;strong&gt;Docker — CPU, Memory &amp;amp; Security&lt;/strong&gt;
&lt;/h1&gt;
&lt;h2&gt;
  
  
  1. Why Set CPU &amp;amp; Memory Limits?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Definition:&lt;/strong&gt;&lt;br&gt;
Docker allows you to &lt;strong&gt;reserve&lt;/strong&gt; and &lt;strong&gt;limit&lt;/strong&gt; CPU &amp;amp; memory per container.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reservation&lt;/strong&gt; = soft guarantee (minimum resources).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limit&lt;/strong&gt; = hard cap (maximum usage).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prevents one container from hogging all host resources.&lt;/li&gt;
&lt;li&gt;Ensures stable performance in multi-container environments.&lt;/li&gt;
&lt;li&gt;Protects against crashes if an app goes out of control.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Fact:&lt;/strong&gt; Without limits, a single buggy container can bring down the whole server.&lt;/p&gt;


&lt;h2&gt;
  
  
  2. Units &amp;amp; Key Facts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CPU units in Docker:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--cpus="0.5"&lt;/code&gt; → 50% of 1 CPU core.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--cpu-shares&lt;/code&gt; → relative weight (default = 1024).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--cpu-period&lt;/code&gt; &amp;amp; &lt;code&gt;--cpu-quota&lt;/code&gt; → fine-grained control.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CPU units in Kubernetes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;100m&lt;/code&gt; = 0.1 CPU (10% of 1 core).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1000m&lt;/code&gt; = 1 CPU.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Memory units:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;256m&lt;/code&gt; = 256 MB&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1g&lt;/code&gt; = 1 GB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Rule of thumb:&lt;/strong&gt; Don’t allocate 100% of host resources. Keep ~20–30% for the OS.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. Examples of CPU &amp;amp; Memory Settings
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Memory Reservation + Limit
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; web1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--memory-reservation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;256m &lt;span class="nt"&gt;--memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;512m httpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;256 MB reserved (soft).&lt;/li&gt;
&lt;li&gt;512 MB hard cap — container killed if exceeded.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  CPU Limit (Simple)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; web2 &lt;span class="nt"&gt;--cpus&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"0.5"&lt;/span&gt; httpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;👉 Max 50% of one CPU core.&lt;/p&gt;


&lt;h3&gt;
  
  
  CPU Shares (Relative Priority)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--cpu-shares&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;512 &lt;span class="nt"&gt;--name&lt;/span&gt; web3 httpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;👉 Gets 50% weight compared to default 1024.&lt;/p&gt;


&lt;h3&gt;
  
  
  CPU Quota/Period (Advanced)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--cpu-period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100000 &lt;span class="nt"&gt;--cpu-quota&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;50000 httpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;👉 50% of CPU (50,000 ÷ 100,000).&lt;/p&gt;


&lt;h3&gt;
  
  
  Memory + Swap Control
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;512m &lt;span class="nt"&gt;--memory-swap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;512m httpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;👉 No swap allowed (only 512 MB RAM).&lt;/p&gt;


&lt;h2&gt;
  
  
  4. Practical Planning (Worked Example)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Host:&lt;/strong&gt; 4 CPUs, 8 GB RAM.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reserve ~30% for OS → usable = 2.8 CPUs, 5.6 GB RAM.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For 4 containers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--cpus=0.5&lt;/code&gt; each → 2 CPUs total.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--memory=1g&lt;/code&gt; each → 4 GB total.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leaves headroom for spikes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Use &lt;code&gt;docker stats&lt;/code&gt; to monitor and adjust.&lt;/p&gt;


&lt;h2&gt;
  
  
  5. Observability Commands
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docker stats&lt;/code&gt; → Live CPU, memory, I/O per container.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker inspect &amp;lt;container&amp;gt;&lt;/code&gt; → Shows configured limits.&lt;/li&gt;
&lt;li&gt;Host tools: &lt;code&gt;top&lt;/code&gt;, &lt;code&gt;htop&lt;/code&gt;, &lt;code&gt;free -m&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  6. Security Considerations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Why important:&lt;/strong&gt; Even with limits, a compromised container could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Attack other containers.&lt;/li&gt;
&lt;li&gt;Escalate to host system.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Best practices:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run as non-root (&lt;code&gt;--user&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Use minimal base images (e.g., &lt;code&gt;alpine&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Apply AppArmor/SELinux profiles.&lt;/li&gt;
&lt;li&gt;Keep images updated &amp;amp; signed.&lt;/li&gt;
&lt;li&gt;Restrict network/volume access.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Example:&lt;/strong&gt; Running Nginx as non-root prevents attackers from gaining full system privileges if the container is hacked.&lt;/p&gt;


&lt;h2&gt;
  
  
  ✅ Final Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CPU &amp;amp; Memory limits&lt;/strong&gt; protect host stability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reservation vs Limit&lt;/strong&gt; = soft guarantee vs hard cap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker units:&lt;/strong&gt; &lt;code&gt;--cpus&lt;/code&gt;, &lt;code&gt;--memory&lt;/code&gt;, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes units:&lt;/strong&gt; &lt;code&gt;m&lt;/code&gt; (millicores) for CPU.&lt;/li&gt;
&lt;li&gt;Always &lt;strong&gt;leave buffer&lt;/strong&gt; for the OS.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;security hardening&lt;/strong&gt; (non-root, minimal images, profiles).&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  📖 &lt;strong&gt;Docker Security – Best Practices&lt;/strong&gt;
&lt;/h1&gt;
&lt;h2&gt;
  
  
  1. Definition
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker security&lt;/strong&gt; = practices that reduce attack surface and protect containers, hosts, and data.&lt;/li&gt;
&lt;li&gt;Covers &lt;strong&gt;image hygiene, runtime restrictions, network control, and host hardening&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  2. Key Security Practices (with Examples)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Use lightweight base images&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Smaller = fewer packages = fewer vulnerabilities.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight docker"&gt;&lt;code&gt; FROM alpine:3.18
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Run as non-root user&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;   RUN adduser -D appuser
   USER appuser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Keep images updated&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Regularly rebuild and pull patched versions.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Use multi-stage builds&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Builder stage has compilers/tools.&lt;/li&gt;
&lt;li&gt;Final stage contains only the app binary → smaller &amp;amp; safer.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Drop privileges at runtime&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&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;--security-opt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no-new-privileges &lt;span class="nt"&gt;--cap-drop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ALL ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Limit CPU &amp;amp; memory (DoS protection)&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&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;--memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;512m &lt;span class="nt"&gt;--cpus&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"0.5"&lt;/span&gt; nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Use Docker Secrets (Swarm mode)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Store DB passwords, API keys securely (not in &lt;code&gt;env&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Network hygiene&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Expose only needed ports.&lt;/li&gt;
&lt;li&gt;Use user-defined networks for isolation.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Host hardening&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Enable SELinux/AppArmor.&lt;/li&gt;
&lt;li&gt;Keep Docker &amp;amp; kernel patched.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Scan &amp;amp; rebuild images regularly&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Tools: &lt;code&gt;trivy&lt;/code&gt;, &lt;code&gt;clair&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Keep containers minimal&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;One process per container.&lt;/li&gt;
&lt;li&gt;Avoid running SSHd inside.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Practical Secure Run Example
&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; safe-app &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;512m &lt;span class="nt"&gt;--cpus&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"0.5"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--security-opt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;no-new-privileges &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cap-drop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ALL &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--read-only&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tmpfs&lt;/span&gt; /tmp:rw,size&lt;span class="o"&gt;=&lt;/span&gt;64m &lt;span class="se"&gt;\&lt;/span&gt;
  myuser/app:1.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Non-root, read-only FS, no extra capabilities, tmpfs for writes.&lt;/p&gt;




&lt;h1&gt;
  
  
  📖 &lt;strong&gt;Docker Command Reference&lt;/strong&gt;
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🔹 1. System &amp;amp; Info
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nt"&gt;--version&lt;/span&gt;        &lt;span class="c"&gt;# Show version&lt;/span&gt;
docker info             &lt;span class="c"&gt;# Host + engine info&lt;/span&gt;
docker ps               &lt;span class="c"&gt;# List running containers&lt;/span&gt;
docker ps &lt;span class="nt"&gt;-a&lt;/span&gt;            &lt;span class="c"&gt;# List all containers&lt;/span&gt;
docker inspect &amp;lt;ctr&amp;gt;    &lt;span class="c"&gt;# Detailed info&lt;/span&gt;
docker stats            &lt;span class="c"&gt;# Live CPU, memory usage&lt;/span&gt;
docker top &amp;lt;ctr&amp;gt;        &lt;span class="c"&gt;# Show processes in container&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 2. Running &amp;amp; Managing Containers
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; mybox alpine /bin/sh    &lt;span class="c"&gt;# Interactive&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; web &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:80 httpd     &lt;span class="c"&gt;# Detached mode&lt;/span&gt;
docker create &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="nb"&gt;test &lt;/span&gt;httpd               &lt;span class="c"&gt;# Create only&lt;/span&gt;
docker start/stop/restart &amp;lt;ctr&amp;gt;               &lt;span class="c"&gt;# Manage lifecycle&lt;/span&gt;
docker pause/unpause &amp;lt;ctr&amp;gt;                    &lt;span class="c"&gt;# Freeze/unfreeze&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 3. Logs &amp;amp; Monitoring
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker logs &amp;lt;ctr&amp;gt;                &lt;span class="c"&gt;# Show logs&lt;/span&gt;
docker logs &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="nt"&gt;--tail&lt;/span&gt; 100 &amp;lt;ctr&amp;gt;  &lt;span class="c"&gt;# Follow logs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 4. Copy &amp;amp; Rename
&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;cp&lt;/span&gt; &amp;lt;ctr&amp;gt;:/path/in/ctr /path/on/host
docker rename old_name new_name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 5. Resource Controls
&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;--memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;512m httpd
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--cpus&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"1.5"&lt;/span&gt; &lt;span class="nt"&gt;--memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;512m httpd
docker update &lt;span class="nt"&gt;--cpus&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.5 &lt;span class="nt"&gt;--memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;512m &amp;lt;ctr&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 6. Remove Containers &amp;amp; Images
&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;rm&lt;/span&gt; &amp;lt;ctr&amp;gt;              &lt;span class="c"&gt;# Remove container&lt;/span&gt;
docker rmi &amp;lt;image&amp;gt;           &lt;span class="c"&gt;# Remove image&lt;/span&gt;
docker system prune &lt;span class="nt"&gt;-a&lt;/span&gt;       &lt;span class="c"&gt;# Remove unused&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 7. Import / Export
&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;export&lt;/span&gt; &amp;lt;ctr&amp;gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ctr.tar
docker import ctr.tar myimg:latest
docker save &lt;span class="nt"&gt;-o&lt;/span&gt; img.tar myimg
docker load &lt;span class="nt"&gt;-i&lt;/span&gt; img.tar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 8. Images
&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="c"&gt;# List&lt;/span&gt;
docker image &lt;span class="nb"&gt;history &lt;/span&gt;httpd           &lt;span class="c"&gt;# Layers&lt;/span&gt;
docker image inspect httpd           &lt;span class="c"&gt;# Metadata&lt;/span&gt;
docker pull httpd:latest             &lt;span class="c"&gt;# Download&lt;/span&gt;
docker tag httpd:latest myrepo/httpd &lt;span class="c"&gt;# Retag&lt;/span&gt;
docker push myrepo/httpd             &lt;span class="c"&gt;# Push&lt;/span&gt;
docker search nginx                  &lt;span class="c"&gt;# Search Hub&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 9. Volumes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume &lt;span class="nb"&gt;ls
&lt;/span&gt;docker volume create myvol
docker volume &lt;span class="nb"&gt;rm &lt;/span&gt;myvol
docker volume prune
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; myvol:/data httpd
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--mount&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;bind&lt;/span&gt;,source&lt;span class="o"&gt;=&lt;/span&gt;/host,target&lt;span class="o"&gt;=&lt;/span&gt;/ctr alpine
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--mount&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tmpfs,destination&lt;span class="o"&gt;=&lt;/span&gt;/app,tmpfs-size&lt;span class="o"&gt;=&lt;/span&gt;70m alpine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 10. Networks
&lt;/h2&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;docker network create mybridge
docker network create &lt;span class="nt"&gt;--driver&lt;/span&gt; overlay myoverlay   &lt;span class="c"&gt;# Swarm only&lt;/span&gt;
docker network connect mybridge &amp;lt;ctr&amp;gt;
docker network disconnect mybridge &amp;lt;ctr&amp;gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; web &lt;span class="nt"&gt;--network&lt;/span&gt; mybridge nginx
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--network&lt;/span&gt; none nginx   &lt;span class="c"&gt;# Isolated&lt;/span&gt;
docker network &lt;span class="nb"&gt;rm &lt;/span&gt;mybridge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






</description>
      <category>docker</category>
      <category>containers</category>
      <category>kubernetes</category>
      <category>devops</category>
    </item>
    <item>
      <title>📱✨ Host a Live Website from Your Android Phone Using Termux + Cloudflare Tunnel</title>
      <dc:creator>Shanmugananthan A K</dc:creator>
      <pubDate>Wed, 23 Jul 2025 05:09:15 +0000</pubDate>
      <link>https://dev.to/iamshanmugananthan/host-a-live-website-from-your-android-phone-using-termux-cloudflare-tunnel-do7</link>
      <guid>https://dev.to/iamshanmugananthan/host-a-live-website-from-your-android-phone-using-termux-cloudflare-tunnel-do7</guid>
      <description>&lt;h2&gt;
  
  
  A Step-by-Step Guide for Beginners (No Root Needed!)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;🌟 What You’ll Learn&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this tutorial, you’ll learn how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Turn your Android phone into a mini web server using Termux&lt;/li&gt;
&lt;li&gt;Serve a simple HTML website&lt;/li&gt;
&lt;li&gt;Make your site accessible publicly over the internet (with HTTPS!)&lt;/li&gt;
&lt;li&gt;Use Cloudflare Tunnel with your custom domain&lt;/li&gt;
&lt;li&gt;All of this — without root access, and just using your mobile device!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🧰 Requirements&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;📱 Android Phone  = Any modern device (no root required)&lt;br&gt;
📲 Termux App Install = from F-Droid (recommended)&lt;br&gt;
🌐 Internet Access    = WiFi or Mobile Data&lt;br&gt;
🔐 Cloudflare Account = Free plan is enough&lt;br&gt;
🌍 A Domain Name  = Optional, but recommended&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏗️ Step-by-Step Instructions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let’s walk through the entire setup with real commands. 🔧&lt;/p&gt;

&lt;p&gt;🟢 1. Install Termux &amp;amp; Update Packages&lt;br&gt;
&lt;code&gt;pkg update &amp;amp;&amp;amp; pkg upgrade&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This updates Termux and its tools to the latest versions.&lt;/p&gt;

&lt;p&gt;🌩️ 2. Install Cloudflared (Cloudflare Tunnel CLI)&lt;br&gt;
&lt;code&gt;pkg install cloudflared&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Cloudflared allows you to create a secure tunnel to your local web server.&lt;/p&gt;

&lt;p&gt;🗂️ 3. Create a Simple Website&lt;br&gt;
&lt;code&gt;mkdir ~/mysite&lt;br&gt;
cd ~/mysite&lt;br&gt;
echo '&amp;lt;h1&amp;gt;Welcome to Termux Site&amp;lt;/h1&amp;gt;' &amp;gt; index.html&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This creates a simple HTML page with a welcome message.&lt;/p&gt;

&lt;p&gt;🌐 4. Start a Local Web Server&lt;br&gt;
&lt;code&gt;cd ~/mysite&lt;br&gt;
python -m http.server 8000&lt;br&gt;
This starts a local server at http://localhost:8000.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;📍 You can test it by visiting &lt;a href="http://localhost:8000" rel="noopener noreferrer"&gt;http://localhost:8000&lt;/a&gt; in Termux’s browser or with curl.&lt;/p&gt;

&lt;p&gt;🌍 5. Make Your Site Public with Cloudflare Tunnel&lt;br&gt;
&lt;code&gt;cloudflared tunnel --url http://localhost:8000&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This will create a public link like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://some-random-string.trycloudflare.com" rel="noopener noreferrer"&gt;https://some-random-string.trycloudflare.com&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;✅ Now your site is live on the internet! Share the link!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💡 Optional: Keep Server &amp;amp; Tunnel Running in Background&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;nohup python -m http.server 8000 &amp;gt; python.log 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br&gt;
nohup cloudflared tunnel --url http://localhost:8000 &amp;gt; tunnel.log 2&amp;gt;&amp;amp;1 &amp;amp;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This keeps the server and tunnel running even if you close Termux.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🌐 Bonus: Use Your Own Domain with Cloudflare&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔐 6. Login to Cloudflare&lt;br&gt;
&lt;code&gt;cloudflared login&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This opens a URL to authenticate with Cloudflare. Open it in your phone browser and follow the instructions.&lt;/p&gt;

&lt;p&gt;🔧 7. Create a Named Tunnel&lt;br&gt;
&lt;code&gt;cloudflared tunnel create app.shanmugananthan&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This creates a persistent tunnel named app.shanmugananthan.&lt;/p&gt;

&lt;p&gt;🛠️ 8. Configure Tunnel&lt;br&gt;
&lt;code&gt;mkdir -p ~/.cloudflared&lt;br&gt;
nano ~/.cloudflared/config.yml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Paste the following into the file:&lt;br&gt;
`tunnel: app.shanmugananthan&lt;br&gt;
credentials-file: /data/data/com.termux/files/home/.cloudflared/app.shanmugananthan.json&lt;/p&gt;

&lt;p&gt;ingress:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hostname: app.shanmugananthan.com
service: &lt;a href="http://localhost:8000" rel="noopener noreferrer"&gt;http://localhost:8000&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;service: http_status:404`&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Press CTRL + O → Enter to save, and CTRL + X to exit.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Route Domain to Tunnel
&lt;code&gt;cloudflared tunnel route dns app.shanmugananthan app.shanmugananthan.com&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This tells Cloudflare to route requests to your domain through the tunnel.&lt;/p&gt;

&lt;p&gt;🚀 10. Run the Tunnel&lt;br&gt;
&lt;code&gt;cloudflared tunnel run app.shanmugananthan&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Or, run it in the background:&lt;br&gt;
&lt;code&gt;nohup cloudflared tunnel run app.shanmugananthan &amp;gt; tunnel.log 2&amp;gt;&amp;amp;1 &amp;amp;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now your site is live on your own custom domain (with free HTTPS via Cloudflare)!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔁 Recap of Commands&lt;/strong&gt;&lt;br&gt;
`pkg update &amp;amp;&amp;amp; pkg upgrade&lt;br&gt;
pkg install cloudflared&lt;br&gt;
mkdir ~/mysite &amp;amp;&amp;amp; cd ~/mysite&lt;br&gt;
echo '&lt;/p&gt;
&lt;h1&gt;Welcome to Termux Site&lt;/h1&gt;' &amp;gt; index.html&lt;br&gt;
python -m http.server 8000&lt;br&gt;
cloudflared tunnel --url &lt;a href="http://localhost:8000" rel="noopener noreferrer"&gt;http://localhost:8000&lt;/a&gt;
&lt;h1&gt;
  
  
  Background:
&lt;/h1&gt;

&lt;p&gt;nohup python -m http.server 8000 &amp;gt; python.log 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br&gt;
nohup cloudflared tunnel --url &lt;a href="http://localhost:8000" rel="noopener noreferrer"&gt;http://localhost:8000&lt;/a&gt; &amp;gt; tunnel.log 2&amp;gt;&amp;amp;1 &amp;amp;&lt;br&gt;
`&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For custom domain setup:&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;cloudflared login&lt;br&gt;
cloudflared tunnel create &amp;lt;tunnel-name&amp;gt;&lt;br&gt;
nano ~/.cloudflared/config.yml&lt;br&gt;
cloudflared tunnel route dns &amp;lt;tunnel-name&amp;gt; &amp;lt;your-domain.com&amp;gt;&lt;br&gt;
cloudflared tunnel run &amp;lt;tunnel-name&amp;gt;&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Final Output&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your site is now:&lt;/p&gt;

&lt;p&gt;✅ Live&lt;br&gt;
🔒 Secured with HTTPS&lt;br&gt;
🌐 Accessible globally&lt;br&gt;
🧠 Hosted entirely from your Android phone!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💬 FAQs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Q: Can I use this for dynamic websites?&lt;br&gt;
Yes, you can use frameworks like Flask, Node.js, or PHP with a bit more setup.&lt;/p&gt;

&lt;p&gt;Q: Will it stay online 24/7?&lt;br&gt;
As long as Termux and your phone stay awake. You can use apps like Termux:Boot and battery settings to keep it alive longer.&lt;/p&gt;

&lt;p&gt;Q: Is it free?&lt;br&gt;
Yes! Everything used — Termux, Python server, and Cloudflare Tunnel — is 100% free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✨ Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You just turned your Android phone into a live web server, accessible worldwide via Cloudflare Tunnel, using only Termux — no root, no paid hosting, and HTTPS included. 💥&lt;/p&gt;

&lt;p&gt;This approach is perfect for:&lt;/p&gt;

&lt;p&gt;⚡ Quick project demos&lt;br&gt;
🧪 Learning web hosting basics&lt;br&gt;
🛠️ Emergency backup sites&lt;br&gt;
🌐 Personal landing pages&lt;br&gt;
If this helped you, feel free to connect or follow me for more tutorials and self-hosted tech setups:&lt;/p&gt;

&lt;p&gt;🔗 Let’s Connect&lt;/p&gt;

&lt;p&gt;💼 &lt;a href="https://linkedin.com/in/shanmugananthan" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;br&gt;
📸 &lt;a href="https://instagram.com/iamshanmugananthan" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt;&lt;br&gt;
🐙 &lt;a href="https://github.com/iamshanmugananthan" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;br&gt;
▶️ &lt;a href="https://youtube.com/@shanmugananthan" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cloud</category>
      <category>serverless</category>
      <category>website</category>
    </item>
  </channel>
</rss>
