<?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: Fabrício José Souza</title>
    <description>The latest articles on DEV Community by Fabrício José Souza (@fabriciojs).</description>
    <link>https://dev.to/fabriciojs</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%2F653404%2Fbb3f5a77-ffa2-41a2-9952-ff12ee70293d.jpeg</url>
      <title>DEV Community: Fabrício José Souza</title>
      <link>https://dev.to/fabriciojs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fabriciojs"/>
    <language>en</language>
    <item>
      <title>Kool's Next Chapter: Closing the Gap Between AI-Generated Code and Production</title>
      <dc:creator>Fabrício José Souza</dc:creator>
      <pubDate>Wed, 18 Mar 2026 03:03:53 +0000</pubDate>
      <link>https://dev.to/kooldev/kools-next-chapter-closing-the-gap-between-ai-generated-code-and-production-2kde</link>
      <guid>https://dev.to/kooldev/kools-next-chapter-closing-the-gap-between-ai-generated-code-and-production-2kde</guid>
      <description>&lt;p&gt;Five years ago we wrote about &lt;a href="https://dev.to/blog/using-docker-for-local-development"&gt;using Docker for local development the right way&lt;/a&gt;. A lot has changed since then — except our obsession with developer experience. Today, we're entering a new chapter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where It All Started
&lt;/h2&gt;

&lt;p&gt;Back in 2021, Kool was born out of frustration. We were a software house juggling dozens of client projects across different stacks, and Docker — while powerful — kept getting in the way. Permission issues on mapped volumes, MTU mismatches, the &lt;code&gt;-t&lt;/code&gt; vs &lt;code&gt;-T&lt;/code&gt; flag dance, teammates siloing Docker knowledge... we had seen it all.&lt;/p&gt;

&lt;p&gt;So we built &lt;a href="https://github.com/kool-dev/kool" rel="noopener noreferrer"&gt;Kool&lt;/a&gt;: a CLI tool that wrapped Docker and Docker Compose with sane defaults, presets for popular frameworks, and custom images optimized for local development. The goal was simple — &lt;strong&gt;remove the friction so developers could focus on code, not infrastructure&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The developer community responded. Our articles on Dev.to reached over 33,000 views. We went from 60 to 600+ GitHub stars. People joined our Slack, opened issues, contributed code. Kool had found its audience.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Hasn't Changed
&lt;/h2&gt;

&lt;p&gt;Five years later, the problems Kool was built to solve haven't gone away. If anything, they've gotten worse. Docker's ecosystem has grown more complex. Multi-service architectures are the norm. Teams are more distributed. Onboarding new developers onto a project still involves too much "works on my machine" debugging.&lt;/p&gt;

&lt;p&gt;The original arguments for Kool remain exactly as strong today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker is a container engine, not a development tool.&lt;/strong&gt; It was never designed to optimize the local dev experience. Kool bridges that gap with sane defaults and conventions that just work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge silos kill velocity.&lt;/strong&gt; When only senior engineers understand the Docker setup, the whole team slows down. Kool standardizes workflows through &lt;code&gt;kool.yml&lt;/code&gt; so every team member runs the same commands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permission issues, volume mapping, networking quirks&lt;/strong&gt; — these haven't been solved by Docker itself. Kool's custom images still handle the headaches that plague raw Docker setups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No vendor lock-in.&lt;/strong&gt; Your &lt;code&gt;docker-compose.yml&lt;/code&gt; is yours. Kool wraps it, never replaces it. You keep full control.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;kool create&lt;/code&gt; still spins up a fully configured local environment in minutes. &lt;code&gt;kool run&lt;/code&gt; still keeps your workflow scripts shared and versioned. The &lt;a href="https://dev.to/blog/using-docker-for-local-development"&gt;original value proposition&lt;/a&gt; holds stronger than ever — because the fundamental problems haven't changed, and neither has Kool's answer to them.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Local to Cloud — The Hard Way
&lt;/h2&gt;

&lt;p&gt;In 2023, we &lt;a href="https://dev.to/blog/taking-off"&gt;wrote about our journey&lt;/a&gt; and the natural next step: taking the same Docker Compose setup developers use locally and deploying it to the cloud. In early 2024, we &lt;a href="https://dev.to/blog/kool-cloud-general-availability"&gt;launched Kool Cloud&lt;/a&gt; publicly.&lt;/p&gt;

&lt;p&gt;We spent nearly two years running and refining the platform with a curated group of early adopters. That deliberate pace taught us what works in production — and what developers actually need when moving containers to the cloud. We iterated on the deploy experience, built out managed MySQL databases, environment management, team collaboration, and a billing model that makes sense for small teams and growing companies alike.&lt;/p&gt;

&lt;p&gt;The cloud platform matured. Quietly, intentionally, and with real users validating every decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  The New Bottleneck
&lt;/h2&gt;

&lt;p&gt;Here's what's different now: AI agents are writing code faster than teams can ship it.&lt;/p&gt;

&lt;p&gt;Coding agents — Claude, Copilot, Cursor — are generating features, fixing bugs, and refactoring entire codebases in minutes. The bottleneck is no longer writing code. It's everything that happens after: spinning up a preview environment for PR validation, handing off to QA with a live URL, configuring deploys, provisioning infrastructure, debugging Kubernetes manifests, understanding cloud provider quirks. The same learning curve problem we solved for Docker locally now exists for the entire path from code to production — and it's worse, because the speed gap between code generation and code shipping has never been wider.&lt;/p&gt;

&lt;p&gt;Developers still need to feel in control. But the cost of that control should be managed. You shouldn't need to deep-dive into specific DevOps toolchains just to get your app live. Not when AI just wrote it in 30 seconds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reborn Phase
&lt;/h2&gt;

