<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tools on Software Engineering Learning Paths</title><link>https://kyngo.github.io/learning-paths/paths/tools/</link><description>Recent content in Tools on Software Engineering Learning Paths</description><generator>Hugo</generator><language>en</language><atom:link href="https://kyngo.github.io/learning-paths/paths/tools/index.xml" rel="self" type="application/rss+xml"/><item><title>Git</title><link>https://kyngo.github.io/learning-paths/paths/tools/01-git/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/tools/01-git/</guid><description>&lt;h2 id="what-is-git"&gt;What Is Git?&lt;a class="anchor" href="#what-is-git"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Git is a distributed version control system that tracks changes in source code. Created by Linus Torvalds in 2005 for Linux kernel development, it&amp;rsquo;s now the universal standard for software collaboration.&lt;/p&gt;
&lt;h3 id="why-git"&gt;Why Git?&lt;a class="anchor" href="#why-git"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Feature&lt;/th&gt;
					&lt;th&gt;Benefit&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Distributed&lt;/td&gt;
					&lt;td&gt;Every clone is a full repository — work offline, no single point of failure&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Branching&lt;/td&gt;
					&lt;td&gt;Create, merge, and delete branches instantly&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Speed&lt;/td&gt;
					&lt;td&gt;Local operations (log, diff, commit) are near-instant&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Integrity&lt;/td&gt;
					&lt;td&gt;Every object is checksummed with SHA-1/SHA-256&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Staging area&lt;/td&gt;
					&lt;td&gt;Fine-grained control over what goes into each commit&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="core-concepts"&gt;Core Concepts&lt;a class="anchor" href="#core-concepts"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class="mermaid"&gt;flowchart LR
 WD[&amp;#34;Working Directory&amp;#34;] --&amp;gt;|&amp;#34;git add&amp;#34;| SA[&amp;#34;Staging Area&amp;lt;br/&amp;gt;(Index)&amp;#34;]
 SA --&amp;gt;|&amp;#34;git commit&amp;#34;| LR[&amp;#34;Local Repository&amp;lt;br/&amp;gt;(.git)&amp;#34;]
 LR --&amp;gt;|&amp;#34;git push&amp;#34;| RR[&amp;#34;Remote Repository&amp;#34;]
 RR --&amp;gt;|&amp;#34;git pull / fetch&amp;#34;| LR
 LR --&amp;gt;|&amp;#34;git checkout&amp;#34;| WD&lt;/pre&gt;&lt;h3 id="the-three-states"&gt;The Three States&lt;a class="anchor" href="#the-three-states"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Every file in a Git repository is in one of three states:&lt;/p&gt;</description></item><item><title>Docker and Docker Compose</title><link>https://kyngo.github.io/learning-paths/paths/tools/02-docker/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/tools/02-docker/</guid><description>&lt;h2 id="what-is-docker"&gt;What Is Docker?&lt;a class="anchor" href="#what-is-docker"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Docker is a platform for building, running, and distributing applications inside &lt;strong&gt;containers&lt;/strong&gt; — lightweight, isolated environments that package code with all its dependencies. Containers share the host OS kernel, making them far more efficient than virtual machines.&lt;/p&gt;
&lt;pre class="mermaid"&gt;flowchart TB
 subgraph VM[&amp;#34;Virtual Machine&amp;#34;]
 GA[&amp;#34;Guest OS A&amp;#34;]
 AA[&amp;#34;App A + Libs&amp;#34;]
 GA --- AA
 end
 subgraph VM2[&amp;#34;Virtual Machine&amp;#34;]
 GB[&amp;#34;Guest OS B&amp;#34;]
 AB[&amp;#34;App B + Libs&amp;#34;]
 GB --- AB
 end
 subgraph Container[&amp;#34;Containers&amp;#34;]
 CA[&amp;#34;App A + Libs&amp;#34;]
 CB[&amp;#34;App B + Libs&amp;#34;]
 end
 
 HV[&amp;#34;Hypervisor&amp;#34;]
 DR[&amp;#34;Docker Engine&amp;#34;]
 HOST[&amp;#34;Host OS + Kernel&amp;#34;]
 HW[&amp;#34;Hardware&amp;#34;]
 
 VM --- HV
 VM2 --- HV
 Container --- DR
 HV --- HOST
 DR --- HOST
 HOST --- HW&lt;/pre&gt;&lt;h3 id="containers-vs-virtual-machines"&gt;Containers vs Virtual Machines&lt;a class="anchor" href="#containers-vs-virtual-machines"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Aspect&lt;/th&gt;
					&lt;th&gt;Container&lt;/th&gt;
					&lt;th&gt;Virtual Machine&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Boot 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;Size&lt;/td&gt;
					&lt;td&gt;MBs (app + libs only)&lt;/td&gt;
					&lt;td&gt;GBs (full OS)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Isolation&lt;/td&gt;
					&lt;td&gt;Process-level (shared kernel)&lt;/td&gt;
					&lt;td&gt;Full hardware-level&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Performance&lt;/td&gt;
					&lt;td&gt;Near-native&lt;/td&gt;
					&lt;td&gt;Hypervisor overhead&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Density&lt;/td&gt;
					&lt;td&gt;Hundreds per host&lt;/td&gt;
					&lt;td&gt;Tens per host&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Use case&lt;/td&gt;
					&lt;td&gt;Microservices, CI/CD, dev environments&lt;/td&gt;
					&lt;td&gt;Full OS isolation, legacy apps&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="core-concepts"&gt;Core Concepts&lt;a class="anchor" href="#core-concepts"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Concept&lt;/th&gt;
					&lt;th&gt;What It Is&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Image&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Read-only template with app code, runtime, libraries, and config. Blueprint for containers.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Container&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Running instance of an image. Isolated process with its own filesystem, networking, PID space.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Dockerfile&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Text file with instructions to build an image layer by layer.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Registry&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Storage for images (Docker Hub, ECR, GCR, GitLab Registry).&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Volume&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Persistent storage that survives container restarts/removal.&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Network&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Virtual network connecting containers.&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="essential-commands"&gt;Essential Commands&lt;a class="anchor" href="#essential-commands"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="images"&gt;Images&lt;a class="anchor" href="#images"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Pull from registry&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker pull nginx:1.25
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker pull python:3.12-slim
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# List local images&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker images
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker image ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Build from Dockerfile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker build -t myapp:1.0 .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker build -t myapp:latest -f Dockerfile.prod .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Remove&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker rmi nginx:1.25
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker image prune &lt;span class="c1"&gt;# Remove dangling images&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker image prune -a &lt;span class="c1"&gt;# Remove all unused images&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="containers"&gt;Containers&lt;a class="anchor" href="#containers"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Run (create + start)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run nginx &lt;span class="c1"&gt;# Foreground&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d nginx &lt;span class="c1"&gt;# Detached (background)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d -p 8080:80 nginx &lt;span class="c1"&gt;# Map host:container port&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d --name web -p 8080:80 nginx &lt;span class="c1"&gt;# Named container&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --rm alpine &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;# Remove after exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Interactive shell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -it ubuntu bash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; -it web bash &lt;span class="c1"&gt;# Shell into running container&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Lifecycle&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker start web
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker stop web
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker restart web
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker rm web &lt;span class="c1"&gt;# Remove stopped container&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker rm -f web &lt;span class="c1"&gt;# Force remove (running)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Inspect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker ps &lt;span class="c1"&gt;# Running containers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker ps -a &lt;span class="c1"&gt;# All (including stopped)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker logs web &lt;span class="c1"&gt;# View logs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker logs -f web &lt;span class="c1"&gt;# Follow logs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker inspect web &lt;span class="c1"&gt;# Full JSON details&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker stats &lt;span class="c1"&gt;# Live resource usage&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="volumes"&gt;Volumes&lt;a class="anchor" href="#volumes"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Named volume (managed by Docker)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker volume create mydata
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d -v mydata:/app/data myapp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Bind mount (host path)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d -v &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;/src:/app/src myapp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# List and clean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker volume ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker volume prune&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="dockerfile"&gt;Dockerfile&lt;a class="anchor" href="#dockerfile"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="anatomy"&gt;Anatomy&lt;a class="anchor" href="#anatomy"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Base image&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;python:3.12-slim&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Metadata&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;LABEL&lt;/span&gt; &lt;span class="nv"&gt;maintainer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;you@example.com&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Set working directory&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Install dependencies (cached layer)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; requirements.txt .&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; pip install --no-cache-dir -r requirements.txt&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Copy application code&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; src/ ./src/&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Environment variables&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENV&lt;/span&gt; &lt;span class="nv"&gt;ENVIRONMENT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENV&lt;/span&gt; &lt;span class="nv"&gt;PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;8000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Expose port (documentation)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;8000&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Non-root user (security)&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; useradd -r appuser&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;appuser&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Default command&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CMD&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;python&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;-m&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;uvicorn&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;src.main:app&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;--host&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.0.0.0&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;--port&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;8000&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="key-instructions"&gt;Key Instructions&lt;a class="anchor" href="#key-instructions"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Instruction&lt;/th&gt;
					&lt;th&gt;Purpose&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;FROM&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Base image (always first)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;WORKDIR&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Set working directory for subsequent instructions&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 files from build context into image&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ADD&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Like COPY but can extract tarballs and fetch URLs&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;RUN&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Execute command during build (creates layer)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ENV&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Set environment variable&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;EXPOSE&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Document which port the container listens on&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;USER&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Switch to non-root user&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CMD&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Default command when container starts (overridable)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ENTRYPOINT&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Fixed command (CMD becomes arguments)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ARG&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Build-time variable (not available at runtime)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;VOLUME&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Declare mount point&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;HEALTHCHECK&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Define health check command&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="multi-stage-builds"&gt;Multi-Stage Builds&lt;a class="anchor" href="#multi-stage-builds"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Produce small production images by separating build from runtime:&lt;/p&gt;</description></item><item><title>SSH</title><link>https://kyngo.github.io/learning-paths/paths/tools/03-ssh/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/tools/03-ssh/</guid><description>&lt;h2 id="what-is-ssh"&gt;What Is SSH?&lt;a class="anchor" href="#what-is-ssh"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;SSH (Secure Shell)&lt;/strong&gt; is a cryptographic network protocol for secure communication between computers over an unsecured network. It provides encrypted remote login, command execution, file transfer, and port forwarding.&lt;/p&gt;
&lt;p&gt;SSH replaced insecure predecessors like Telnet, rlogin, and FTP — which transmitted everything (including passwords) in plaintext.&lt;/p&gt;
&lt;h3 id="what-ssh-provides"&gt;What SSH Provides&lt;a class="anchor" href="#what-ssh-provides"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Feature&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;strong&gt;Authentication&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Verify identity (password or key-based)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Encryption&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;All traffic encrypted in transit (AES, ChaCha20)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Integrity&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Detect tampering (HMAC)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Tunneling&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Forward ports, proxy traffic through encrypted channel&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;File transfer&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;SCP and SFTP for secure file operations&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="how-ssh-works"&gt;How SSH Works&lt;a class="anchor" href="#how-ssh-works"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;pre class="mermaid"&gt;sequenceDiagram
 participant Client
 participant Server
 
 Client-&amp;gt;&amp;gt;Server: TCP connection (port 22)
 Client-&amp;gt;&amp;gt;Server: Protocol version exchange
 Server-&amp;gt;&amp;gt;Client: Protocol version exchange
 Note over Client,Server: Key exchange (Diffie-Hellman)
 Note over Client,Server: Session encryption established
 Client-&amp;gt;&amp;gt;Server: Authentication (key or password)
 Server-&amp;gt;&amp;gt;Client: Authentication success
 Note over Client,Server: Encrypted session active&lt;/pre&gt;&lt;h3 id="authentication-methods"&gt;Authentication Methods&lt;a class="anchor" href="#authentication-methods"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Method&lt;/th&gt;
					&lt;th&gt;Security&lt;/th&gt;
					&lt;th&gt;Use Case&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Public key&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Excellent&lt;/td&gt;
					&lt;td&gt;Default for servers, CI/CD, automation&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Password&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Moderate&lt;/td&gt;
					&lt;td&gt;Quick setup, less secure&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;Certificate&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Excellent&lt;/td&gt;
					&lt;td&gt;Enterprise, large fleet management&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;GSSAPI/Kerberos&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;Excellent&lt;/td&gt;
					&lt;td&gt;Corporate environments with AD&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="key-based-authentication"&gt;Key-Based Authentication&lt;a class="anchor" href="#key-based-authentication"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="generating-keys"&gt;Generating Keys&lt;a class="anchor" href="#generating-keys"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Ed25519 (recommended — fast, secure, short keys)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-keygen -t ed25519 -C &lt;span class="s2"&gt;&amp;#34;you@example.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# RSA (legacy compatibility — use 4096 bits minimum)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-keygen -t rsa -b &lt;span class="m"&gt;4096&lt;/span&gt; -C &lt;span class="s2"&gt;&amp;#34;you@example.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# With custom filename&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-keygen -t ed25519 -f ~/.ssh/id_work -C &lt;span class="s2"&gt;&amp;#34;work laptop&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This creates two files:&lt;/p&gt;</description></item><item><title>Apache HTTP Server</title><link>https://kyngo.github.io/learning-paths/paths/tools/04-apache/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/tools/04-apache/</guid><description>&lt;h2 id="what-is-apache"&gt;What Is Apache?&lt;a class="anchor" href="#what-is-apache"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Apache HTTP Server&lt;/strong&gt; (commonly &amp;ldquo;Apache&amp;rdquo; or &amp;ldquo;httpd&amp;rdquo;) is the world&amp;rsquo;s most widely-used web server, maintained by the Apache Software Foundation since 1995. It serves static and dynamic content via a modular architecture with support for virtual hosts, URL rewriting, authentication, proxying, and more.&lt;/p&gt;
&lt;h3 id="apache-vs-nginx"&gt;Apache vs Nginx&lt;a class="anchor" href="#apache-vs-nginx"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Aspect&lt;/th&gt;
					&lt;th&gt;Apache&lt;/th&gt;
					&lt;th&gt;Nginx&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Architecture&lt;/td&gt;
					&lt;td&gt;Process/thread per connection&lt;/td&gt;
					&lt;td&gt;Event-driven, async&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Config style&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;.htaccess&lt;/code&gt; per-directory (flexible)&lt;/td&gt;
					&lt;td&gt;Centralized config (performant)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Dynamic content&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;mod_php&lt;/code&gt;, &lt;code&gt;mod_python&lt;/code&gt; (in-process)&lt;/td&gt;
					&lt;td&gt;Proxies to external process (PHP-FPM)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Best for&lt;/td&gt;
					&lt;td&gt;Shared hosting, &lt;code&gt;.htaccess&lt;/code&gt; flexibility&lt;/td&gt;
					&lt;td&gt;High concurrency, reverse proxying&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Performance (static)&lt;/td&gt;
					&lt;td&gt;Good&lt;/td&gt;
					&lt;td&gt;Excellent&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Performance (dynamic)&lt;/td&gt;
					&lt;td&gt;Excellent (mod_php)&lt;/td&gt;
					&lt;td&gt;Excellent (via proxy)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="installation"&gt;Installation&lt;a class="anchor" href="#installation"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Debian/Ubuntu&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install apache2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# RHEL/CentOS/Amazon Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo yum install httpd &lt;span class="c1"&gt;# or: sudo dnf install httpd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# macOS (built-in, or via Homebrew)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install httpd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Start and enable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl start apache2 &lt;span class="c1"&gt;# Debian&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl start httpd &lt;span class="c1"&gt;# RHEL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; apache2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="directory-structure"&gt;Directory Structure&lt;a class="anchor" href="#directory-structure"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="debianubuntu"&gt;Debian/Ubuntu&lt;a class="anchor" href="#debianubuntu"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/etc/apache2/
├── apache2.conf # Main config
├── ports.conf # Listen directives
├── sites-available/ # Virtual host configs (inactive)
├── sites-enabled/ # Symlinks to active vhosts
├── mods-available/ # Available modules
├── mods-enabled/ # Active modules (symlinks)
├── conf-available/ # Additional config fragments
└── conf-enabled/ # Active config fragments&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="rhelcentos"&gt;RHEL/CentOS&lt;a class="anchor" href="#rhelcentos"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/etc/httpd/
├── conf/httpd.conf # Main config
├── conf.d/ # Additional configs (*.conf auto-loaded)
└── modules/ # Module .so files&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="content-and-logs"&gt;Content and Logs&lt;a class="anchor" href="#content-and-logs"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;/var/www/html/ # Default document root
/var/log/apache2/ # Debian logs
/var/log/httpd/ # RHEL logs&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="virtual-hosts"&gt;Virtual Hosts&lt;a class="anchor" href="#virtual-hosts"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Virtual hosts let one Apache instance serve multiple websites:&lt;/p&gt;</description></item><item><title>Nginx</title><link>https://kyngo.github.io/learning-paths/paths/tools/05-nginx/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/tools/05-nginx/</guid><description>&lt;h2 id="what-is-nginx"&gt;What Is Nginx?&lt;a class="anchor" href="#what-is-nginx"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Nginx&lt;/strong&gt; (pronounced &amp;ldquo;engine-x&amp;rdquo;) is a high-performance web server, reverse proxy, and load balancer. Created by Igor Sysoev in 2004 to solve the C10K problem (handling 10,000+ concurrent connections), it uses an event-driven, asynchronous architecture that excels at serving static content and proxying to application backends.&lt;/p&gt;
&lt;h3 id="architecture"&gt;Architecture&lt;a class="anchor" href="#architecture"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;pre class="mermaid"&gt;flowchart TB
 CLIENTS[&amp;#34;Clients&amp;lt;br/&amp;gt;(thousands of connections)&amp;#34;]
 MASTER[&amp;#34;Master Process&amp;lt;br/&amp;gt;(reads config, manages workers)&amp;#34;]
 W1[&amp;#34;Worker Process 1&amp;lt;br/&amp;gt;(event loop)&amp;#34;]
 W2[&amp;#34;Worker Process 2&amp;lt;br/&amp;gt;(event loop)&amp;#34;]
 W3[&amp;#34;Worker Process N&amp;lt;br/&amp;gt;(event loop)&amp;#34;]
 
 CLIENTS --&amp;gt; MASTER
 MASTER --&amp;gt; W1
 MASTER --&amp;gt; W2
 MASTER --&amp;gt; W3&lt;/pre&gt;&lt;p&gt;Each worker process handles thousands of connections in a single thread using non-blocking I/O (epoll/kqueue). No thread-per-connection overhead.&lt;/p&gt;</description></item><item><title>Package Management</title><link>https://kyngo.github.io/learning-paths/paths/tools/06-package-management/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/tools/06-package-management/</guid><description>&lt;h2 id="what-is-package-management"&gt;What Is Package Management?&lt;a class="anchor" href="#what-is-package-management"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A package manager automates the process of installing, upgrading, configuring, and removing software. Instead of downloading binaries from websites and managing dependencies manually, you use a command-line tool that handles everything — fetching packages from repositories, resolving dependency trees, and tracking what&amp;rsquo;s installed.&lt;/p&gt;
&lt;h3 id="why-package-managers-matter"&gt;Why Package Managers Matter&lt;a class="anchor" href="#why-package-managers-matter"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Without&lt;/th&gt;
					&lt;th&gt;With&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Download from random websites&lt;/td&gt;
					&lt;td&gt;Install from trusted repositories&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Manual dependency hunting&lt;/td&gt;
					&lt;td&gt;Automatic dependency resolution&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;No easy way to update all software&lt;/td&gt;
					&lt;td&gt;Single command to update everything&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Unknown security status&lt;/td&gt;
					&lt;td&gt;Signed packages, vulnerability tracking&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Difficult to reproduce environments&lt;/td&gt;
					&lt;td&gt;Scriptable, reproducible installs&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="chocolatey-windows"&gt;Chocolatey (Windows)&lt;a class="anchor" href="#chocolatey-windows"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Chocolatey is the leading package manager for Windows, bringing Linux-style package management to the Windows ecosystem.&lt;/p&gt;</description></item><item><title>Containers in Production</title><link>https://kyngo.github.io/learning-paths/paths/tools/07-containers-production/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kyngo.github.io/learning-paths/paths/tools/07-containers-production/</guid><description>&lt;h2 id="beyond-docker-run"&gt;Beyond &lt;code&gt;docker run&lt;/code&gt;&lt;a class="anchor" href="#beyond-docker-run"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Running a container locally is one thing. Running dozens — or thousands — of containers reliably in production requires orchestration, security hardening, observability, and disciplined image management. This section bridges the gap between local Docker usage and production-grade container infrastructure.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="container-orchestration-concepts"&gt;Container Orchestration Concepts&lt;a class="anchor" href="#container-orchestration-concepts"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="why-orchestrate"&gt;Why Orchestrate?&lt;a class="anchor" href="#why-orchestrate"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A single container on a single host has no resilience. If it crashes, nothing restarts it. If traffic spikes, nothing scales it. Orchestration solves these problems:&lt;/p&gt;</description></item></channel></rss>