<?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: Tien Nguyen Huynh</title>
    <description>The latest articles on DEV Community by Tien Nguyen Huynh (@hirdo).</description>
    <link>https://dev.to/hirdo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4080179%2Fca39c16a-9dfa-48c0-87c6-3ba67adc897f.png</url>
      <title>DEV Community: Tien Nguyen Huynh</title>
      <link>https://dev.to/hirdo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hirdo"/>
    <language>en</language>
    <item>
      <title>Docker for Developers: From Zero to Production-Ready Containers</title>
      <dc:creator>Tien Nguyen Huynh</dc:creator>
      <pubDate>Sun, 30 Aug 2026 16:40:09 +0000</pubDate>
      <link>https://dev.to/hirdo/docker-for-developers-from-zero-to-production-ready-containers-8f8</link>
      <guid>https://dev.to/hirdo/docker-for-developers-from-zero-to-production-ready-containers-8f8</guid>
      <description>&lt;p&gt;Every modern developer encounters Docker eventually. You have likely run &lt;code&gt;docker run -p 8080:80 nginx&lt;/code&gt; or copied a snippet from a README to get a local database running. But moving from blindly running commands to structuring production-grade container workflows requires a deeper understanding of how Docker operates under the hood.&lt;/p&gt;

&lt;p&gt;In this article, we will move beyond the basics of containerization. We will explore core container concepts, build a highly optimized multi-stage Dockerfile for a web application, orchestrate local environments with Docker Compose, and review production best practices that keep your images small and secure.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Demystifying the Core Architecture
&lt;/h2&gt;

&lt;p&gt;Before writing code, let us clear up common misconceptions about Docker components.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image&lt;/strong&gt;: A read-only template containing your application code, runtime, system tools, libraries, and dependencies. Think of an image as a class definition in OOP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container&lt;/strong&gt;: A runnable instance of an image. It is isolated from the host machine and other containers using Linux &lt;code&gt;namespaces&lt;/code&gt; (for isolation) and &lt;code&gt;cgroups&lt;/code&gt; (for resource limiting). Think of a container as an object instantiated from a class.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Volume&lt;/strong&gt;: Persistent storage detached from the container lifecycle. Because containers are ephemeral by default, any data written inside a container disappears when it is destroyed. Volumes mount a directory from the host OS into the container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network&lt;/strong&gt;: The abstraction layer allowing containers to communicate with each other or with external services.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Writing a Production-Grade Dockerfile
&lt;/h2&gt;

&lt;p&gt;A simple Dockerfile gets your app running, but an optimized Dockerfile ensures fast CI/CD builds, minimal attack surfaces, and tiny deployment artifacts.&lt;/p&gt;

&lt;p&gt;Let's look at a typical &lt;strong&gt;Node.js application&lt;/strong&gt;. Here is a common mistake beginners make:&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="c"&gt;# Bad Dockerfile Example&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:18&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "server.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What is wrong with this approach?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Massive image size&lt;/strong&gt;: &lt;code&gt;node:18&lt;/code&gt; is based on a full Debian distribution, weighing around 1GB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Broken build cache&lt;/strong&gt;: Copying &lt;code&gt;.&lt;/code&gt; before running &lt;code&gt;npm install&lt;/code&gt; invalidates Docker's layer cache on &lt;em&gt;every single code change&lt;/em&gt;, forcing node modules to reinstall every time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security risk&lt;/strong&gt;: The application runs as the root user inside the container.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Optimized Multi-Stage Approach
&lt;/h3&gt;

&lt;p&gt;Multi-stage builds allow you to use a heavy base image to compile dependencies and a lightweight image to run the final app.&lt;/p&gt;

&lt;p&gt;Here is how to structure it properly:&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="c"&gt;# Stage 1: Build &amp;amp; Dependencies&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:18-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /usr/src/app&lt;/span&gt;

&lt;span class="c"&gt;# Copy package manifests first to leverage Docker layer caching&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;

&lt;span class="c"&gt;# Install all dependencies (including devDependencies for building)&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm ci

&lt;span class="c"&gt;# Copy remaining source code&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;

&lt;span class="c"&gt;# Build application (if using TypeScript or bundlers)&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm run build

&lt;span class="c"&gt;# Prune non-production dependencies&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm prune &lt;span class="nt"&gt;--production&lt;/span&gt;

&lt;span class="c"&gt;# ---------------------------------------------------&lt;/span&gt;
&lt;span class="c"&gt;# Stage 2: Production Execution&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:18-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;runner&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /usr/src/app&lt;/span&gt;

&lt;span class="c"&gt;# Set production environment&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; NODE_ENV=production&lt;/span&gt;

&lt;span class="c"&gt;# Create a non-privileged system user&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;addgroup &lt;span class="nt"&gt;-g&lt;/span&gt; 1001 &lt;span class="nt"&gt;-S&lt;/span&gt; nodejs &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    adduser &lt;span class="nt"&gt;-S&lt;/span&gt; nodejs &lt;span class="nt"&gt;-u&lt;/span&gt; 1001 &lt;span class="nt"&gt;-G&lt;/span&gt; nodejs