&lt;p&gt;This is where Kool's new chapter begins.&lt;/p&gt;

&lt;h3&gt;
  
  
  Built for Agents. Easy for Humans.
&lt;/h3&gt;

&lt;p&gt;We're building Kool to be the deployment layer that AI agents interact with natively. Your coding agent already writes your code — now let it deploy too. Deploy your app, provision a database, check logs, roll back — agents can do all of this on their own, autonomously, as part of their workflow.&lt;/p&gt;

&lt;p&gt;But here's the thing: the same interface works just as well for you. The Kool CLI was always designed for low learning curve, and that hasn't changed. &lt;code&gt;kool cloud deploy&lt;/code&gt; is one command. You don't need to understand Kubernetes, Helm charts, or cloud provider consoles. Whether it's your agent running the command or you typing it yourself, the experience is the same.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optimized for agents. Accessible to humans. No DevOps degree required for either.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Borrow Our Cloud, or Bring Your Own
&lt;/h3&gt;

&lt;p&gt;Two paths, one experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Managed Cloud&lt;/strong&gt; — Deploy your Docker apps to Kool Cloud in minutes. No Kubernetes knowledge required. No servers to manage. Just &lt;code&gt;kool cloud deploy&lt;/code&gt; and your app is live on infrastructure managed by us. Think of it as borrowing a sane, simple cloud management layer so you can focus on your product. You pay a premium for the convenience — and that's a fair trade when you're getting started or want zero ops overhead.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;BYOC (Bring Your Own Cloud)&lt;/strong&gt; — When you want ownership and cost efficiency, bring your own servers. Cherry-pick your VPS provider, choose your architecture (amd64 or arm — yes, Graviton works), right-size your hardware for your workload. Kool installs and manages the entire stack on your servers — same deploy experience, same dashboard, same agent integration. You own the hardware, you control the costs, we provide the intelligence to manage it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With BYOC, the savings are real. You're not paying managed cloud margins on top of compute you could provision yourself for a fraction of the price. Pick Hetzner, DigitalOcean, AWS, or any provider you like. Run ARM instances where it makes sense. The infrastructure choices are yours — Kool just makes sure deploying to it stays simple.&lt;/p&gt;

&lt;p&gt;The transition is seamless. Same CLI. Same dashboard. Same deploy workflow. Same AI agent commands. The only thing that changes is where your containers run — and how much you pay for them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start by borrowing. Graduate to owning. No re-platforming required.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Ahead
&lt;/h2&gt;

&lt;p&gt;The learning curve argument that made Kool relevant in 2021 is stronger now than ever. Back then, Docker complexity was the bottleneck between an idea and a working local environment. Today, cloud deployment complexity is the bottleneck between AI-generated code and a live product.&lt;/p&gt;

&lt;p&gt;We're building toward a future where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deploying doesn't break your flow&lt;/strong&gt; — your AI agent handles it as part of the development cycle&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure choices don't lock you in&lt;/strong&gt; — borrow our cloud today, bring your own servers tomorrow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The cost of control stays low&lt;/strong&gt; — you stay in charge without becoming a DevOps expert&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kool started as a tool to make Docker suck less locally. It's becoming the platform that makes deploying suck less too — with AI agents as the interface and your choice of infrastructure underneath.&lt;/p&gt;

&lt;p&gt;We're just getting started on this new chapter. If you've been following Kool's journey since the early days, thank you — the best is ahead. If you're discovering us for the first time, there's never been a better moment to &lt;a href="https://kool.dev" rel="noopener noreferrer"&gt;give Kool a try&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Follow our journey:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://kool.dev/register" rel="noopener noreferrer"&gt;Try Kool Cloud&lt;/a&gt; — deploy your first app for free.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kool-dev/kool" rel="noopener noreferrer"&gt;Star us on GitHub&lt;/a&gt; — help us grow the community.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ai</category>
      <category>docker</category>
      <category>productivity</category>
      <category>tooling</category>
    </item>
    <item>
      <title>The Developer Role, Redefined</title>
      <dc:creator>Fabrício José Souza</dc:creator>
      <pubDate>Tue, 10 Mar 2026 02:27:56 +0000</pubDate>
      <link>https://dev.to/fabriciojs/the-developer-role-redefined-75f</link>
      <guid>https://dev.to/fabriciojs/the-developer-role-redefined-75f</guid>
      <description>&lt;p&gt;&lt;strong&gt;Developer = Product + Architect + QA.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is the role of a software engineer today around the new reality brought upon us by AI agents. And if that formula sounds reductive, stay with me — because I think it describes what great developers have always done, and what every developer now needs to do deliberately.&lt;/p&gt;

&lt;h2&gt;
  
  
  This isn't new — it's newly visible
&lt;/h2&gt;

&lt;p&gt;Developers have always worn these hats. You've always pushed back on requirements that didn't make sense. You've always made architectural calls — choosing a pattern, weighing a trade-off, deciding what to abstract and what to leave concrete. You've always been the last line of defense before code ships, testing the edges, catching what the specs missed.&lt;/p&gt;

&lt;p&gt;What varied was the mix. A developer with deep domain experience leaned heavier into product thinking. Someone on an infrastructure team lived in the architecture space. A developer on a small startup team with no QA department? They &lt;em&gt;became&lt;/em&gt; QA out of necessity. The distribution was always personal — shaped by the teams you worked with, the domains you lived in, your own preferences and strengths.&lt;/p&gt;

&lt;p&gt;But here's what made certain developers stand out, consistently: a good balance across all three. The ones who could challenge a requirement &lt;em&gt;and&lt;/em&gt; design a clean solution &lt;em&gt;and&lt;/em&gt; define what "done" actually meant. The ones who didn't just write code, but owned the outcome.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm0xl66ak39pq8pcqiu3y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm0xl66ak39pq8pcqiu3y.png" alt="Developer Role Redefined - Product+Architect+QA" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed
&lt;/h2&gt;

&lt;p&gt;AI agents now handle a growing share of the implementation itself. That's the shift everyone is talking about. But what it actually does is expose what was always true: the coding was never the whole job. It was just the most visible part. With that part increasingly assisted — or outright handled — by agents, what remains is the judgment layer. The product instinct, the architectural ownership, the quality mindset.&lt;/p&gt;

&lt;p&gt;And here's the thing most people miss: &lt;strong&gt;AI assists every phase, not just implementation.&lt;/strong&gt; Exploration, planning, code review, QA — agents can accelerate all of it. The developer who only uses AI to generate code is leaving most of the value on the table. The real leverage comes from knowing how to apply AI across the entire workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Developer Diamond
&lt;/h2&gt;

&lt;p&gt;A development workflow isn't a straight line — it breathes. Exploration opens things up. Planning closes them down. Reviewing the plan opens them up again through different lenses. Implementation narrows to focused execution. QA widens out during manual testing, then closes back down through automation. Code review does the same: opens to question decisions, closes to actionable findings.&lt;/p&gt;

&lt;p&gt;It's a series of diamonds — diverge, converge, diverge again — much like the Double Diamond from design thinking. And the key skill isn't mastering any single phase. &lt;strong&gt;It's knowing when to expand your view and when to close it down.&lt;/strong&gt; That rhythm — open up to explore, narrow down to decide, open up to validate, narrow down to ship — is what turns AI assistance into compounding gains instead of scattered experiments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa8tb1sql470tes76og45.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa8tb1sql470tes76og45.png" alt="The Developer Diamond Diverging+Convergin Rhythm" width="800" height="896"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The leadership question
&lt;/h2&gt;

&lt;p&gt;If the role demands product sense, architectural judgment, and quality thinking — and these were always part of the job, just unevenly developed — then team leaders have a clear mandate: help each person on your team grow in the areas where they're least versed.&lt;/p&gt;

&lt;p&gt;This is a personal journey conversation, which teams need to nurture. Not "learn a new framework" — but "where in the Product/Architect/QA triangle are you weakest, and how do we deliberately close that gap?" Some developers have strong product instincts but skip rigorous QA. Others architect beautifully but never challenge whether the feature should exist at all. The growth path is personal, and it's the leader's job to make it visible and intentional.&lt;/p&gt;

&lt;p&gt;Practically, this means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Identify&lt;/strong&gt; where each team member naturally gravitates and where they avoid.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create exposure&lt;/strong&gt; — pair a product-weak developer with a PM for a sprint, or have an architecture-light developer lead a design review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build team skills, not just team prompts.&lt;/strong&gt; If your prompt library only covers "generate code," you're optimizing the one part agents already handle well. The real leverage is in structured exploration, plan review through multiple lenses, acceptance criteria definition, architectural trade-off analysis.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The craft is migrating
&lt;/h2&gt;

&lt;p&gt;The developer who can orchestrate the full diamond — knowing when to open up and when to close down, when to hand off to an agent and when to apply their own judgment — that's the profile that compounds in value. The craft isn't disappearing. It's migrating. And the developers and teams who name it, map it, and practice it deliberately are the ones who'll thrive.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>ai</category>
      <category>developers</category>
      <category>agile</category>
    </item>
    <item>
      <title>Use Kool to run Multiple Docker Applications at the same time in your Local Development Environment</title>
      <dc:creator>Fabrício José Souza</dc:creator>
      <pubDate>Mon, 12 Jul 2021 14:30:29 +0000</pubDate>
      <link>https://dev.to/kooldev/use-kool-to-run-multiple-docker-applications-at-the-same-time-in-your-local-development-environment-5ec6</link>
      <guid>https://dev.to/kooldev/use-kool-to-run-multiple-docker-applications-at-the-same-time-in-your-local-development-environment-5ec6</guid>
      <description>&lt;p&gt;More and more, we find ourselves working with Docker containers in the context of microservice architectures comprising multiple, loosely-coupled applications and services, and/or projects made up of two or more distinct apps running side-by-side talking to each other via APIs. As developers who work on these types of projects know all too well, setting up your local development environment to run &lt;strong&gt;multiple&lt;/strong&gt; Docker applications &lt;strong&gt;at the same time&lt;/strong&gt; can be a real hassle. Developing each app &lt;strong&gt;on its own&lt;/strong&gt; is a breeze &lt;a href="https://blog.kool.dev/article/using-docker-for-local-development/"&gt;using Kool and Docker Compose&lt;/a&gt;. However, when you need to run multiple apps at the same time, configuring the routing and intercommunication between different containers can be challenging.&lt;/p&gt;

&lt;p&gt;In this tutorial, we'll show you how to set up your local environment to run more than one Docker application at the same time using Kool and a Caddy web server. No doubt, this is just one of several ways to solve for this use case, but we think it's an approach that works really well for most projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;p&gt;Before you start, if you haven't done so already, you need to &lt;a href="https://kool.dev/docs/getting-started/installation"&gt;install Docker and &lt;strong&gt;Kool CLI&lt;/strong&gt;&lt;/a&gt;. It also wouldn't hurt to quickly get up-to-speed with the &lt;a href="https://kool.dev/docs/commands/kool"&gt;Kool CLI commands&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/kool-dev/kool"&gt;&lt;code&gt;kool&lt;/code&gt;&lt;/a&gt; is a CLI tool that makes local development with Docker super easy. Kool CLI will level up your development workflow, and help you and your team improve the way you develop and deploy cloud native applications. Make sure you're always using the latest version by running &lt;code&gt;kool self-update&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  It always starts off simple
&lt;/h2&gt;