&lt;span class="c"&gt;# Copy built assets and production node_modules from builder&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /usr/src/app/package*.json ./&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /usr/src/app/node_modules ./node_modules&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /usr/src/app/dist ./dist&lt;/span&gt;

&lt;span class="c"&gt;# Change ownership to non-root user&lt;/span&gt;
&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; nodejs&lt;/span&gt;

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

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "dist/server.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Improvements Made:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Minimal Base Image&lt;/strong&gt;: Switching to &lt;code&gt;alpine&lt;/code&gt; reduces the base footprint down to ~150MB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Layer Caching&lt;/strong&gt;: &lt;code&gt;package*.json&lt;/code&gt; is copied separately before &lt;code&gt;npm ci&lt;/code&gt;. Re-building after changing application logic takes seconds instead of minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Stage Build&lt;/strong&gt;: Development dependencies and build tools stay in the &lt;code&gt;builder&lt;/code&gt; stage, keeping the &lt;code&gt;runner&lt;/code&gt; image lean.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Least Privilege Security&lt;/strong&gt;: Setting &lt;code&gt;USER nodejs&lt;/code&gt; prevents potential container breakout exploits from obtaining host root access.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Don't Forget &lt;code&gt;.dockerignore&lt;/code&gt;!
&lt;/h2&gt;

&lt;p&gt;Just as &lt;code&gt;.gitignore&lt;/code&gt; keeps clutter out of your Git repository, a &lt;code&gt;.dockerignore&lt;/code&gt; file prevents unneeded files from entering the Docker build context. Sending gigabytes of local node modules or git history over to the Docker daemon slows down your builds.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;.dockerignore&lt;/code&gt; file alongside your Dockerfile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node_modules
npm-debug.log
.git
.gitignore
Dockerfile
docker-compose.yml
README.md
dist
.env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Local Environment Orchestration with Docker Compose
&lt;/h2&gt;

&lt;p&gt;Applications rarely live in isolation. You usually need an app server, a database, and perhaps a caching layer like Redis.&lt;/p&gt;

&lt;p&gt;Rather than executing long &lt;code&gt;docker run&lt;/code&gt; commands manually, use &lt;strong&gt;Docker Compose&lt;/strong&gt; to define your stack declaratively in &lt;code&gt;docker-compose.yml&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
      &lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;runner&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:3000"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;PORT=3000&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;DATABASE_URL=postgres://devuser:secretpass@db:5432/devdb&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service_healthy&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;

  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:15-alpine&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5432:5432"&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;devuser&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;secretpass&lt;/span&gt;
      &lt;span class="na"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;devdb&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pgdata:/var/lib/postgresql/data&lt;/span&gt;
    &lt;span class="na"&gt;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CMD-SHELL"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pg_isready&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-U&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;devuser&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-d&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;devdb"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
      &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;5s&lt;/span&gt;
      &lt;span class="na"&gt;retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Useful Compose Commands:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Start all services in background: &lt;code&gt;docker compose up -d&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;View aggregated stream logs: &lt;code&gt;docker compose logs -f&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Stop and remove containers + networks: &lt;code&gt;docker compose down&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Destroy persistent volumes: &lt;code&gt;docker compose down -v&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Essential CLI Commands for Debugging
&lt;/h2&gt;

&lt;p&gt;When a container refuses to start or acts unexpectedly, these commands will save your sanity:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Inspect container logs&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 logs &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="nt"&gt;--tail&lt;/span&gt; 100 &amp;lt;container_id_or_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Execute an interactive shell inside a running container&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 &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &amp;lt;container_id_or_name&amp;gt; sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check running container metrics (CPU, Memory, Network I/O)&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 stats
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clean up unused images, containers, and volumes&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 system prune &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;--volumes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Summary Checklist for Developers
&lt;/h2&gt;

&lt;p&gt;To ensure your application is containerized cleanly, keep these rules in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Leverage layer caching&lt;/strong&gt;: Put commands that change infrequently (installing dependencies) near the top of your Dockerfile.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Use lightweight base images&lt;/strong&gt;: Prefer &lt;code&gt;alpine&lt;/code&gt; or &lt;code&gt;slim&lt;/code&gt; tags over default full distributions.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Utilize multi-stage builds&lt;/strong&gt;: Keep build tools out of runtime images.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Never run as root&lt;/strong&gt;: Create and switch to a non-root system user inside the Dockerfile.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Include a &lt;code&gt;.dockerignore&lt;/code&gt;&lt;/strong&gt;: Do not transfer heavy build outputs or confidential &lt;code&gt;.env&lt;/code&gt; files to the build context.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Store state outside containers&lt;/strong&gt;: Use named volumes or managed database services for persistent storage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Containerization transforms software delivery from predictable local builds to dependable production deployments. Master these fundamentals, and your workflows will be faster, safer, and far easier to maintain.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>webdev</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