&lt;p&gt;You have a single application with its Docker Compose environment. Let's call it &lt;strong&gt;App 1&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/multiple-apps/app-1
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/multiple-apps/app-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create the two files we need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# App 1&lt;/span&gt;
&lt;span class="c1"&gt;# ~/multiple-apps/app-1/docker-compose.yml&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;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kooldev/php:8.0-nginx&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="s"&gt;80:80&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.:/app/public&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;# App 1
# ~/multiple-apps/app-1/index.php
&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Welcome to App 1!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With these two files, you can now get &lt;strong&gt;App 1&lt;/strong&gt; up and running using &lt;code&gt;kool start&lt;/code&gt;, and check the status of its service container using &lt;code&gt;kool status&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kool start
&lt;span class="go"&gt;Creating network "app-1_default" with the default driver
Creating app-1_app_1 ... done

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kool status
&lt;span class="go"&gt;+---------+---------+---------------------------------------------+---------------+
| SERVICE | RUNNING | PORTS                                       | STATE         |
+---------+---------+---------------------------------------------+---------------+
&lt;/span&gt;&lt;span class="gp"&gt;| app     | Running | 0.0.0.0:80-&amp;gt;&lt;/span&gt;80/tcp, :::80-&amp;gt;80/tcp, 9000/tcp | Up 4 seconds  |
&lt;span class="go"&gt;+---------+---------+---------------------------------------------+---------------+
[done] Fetching services status

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;curl localhost
&lt;span class="go"&gt;Welcome to App 1!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Awesome! Your &lt;code&gt;app&lt;/code&gt; service container is running, &lt;code&gt;kool status&lt;/code&gt; shows that port 80 is mapped from your host to the container, and &lt;code&gt;curl localhost&lt;/code&gt; successfully returns the output of &lt;strong&gt;App 1&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  But then it starts getting tricky
&lt;/h2&gt;

&lt;p&gt;As your project evolves over time, you need to add a second application called &lt;strong&gt;App 2&lt;/strong&gt;, which runs alongside &lt;strong&gt;App 1&lt;/strong&gt;. In other words, to work on the project, &lt;strong&gt;you need to run &lt;em&gt;both apps&lt;/em&gt; at the &lt;em&gt;same time&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let's quickly set up &lt;strong&gt;App 2&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/multiple-apps/app-2
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/multiple-apps/app-2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once again, let's create the two files we need (inside the &lt;code&gt;app-2&lt;/code&gt; directory):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# App 2&lt;/span&gt;
&lt;span class="c1"&gt;# ~/multiple-apps/app-2/docker-compose.yml&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;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kooldev/php:8.0-nginx&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="s"&gt;80:80&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.:/app/public&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;# App 2
# ~/multiple-apps/app-2/index.php
&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Welcome to App 2!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This time, when you try to get &lt;strong&gt;App 2&lt;/strong&gt; up and running (using &lt;code&gt;kool start&lt;/code&gt;), you run into a problem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kool start
&lt;span class="go"&gt;Creating network "app-2_default" with the default driver
Creating app-2_app_1 ...
Creating app-2_app_1 ... error

ERROR: for app-2_app_1  Cannot start service app: driver failed programming external connectivity on endpoint app-2_app_1 (24719704f55491122a18f051d3f1e789b6afc3f34ccf7bfe3d7eac510117ef42):
  Bind for 0.0.0.0:80 failed: port is already allocated

ERROR: for app  Cannot start service app: driver failed programming external connectivity on endpoint app-2_app_1 (24719704f55491122a18f051d3f1e789b6afc3f34ccf7bfe3d7eac510117ef42):
  Bind for 0.0.0.0:80 failed: port is already allocated
ERROR: Encountered errors while bringing up the project.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As per the error message, you have a port conflict (&lt;code&gt;Bind for 0.0.0.0:80 failed: port is already allocated&lt;/code&gt;). &lt;strong&gt;You cannot have two different containers bound to the same port on your host&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Before you continue, let's stop your &lt;strong&gt;App 2&lt;/strong&gt; and &lt;strong&gt;App 1&lt;/strong&gt; containers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/multiple-apps/app-2 &lt;span class="c"&gt;# you should already be here&lt;/span&gt;
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kool stop
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/multiple-apps/app-1
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kool stop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Not so fast!
&lt;/h2&gt;

&lt;p&gt;To fix this error, your first impulse is probably to use different ports for each service. For example, you can run &lt;strong&gt;App 1&lt;/strong&gt; on &lt;code&gt;localhost:8081&lt;/code&gt; and &lt;strong&gt;App 2&lt;/strong&gt; on &lt;code&gt;localhost:8082&lt;/code&gt;. However, you'll quickly realize this solution isn't viable because it's not flexible enough, and doesn't provide intercommunication between applications over a shared Docker network.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proxy to the rescue
&lt;/h2&gt;

&lt;p&gt;The proxy design pattern provides a much better solution for running multiple Docker applications at the same time in your local development environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add a global network to Docker Compose
&lt;/h3&gt;

&lt;p&gt;First, you need to improve the Docker Compose environments used by each of your apps. Using one of the many best practices built into the Docker configurations included with &lt;a href="https://kool.dev/docs/presets/introduction"&gt;&lt;strong&gt;Kool Presets&lt;/strong&gt;&lt;/a&gt;, let's create a &lt;a href="https://docs.docker.com/compose/compose-file/compose-file-v3/#networks"&gt;shared network between Docker containers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;By default, all containers in a &lt;strong&gt;docker-compose.yml&lt;/strong&gt; file will share the same virtual network. This means two different applications will not have a channel of communication. For this reason, Kool Presets will usually have &lt;strong&gt;two networks&lt;/strong&gt; for each container: &lt;code&gt;kool_local&lt;/code&gt; and &lt;code&gt;kool_global&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;kool_local&lt;/code&gt; is a local network that's only available to the group of containers from that &lt;strong&gt;docker-compose.yml&lt;/strong&gt; file. It's the same as the default network (if we didn't specify the network ourselves).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kool_global&lt;/code&gt; is a global network created outside the scope of any particular &lt;strong&gt;docker-compose.yml&lt;/strong&gt; file. It's available system-wide, and any containers running on the host can join it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's create an external &lt;code&gt;kool_global&lt;/code&gt; network inside each Docker Compose environment, and add each app to it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# App 1&lt;/span&gt;
&lt;span class="c1"&gt;# ~/multiple-apps/app-1/docker-compose.yml&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;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kooldev/php:8.0-nginx&lt;/span&gt;
    &lt;span class="na"&gt;expose&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.:/app/public&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;kool_global&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;aliases&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app-1&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;kool_global&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# App 2&lt;/span&gt;
&lt;span class="c1"&gt;# ~/multiple-apps/app-2/docker-compose.yml&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;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kooldev/php:8.0-nginx&lt;/span&gt;
    &lt;span class="na"&gt;expose&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.:/app/public&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;kool_global&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;aliases&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;app-2&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;kool_global&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice that we replaced the &lt;code&gt;ports&lt;/code&gt; configuration with &lt;code&gt;expose&lt;/code&gt;. You don't want these &lt;code&gt;app&lt;/code&gt; containers bound to the host anymore, in order to avoid a conflict. Instead, you want to bind a single container to the host, which proxies each request internally over the &lt;code&gt;kool_global&lt;/code&gt; network to the correct service container using its network &lt;code&gt;alias&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://docs.docker.com/compose/compose-file/compose-file-v3/#networks"&gt;&lt;code&gt;aliases&lt;/code&gt;&lt;/a&gt; key on the container network works like a &lt;strong&gt;domain name&lt;/strong&gt; that resolves to that container's address when used within the same network. This is a great way to normalize names for service containers that need to talk to each other.&lt;/p&gt;

&lt;h3&gt;
  
  
  Set up the proxy
&lt;/h3&gt;

&lt;p&gt;As mentioned earlier, we're going to use a &lt;a href="https://caddyserver.com/"&gt;Caddy web server&lt;/a&gt; as our reverse proxy. It's our first choice because it has a simple configuration interface and a rich feature set. &lt;a href="https://traefik.io/"&gt;Traefik&lt;/a&gt; or Nginx would work great too, so feel free to use what you like best when you implement this solution in a real project.&lt;/p&gt;

&lt;p&gt;Let's start by creating a &lt;a href="https://caddyserver.com/docs/caddyfile"&gt;&lt;code&gt;Caddyfile&lt;/code&gt;&lt;/a&gt; configuration file in a new &lt;code&gt;proxy&lt;/code&gt; directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; ~/multiple-apps/proxy
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/multiple-apps/proxy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# ~/multiple-apps/proxy/Caddyfile
&lt;/span&gt;{
  &lt;span class="n"&gt;auto_https&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;
}

&lt;span class="n"&gt;http&lt;/span&gt;://&lt;span class="n"&gt;a&lt;/span&gt;.&lt;span class="n"&gt;localhost&lt;/span&gt; {
  &lt;span class="n"&gt;reverse_proxy&lt;/span&gt; / &lt;span class="n"&gt;http&lt;/span&gt;://&lt;span class="n"&gt;app&lt;/span&gt;-&lt;span class="m"&gt;1&lt;/span&gt;
}

&lt;span class="n"&gt;http&lt;/span&gt;://&lt;span class="n"&gt;b&lt;/span&gt;.&lt;span class="n"&gt;localhost&lt;/span&gt; {
  &lt;span class="n"&gt;reverse_proxy&lt;/span&gt; / &lt;span class="n"&gt;http&lt;/span&gt;://&lt;span class="n"&gt;app&lt;/span&gt;-&lt;span class="m"&gt;2&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice that we use the &lt;code&gt;app-1&lt;/code&gt; and &lt;code&gt;app-2&lt;/code&gt; container network aliases to point to each destination, based on the incoming &lt;code&gt;Host&lt;/code&gt; request (&lt;code&gt;a.localhost&lt;/code&gt; vs. &lt;code&gt;b.localhost&lt;/code&gt;). You should also add these local domains to your &lt;code&gt;/etc/hosts&lt;/code&gt; file: &lt;code&gt;echo "127.0.0.1 a.localhost b.localhost" | sudo tee -a /etc/hosts&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;By default, Caddy tries to use &lt;code&gt;HTTPS&lt;/code&gt; for all hosts. For this tutorial, we're disabling it. We'll cover local TLS usage in a future article.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Next, let's create a new &lt;code&gt;docker-compose.yml&lt;/code&gt; for Caddy itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ~/multiple-apps/proxy/docker-compose.yml&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;proxy&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;caddy:2-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="s"&gt;80:80&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./Caddyfile:/etc/caddy/Caddyfile&lt;/span&gt;
    &lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;kool_global&lt;/span&gt;

&lt;span class="na"&gt;networks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;kool_global&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;external&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's it. You're done configuring your proxy.&lt;/p&gt;

&lt;p&gt;Now, all you need to do is spin up your &lt;strong&gt;App 1&lt;/strong&gt;, &lt;strong&gt;App 2&lt;/strong&gt; and &lt;strong&gt;Proxy&lt;/strong&gt; service containers (using &lt;code&gt;kool start&lt;/code&gt; of course), and verify it works by sending a couple of test requests.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Proxy
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/multiple-apps/proxy &lt;span class="c"&gt;# you should already be here&lt;/span&gt;
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kool start
&lt;span class="go"&gt;Creating proxy_proxy_1 ... done

&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;App 1
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/multiple-apps/app-1
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kool start
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;App 2
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/multiple-apps/app-2
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kool start
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Host: a.localhost"&lt;/span&gt; http://localhost
&lt;span class="go"&gt;Welcome to App 1!

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Host: b.localhost"&lt;/span&gt; http://localhost
&lt;span class="go"&gt;Welcome to App 2!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;W00t! You now have &lt;strong&gt;both apps up and running &lt;em&gt;at the same time&lt;/em&gt;&lt;/strong&gt;. You can access them using different host names, and they can also communicate with each other.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To clean up your local environment, you'll need to move into each directory (&lt;code&gt;app-1&lt;/code&gt;, &lt;code&gt;app-2&lt;/code&gt;, and &lt;code&gt;proxy&lt;/code&gt;) and run &lt;code&gt;kool stop&lt;/code&gt;, and then remove the directories you created: &lt;code&gt;rm -r ~/multiple-apps&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Next steps
&lt;/h2&gt;

&lt;p&gt;Kool's core team is already working on a new set of commands to make the above steps seamless and transparent, so you don't have to worry about the details. We invite you to &lt;a href="https://github.com/kool-dev/kool/discussions/328"&gt;join the discussion and contribute&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you like what we're doing, please show your support by &lt;a href="https://github.com/kool-dev/kool"&gt;&lt;strong&gt;starring us on GitHub&lt;/strong&gt;&lt;/a&gt;!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Support the Kool open source project
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/kool-dev/kool"&gt;Kool&lt;/a&gt; is open source and totally free to use. If you're interested in learning more about the project, please check out &lt;a href="https://kool.dev/"&gt;&lt;strong&gt;kool.dev&lt;/strong&gt;&lt;/a&gt;. If you have questions, need support, or want to get involved, please &lt;a href="https://kool.dev/slack"&gt;join our Slack channel&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>webdev</category>
      <category>devops</category>
      <category>microservices</category>
    </item>
    <item>
      <title>Use Kool to Dockerize Your Local Development Environment the Right Way</title>
      <dc:creator>Fabrício José Souza</dc:creator>
      <pubDate>Thu, 01 Jul 2021 20:04:20 +0000</pubDate>
      <link>https://dev.to/kooldev/use-kool-to-dockerize-your-local-development-environment-the-right-way-18gl</link>
      <guid>https://dev.to/kooldev/use-kool-to-dockerize-your-local-development-environment-the-right-way-18gl</guid>
      <description>&lt;p&gt;Using Docker containers in local development environments has become commonplace for web development. And yet, when you get down to it, using Docker locally is still a challenge, oftentimes resulting in a frustrating developer experience and plenty of headaches. So, what is &lt;strong&gt;the right way&lt;/strong&gt; to use containers for local development? We believe the answer is a new open source project called &lt;a href="https://github.com/kool-dev/kool" rel="noopener noreferrer"&gt;&lt;strong&gt;Kool&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/kool-dev/kool" rel="noopener noreferrer"&gt;&lt;strong&gt;Kool&lt;/strong&gt;&lt;/a&gt; helps you develop cloud native applications in a better and more efficient way by removing barriers and allowing developers and DevOps engineers to focus on what matters most.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Real-World Learning Curve
&lt;/h2&gt;

&lt;p&gt;In the past few years, Docker has taken the software development world by storm. Its powerful interface for building, deploying and running containers has led to its widespread adoption by teams and companies of all sizes. By containerizing your web applications, you can more easily work across different tech stacks, switch between different applications and microservices, and standardize and scale your environments. You no longer waste precious time debugging and fixing issues with version mismatches, concurrently running applications, dependency conflicts, poor resource control, etc.&lt;/p&gt;

&lt;p&gt;However, while Docker has a straightforward "getting started" experience, developing real-world applications on containers is a lot easier said than done. You quickly start climbing a steep learning curve when your requirements evolve and you're forced to master Docker's nuances, its more advanced configurations, and the working internals of its containers in order to apply its features to more complex environments.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For example, mastering when to use the &lt;code&gt;-t&lt;/code&gt; or &lt;code&gt;-T&lt;/code&gt; flags for &lt;code&gt;docker run&lt;/code&gt; and &lt;code&gt;docker exec&lt;/code&gt;, resolving issues with permissions on mapped volumes, and even deeper issues like having your Docker network suddenly lose external packages because it has a different MTU value than the underlying host network. If you've faced these issues before, I feel for you. If not, count yourself lucky!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While Docker provides teams with a lot of power, this power does not come cheap. As you climb the Docker learning curve, you often have no choice but to use trial and error to find acceptable solutions to problems you encounter along the way. Since Docker expertise can vary greatly across the team, it is common to find knowledge siloed with senior members of the team, and developers applying different solutions to the same problem. Additional hidden costs include senior engineers pulled away from their work to help others with technical issues, time spent reconciling conflicting opinions and workarounds, and the frustration of disrupted workflows causing low morale. Consequently, it becomes difficult for your project to sustain its high velocity, and stay on schedule and on budget.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Better Way with Kool
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Kool&lt;/strong&gt; (&lt;a href="https://github.com/kool-dev/kool" rel="noopener noreferrer"&gt;kool-dev/kool&lt;/a&gt;) offers a better way to use Docker locally. Kool provides a suite of open source tools that deliver a better developer experience (DX) and help you avoid the pitfalls described earlier by making sure you follow best practices and use Docker in a standardized way across your projects and teams. From local development environments running on Docker to staging and production environments running in the cloud on Kubernetes, Kool makes it easier to containerize your web apps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kool CLI
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;kool&lt;/code&gt; CLI provides a simple, intuitive interface for managing Docker and Docker Compose containers. It simplifies the way you use Docker in your local environment by removing the Docker "speed bumps" that slow you down, greatly reducing the learning curve and error-prone area, and helping teams leverage containers at a lower cost of entry.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Kool CLI comes with a &lt;a href="https://kool.dev/docs/getting-started/installation" rel="noopener noreferrer"&gt;single-line installer&lt;/a&gt;, a &lt;a href="https://kool.dev/docs/commands/kool-self-update" rel="noopener noreferrer"&gt;&lt;code&gt;self-update&lt;/code&gt; command&lt;/a&gt; to easily upgrade to new releases, an intuitive command interface with a complete &lt;a href="https://kool.dev/docs/commands/kool" rel="noopener noreferrer"&gt;command reference&lt;/a&gt;, and solid &lt;a href="https://kool.dev/docs/introduction" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;. By using the &lt;code&gt;kool&lt;/code&gt; CLI instead of &lt;code&gt;docker&lt;/code&gt; directly, you can stop learning new flags each day and stay focused on writing code!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Kool Presets
&lt;/h3&gt;

&lt;p&gt;Kool Presets provide pre-built development environments with sane defaults out of the box for quickly setting up projects using popular frameworks and tech stacks, such as Laravel, Symfony, Node.js, AdonisJs, Next.js (and more). Presets auto-generate a customized &lt;code&gt;docker-compose.yml&lt;/code&gt; file, as well as a &lt;code&gt;kool.yml&lt;/code&gt; configuration file in which you can easily store common single-line and multi-line scripts that you execute using the &lt;code&gt;kool run&lt;/code&gt; command. This helps keep your development workflow open and shared across the entire team. &lt;a href="https://kool.dev/docs/getting-started/how-it-works" rel="noopener noreferrer"&gt;Learn more about how it works&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kool Docker Images
&lt;/h3&gt;

&lt;p&gt;When you start developing in containers, you suddenly realize official Docker images are built for deployment, and are not well-suited for the special nuances of local development. One of the most common and recurring problems we see are permission issues with mapped volumes, due to host users being different from container users. Kool fixes this problem, and many others, by creating custom Docker images optimized for local development environments.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP Images (&lt;a href="https://github.com/kool-dev/docker-php" rel="noopener noreferrer"&gt;https://github.com/kool-dev/docker-php&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Nginx Images (&lt;a href="https://github.com/kool-dev/docker-nginx" rel="noopener noreferrer"&gt;https://github.com/kool-dev/docker-nginx&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Node Images (&lt;a href="https://github.com/kool-dev/docker-node" rel="noopener noreferrer"&gt;https://github.com/kool-dev/docker-node&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Java Images (&lt;a href="https://github.com/kool-dev/docker-java" rel="noopener noreferrer"&gt;https://github.com/kool-dev/docker-java&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;DevOps Images (&lt;a href="https://github.com/kool-dev/docker-toolkit" rel="noopener noreferrer"&gt;https://github.com/kool-dev/docker-toolkit&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A few of the optimizations included in Kool Docker images:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UID mapping to host user to solve permission issues&lt;/li&gt;
&lt;li&gt;Alpine base images to remain small and up-to-date&lt;/li&gt;
&lt;li&gt;Configured with sane defaults (for development as well as production)&lt;/li&gt;
&lt;li&gt;Environment variables to easily update the most common settings&lt;/li&gt;
&lt;li&gt;Battle-tested - we've been using these images in production for quite a long time now!&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;If you know what you're doing, you can use &lt;code&gt;kool&lt;/code&gt; with any Docker image. You are not required to use Kool-optimized images.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Kool Cloud (Coming Soon)
&lt;/h3&gt;

&lt;p&gt;Kool CLI integrates seamlessly with Kool Cloud. Based on the same Docker configuration you already use locally, you can very easily and quickly create staging environments in the cloud, straight from your local environment. Using a set of &lt;code&gt;kool deploy&lt;/code&gt; commands, you can push your local project repository to the Kool Cloud, where it's automatically deployed on containers running on a shared Kubernetes infrastructure. Your local environment and cloud environments have never been so close to each other!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Kool Cloud is currently being tested in a closed alpha, but will soon be opened as a public beta. If you would like early access, &lt;a href="https://kool.dev/register" rel="noopener noreferrer"&gt;please create a free account&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Flexible and Extensible
&lt;/h3&gt;

&lt;p&gt;If you know your way around Docker, you can use Kool and remain totally in charge of your Docker configuration. Kool guarantees no vendor lock-in and no loss of control, which means you can fully customize and extend your more specialized Docker environments. You'll never feel as if your hands are tied. On the contrary, using Kool will actually free your hands, and let you focus on more valuable work instead of spending time tweaking your development environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open Source
&lt;/h3&gt;

&lt;p&gt;Kool is &lt;a href="https://github.com/kool-dev/kool" rel="noopener noreferrer"&gt;open source&lt;/a&gt; and totally free to use. Feel free to &lt;a href="https://github.com/kool-dev/kool/blob/master/CONTRIBUTING.md" rel="noopener noreferrer"&gt;contribute&lt;/a&gt;, help us with testing, and/or &lt;a href="https://kool.dev/slack" rel="noopener noreferrer"&gt;suggest new ways&lt;/a&gt; to make Kool better.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you like what we're doing, show your support for this new open source project by &lt;a href="https://github.com/kool-dev/kool" rel="noopener noreferrer"&gt;&lt;strong&gt;starring us on GitHub&lt;/strong&gt;&lt;/a&gt;!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Battle-Tested
&lt;/h3&gt;

&lt;p&gt;Kool is sponsored and maintained by &lt;a href="https://fireworkweb.com" rel="noopener noreferrer"&gt;Firework Web&lt;/a&gt;, a software development agency located in Brazil. Over many years, having worked on hundreds of web projects with dozens of teams, Firework developed a ton of expertise using Docker and other development tools, and figured out the right way to set up and manage local Docker environments. Based on this experience, the Kool project was born. And now Firework is ready to share it with all of you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give It a Try
&lt;/h2&gt;

&lt;p&gt;Kool is a great new development tool that will help you use Docker containers in your local environment the right way. You'll get all the benefits of containerizing your web apps, without the hassles. If you haven't already, &lt;a href="https://kool.dev/docs/getting-started/starting-new-project" rel="noopener noreferrer"&gt;give Kool a try&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Not Using Docker for Development?
&lt;/h3&gt;

&lt;p&gt;If you're not yet using Docker in your development environment, here's a great post that gives you a number of reasons why you should make the switch.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;div class="ltag__link__content"&gt;
    &lt;div class="missing"&gt;
      &lt;h2&gt;Article No Longer Available&lt;/h2&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/kool-dev" rel="noopener noreferrer"&gt;
        kool-dev
      &lt;/a&gt; / &lt;a href="https://github.com/kool-dev/kool" rel="noopener noreferrer"&gt;
        kool
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      From local development to the cloud: web apps development with containers made easy.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://kool.dev" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2c9a131304755404c25d798a79d45732e52881150dd6b8ce7ccdf3043c061bce/68747470733a2f2f6b6f6f6c2e6465762f696d672f6c6f676f2e706e67" width="400" alt="kool - cloud native dev tool"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
&lt;a href="https://goreportcard.com/report/github.com/kool-dev/kool" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/41d1a6a1552a124ad859772350dca69e3f7a76608052b2724afb96ced4f1def9/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f6b6f6f6c2d6465762f6b6f6f6c" alt="Go Report Card"&gt;&lt;/a&gt;
&lt;a href="https://codecov.io/gh/kool-dev/kool" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/21e096501f8e71afebf9b32021095c59ef40e8e2e70128960e2dc65f5fdea8ee/68747470733a2f2f636f6465636f762e696f2f67682f6b6f6f6c2d6465762f6b6f6f6c2f6272616e63682f6d61696e2f67726170682f62616467652e737667" alt="codecov"&gt;&lt;/a&gt;
&lt;a href="https://github.com/kool-dev/kool/workflows/docker" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/kool-dev/kool/workflows/docker/badge.svg" alt="Docker Hub"&gt;&lt;/a&gt;
&lt;a href="https://github.com/kool-dev/kool/workflows/golangci-lint" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/kool-dev/kool/workflows/golangci-lint/badge.svg" alt="Golang CI Lint"&gt;&lt;/a&gt;
&lt;a href="https://codeclimate.com/github/kool-dev/kool/maintainability" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/734f5b6dd1cda2d34c0b7242f1e323282c3fb4d86af53c36f35dda3ae01692ff/68747470733a2f2f6170692e636f6465636c696d6174652e636f6d2f76312f6261646765732f31353131663832366465393264326162333963632f6d61696e7461696e6162696c697479" alt="Maintainability"&gt;&lt;/a&gt;
&lt;a href="https://kool.dev/slack" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/24c53943c966db565633b087e876c58b7f572a6b9df694d4295fa5c9f79636fb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4a6f696e253230536c61636b2d6b6f6f6c2d2d6465762d6f72616e67653f6c6f676f3d736c61636b" alt="Join Slack Kool community"&gt;&lt;/a&gt;
&lt;a href="https://github.com/sindresorhus/awesome" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8693bde04030b1670d5097703441005eba34240c32d1df1eb82a5f0d6716518e/68747470733a2f2f63646e2e7261776769742e636f6d2f73696e647265736f726875732f617765736f6d652f643733303566333864323966656437386661383536353265336136336531353464643865383832392f6d656469612f62616467652e737667" alt="Awesome"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;About &lt;code&gt;kool&lt;/code&gt;
&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Kool&lt;/strong&gt; is a CLI tool that brings the complexities of modern software development environments down to earth - making these environments lightweight, fast and reproducible. It reduces the complexity and learning curve of &lt;em&gt;Docker&lt;/em&gt; containers for local environments, and offers a simplified interface for using &lt;em&gt;Kubernetes&lt;/em&gt; to deploy staging and production environments to the cloud.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kool&lt;/strong&gt; gets your local development environment up and running easily and quickly, so you have more time to build a great application. When the time is right, you can then use Kool.dev Cloud to deploy and share your work with the world!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kool&lt;/strong&gt; is suitable for solo developers and teams of all sizes. It provides a hassle-free way to handle the Docker basics and immediately start using containers for development, while simultaneously guaranteeing no loss of control over more specialized Docker environments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kool.dev" rel="nofollow noopener noreferrer"&gt;Learn more at kool.dev&lt;/a&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Requirements: Kool is powered by…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/kool-dev/kool" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


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