podman-desktop/tutorial/getting-started-with-compose.html
github-actions[bot] 04415be00a deploy: 76e470edfd
2025-06-10 05:41:24 +00:00

151 lines
No EOL
49 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-tutorial docs-version-current docs-doc-page docs-doc-id-getting-started-with-compose" data-has-hydrated="false">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v3.7.0">
<title data-rh="true">Getting started with Compose | Podman Desktop</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://podman-desktop.io/img/banner_podman-desktop.png"><meta data-rh="true" name="twitter:image" content="https://podman-desktop.io/img/banner_podman-desktop.png"><meta data-rh="true" property="og:url" content="https://podman-desktop.io/tutorial/getting-started-with-compose"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-tutorial-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-tutorial-current"><meta data-rh="true" property="og:title" content="Getting started with Compose | Podman Desktop"><meta data-rh="true" name="description" content="Getting started with Compose on Podman Desktop"><meta data-rh="true" property="og:description" content="Getting started with Compose on Podman Desktop"><meta data-rh="true" name="keywords" content="podman-desktop,compose,containers,containerfile,docker-compose,dockerfile,multi-container"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://podman-desktop.io/tutorial/getting-started-with-compose"><link data-rh="true" rel="alternate" href="https://podman-desktop.io/tutorial/getting-started-with-compose" hreflang="en"><link data-rh="true" rel="alternate" href="https://podman-desktop.io/tutorial/getting-started-with-compose" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://MR01ANKQ9S-dsn.algolia.net" crossorigin="anonymous"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="Podman Desktop RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Podman Desktop Atom Feed">
<link rel="alternate" type="application/json" href="/blog/feed.json" title="Podman Desktop JSON Feed">
<link rel="search" type="application/opensearchdescription+xml" title="Podman Desktop" href="/opensearch.xml">
<link rel="preconnect" href="https://podman-desktop-website.goatcounter.com">
<script async src="//gc.zgo.at/count.js" data-goatcounter="https://podman-desktop-website.goatcounter.com/count"></script><link rel="stylesheet" href="/assets/css/styles.947b0603.css">
<script src="/assets/js/runtime~main.9613e0c7.js" defer="defer"></script>
<script src="/assets/js/main.15d92a85.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();null!==e?t(e):window.matchMedia("(prefers-color-scheme: dark)").matches?t("dark"):window.matchMedia("(prefers-color-scheme: light)").matches?t("light"):t("dark")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_oPtH" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/logo.svg" alt="Podman Desktop Logo" class="themedComponent_siVc themedComponent--light_hHel" height="56"><img src="/img/logo.svg" alt="Podman Desktop Logo" class="themedComponent_siVc themedComponent--dark_yETr" height="56"></div><b class="navbar__title text--truncate">podman desktop</b></a><a class="navbar__item navbar__link" href="/docs/intro">Documentation</a><a class="navbar__item navbar__link" href="/downloads">Downloads</a><a class="navbar__item navbar__link" href="/community">Community</a><div class="navbar__item dropdown dropdown--hoverable"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Resources</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/features">Features</a></li><li><a aria-current="page" class="dropdown__link dropdown__link--active" href="/tutorial">Tutorials</a></li><li><a class="dropdown__link" href="/extend">Extend</a></li></ul></div><a class="navbar__item navbar__link" href="/blog">Blog</a></div><div class="navbar__items navbar__items--right"><a href="https://github.com/podman-desktop/podman-desktop" target="_blank" id="github-stars-button" rel="noopener noreferrer" class="hidden lg:flex items-center gap-2 px-4 py-[9px] border border-black dark:border-white rounded-lg navbar__item navbar__link font-medium min-w-[9rem]"><svg aria-hidden="true" focusable="false" data-prefix="fab" data-icon="github" class="svg-inline--fa fa-github" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><path fill="currentColor" d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path></svg><span>Star</span></a><div><a class="hidden lg:flex font-semibold no-underline hover:no-underline items-center text-white hover:text-white bg-gradient-to-b from-violet-500 to-violet-600 border-0 py-3 px-6 focus:outline-hidden hover:from-violet-600 hover:to-violet-700 rounded-lg text-base mt-0 mb-0 ml-4 mr-2" href="/downloads">Download</a></div><div class="toggle_ki11 colorModeToggle_Hewu"><button class="clean-btn toggleButton_MMFG toggleButtonDisabled_Uw7m" type="button" disabled="" title="Switch between dark and light mode (currently dark mode)" aria-label="Switch between dark and light mode (currently dark mode)" aria-live="polite" aria-pressed="true"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_lgto"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_U96C"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="navbarSearchContainer_bzqh"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search (Command+K)"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_MB5r"><div class="docsWrapper__sE8"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_iEvu" type="button"></button><div class="docRoot_DfVB"><aside class="theme-doc-sidebar-container docSidebarContainer_c7NB"><div class="sidebarViewport_KYo0"><div class="sidebar_CUen"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_jmj1"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/tutorial">Introduction</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/tutorial/running-a-pod-using-a-container-docker-file">Running a pod using a container or docker file</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/tutorial/running-a-kubernetes-cluster">Running a Kubernetes cluster</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/tutorial/deploying-a-kubernetes-application">Deploying a Kubernetes application</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/tutorial/interacting-with-a-database-server">Interacting with a database server</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/tutorial/managing-your-application-resources">Managing your application resources</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/tutorial/running-an-ai-application">Running an AI application</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/tutorial/creating-an-extension">Creating an extension</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" href="/tutorial/getting-started-with-compose">Getting started with Compose</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/tutorial/testcontainers-with-podman">Testcontainers with Podman</a></li></ul></nav><button type="button" title="Collapse sidebar" aria-label="Collapse sidebar" class="button button--secondary button--outline collapseSidebarButton_oTwn"><svg width="20" height="20" aria-hidden="true" class="collapseSidebarButtonIcon_pMEX"><g fill="#7a7a7a"><path d="M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"></path><path d="M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"></path></g></svg></button></div></div></aside><main class="docMainContainer_a9sJ"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_Qr34"><div class="docItemContainer_tjFy"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_T5ub" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_sfvy"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">Getting started with Compose</span><meta itemprop="position" content="1"></li></ul></nav><div class="tocCollapsible_wXna theme-doc-toc-mobile tocMobile_Ojys"><button type="button" class="clean-btn tocCollapsibleButton_iI2p">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Getting started with Compose</h1></header>
<p><a href="https://www.compose-spec.io/" target="_blank" rel="noopener noreferrer">Compose is a specification</a> for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your applications services, networks, and volumes. This allows you to capture in a single file the entire configuration necessary to run a set of interconnected containers as an application. For example, if you have an application that requires a web server, a database, and a caching service, you can define these components and their relationships in your Compose file.</p>
<p>To use the Compose YAML, you can leverage a specification implementation, such as <a href="https://docs.podman.io/en/latest/markdown/podman-compose.1.html" target="_blank" rel="noopener noreferrer"><code>podman compose</code></a> and <a href="https://github.com/docker/compose" target="_blank" rel="noopener noreferrer"><code>docker compose</code></a>.</p>
<p>This tutorial covers the following end-to-end tasks required to use a multi-container Compose application within Podman Desktop:</p>
<ul>
<li><a href="/tutorial/getting-started-with-compose#download-and-run-the-example-application">Download and run the example application</a> using <code>podman compose up</code>.</li>
<li><a href="/tutorial/getting-started-with-compose#viewing-the-guestbook-application">View the guestbook web application</a>.</li>
<li><a href="/tutorial/getting-started-with-compose#viewing-and-modifying-the-database">View and modify the database</a> to check the guestbook web application is synchronized and running correctly.</li>
<li><a href="/tutorial/getting-started-with-compose#scaling-more-replicas">Scale database replicas</a>.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="before-you-begin">Before you begin<a href="#before-you-begin" class="hash-link" aria-label="Direct link to Before you begin" title="Direct link to Before you begin"></a></h2>
<p>If you do not have Compose installed, you can follow the complete onboarding process to install it system wide:</p>
<ol>
<li>
<p>Install the Compose extension from the catalog. For more details, see <a href="https://podman-desktop.io/docs/extensions/install" target="_blank" rel="noopener noreferrer">Installing a Podman Desktop extension</a>.</p>
</li>
<li>
<p>Set up Compose and complete the onboarding process to configure it system-wide.
<img decoding="async" loading="lazy" alt="Onboarding process" src="/assets/images/onboarding-59e0db2497389dec25a3b6bb8844a893.png" width="1496" height="1206" class="img_SS3x"></p>
</li>
<li>
<p>Check that you are able to run <code>podman compose</code>:</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">podman</span><span class="token plain"> compose</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Run compose workloads via an external provider such as </span><span class="token function" style="color:rgb(80, 250, 123)">docker-compose</span><span class="token plain"> or </span><span class="token function" style="color:rgb(80, 250, 123)">podman-compose</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Description:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> This </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">command</span><span class="token plain"> is a thin wrapper around an external compose provider such as </span><span class="token function" style="color:rgb(80, 250, 123)">docker-compose</span><span class="token plain"> or podman-compose. This means that </span><span class="token function" style="color:rgb(80, 250, 123)">podman</span><span class="token plain"> compose is executing another tool that implements the compose functionality but sets up the environment </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">in</span><span class="token plain"> a way to </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">let</span><span class="token plain"> the compose provider communicate transparently with the </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">local</span><span class="token plain"> Podman socket. The specified options as well the </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">command</span><span class="token plain"> and argument are passed directly to the compose provider.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">.</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
</ol>
<div class="theme-admonition theme-admonition-note admonition_WCGJ alert alert--secondary"><div class="admonitionHeading_GCBg"><span class="admonitionIcon_L39b"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_pbrs"><p>If Compose is already installed, you have the option to upgrade or downgrade its version by navigating to the <strong>Settings &gt; CLI Tools</strong> page.</p></div></div>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="download-and-run-the-example-application">Download and run the example application<a href="#download-and-run-the-example-application" class="hash-link" aria-label="Direct link to Download and run the example application" title="Direct link to Download and run the example application"></a></h2>
<p>Our example application is located at <a href="https://github.com/redhat-developer/podman-desktop-demo" target="_blank" rel="noopener noreferrer">github.com/redhat-developer/podman-desktop-demo</a>.</p>
<ol>
<li>
<p>Run <code>git clone</code> to build the Go binary web application:</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">git</span><span class="token plain"> clone https://github.com/redhat-developer/podman-desktop-demo</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">cd</span><span class="token plain"> podman-desktop-demo/guestbook-compose</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
<li>
<p>Run <code>podman compose up -d</code> to start the application:</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">podman</span><span class="token plain"> compose up </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token operator">&gt;&gt;</span><span class="token operator">&gt;&gt;</span><span class="token plain"> Executing external compose provider </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;/usr/local/bin/docker-compose&quot;</span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">.</span><span class="token plain"> Please refer to the documentation </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> details. </span><span class="token operator">&lt;&lt;&lt;</span><span class="token operator">&lt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">+</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> Running </span><span class="token number">3</span><span class="token plain">/3</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">✔ Container redis-replica Started </span><span class="token number">0</span><span class="token plain">.0s</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">✔ Container web Started </span><span class="token number">0</span><span class="token plain">.0s</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">✔ Container redis-leader Started </span><span class="token number">0</span><span class="token plain">.0s</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="viewing-the-guestbook-application">Viewing the guestbook application<a href="#viewing-the-guestbook-application" class="hash-link" aria-label="Direct link to Viewing the guestbook application" title="Direct link to Viewing the guestbook application"></a></h2>
<p>Within Podman Desktop, you can now see that all three containers are up and operational.</p>
<ol>
<li>
<p>Click the &quot;Open Browser&quot; button to view the web application:
<img decoding="async" loading="lazy" alt="Open browser" src="/assets/images/openbrowser-9dda9ceaa832418fc532135f5921ccf2.png" width="2850" height="828" class="img_SS3x"></p>
</li>
<li>
<p>Within the Guestbook web application, you can:</p>
<ul>
<li>
<p>&quot;Sign&quot; the guestbook, which will write to the Redis leader and synchronize to the replicas.</p>
</li>
<li>
<p>&quot;Read&quot; from the guestbook, which will read from the pool of Redis replicas. This allows for readability even if the Redis leader is unavailable.</p>
</li>
<li>
<p><code>/env</code>: View the container&#x27;s environment variables.</p>
</li>
<li>
<p><code>/info</code>: View information about the Redis cluster.</p>
<p><img decoding="async" loading="lazy" alt="Guestbook application" src="/assets/images/helloworld-516adc89ef8a509fb5ce998d3b0ea94b.png" width="949" height="653" class="img_SS3x"></p>
</li>
</ul>
</li>
</ol>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="viewing-and-modifying-the-database">Viewing and modifying the database<a href="#viewing-and-modifying-the-database" class="hash-link" aria-label="Direct link to Viewing and modifying the database" title="Direct link to Viewing and modifying the database"></a></h2>
<p>Using Podman Desktop, you can also access the container&#x27;s terminal directly from the GUI and modify the database.</p>
<ol>
<li>
<p>Click <strong>Open Terminal</strong> to access the <code>redis-leader</code> terminal:</p>
<p><img decoding="async" loading="lazy" alt="Open terminal" src="/assets/images/openterminal-32b76b2c26213e8cd4139cf9783b456c.png" width="2408" height="1070" class="img_SS3x"></p>
</li>
<li>
<p>Modify the database as if you are doing database administration:</p>
<ol>
<li>
<p>Run <code>redis-cli</code> within the container to access the Redis database.</p>
</li>
<li>
<p>Type <code>LPUSH guestbook &quot;Hello World!&quot;</code> and you will see your web application update in real-time.</p>
</li>
<li>
<p>Type <code>DEL guestbook</code> and you will see that your database drops the <code>guestbook</code> key and clears the database.</p>
<p><img decoding="async" loading="lazy" alt="Redis CLI" src="/assets/images/redis-cli-45bdb3866b5813d2cc9009e5474f0117.png" width="1652" height="534" class="img_SS3x"></p>
<p>Changes will reflect in real-time on the guestbook.</p>
</li>
</ol>
</li>
</ol>
<p>You can further modify the database and see the changes propagate to the Redis replicas. For example, view the logs of the <code>redis-replica</code>, and you will notice that there are periodic database synchronizations as well as reads to the database:</p>
<p><img decoding="async" loading="lazy" alt="Redis replica logs" src="/assets/images/redisreplica-c911ec791d20083c803f63c6d86f4b70.png" width="1680" height="1148" class="img_SS3x"></p>
<h3 class="anchor anchorWithStickyNavbar_JmGV" id="how-does-it-work">How does it work?<a href="#how-does-it-work" class="hash-link" aria-label="Direct link to How does it work?" title="Direct link to How does it work?"></a></h3>
<p>A quick overview of how the architecture works in this multi-container scenario:</p>
<ul>
<li>Within the Guestbook application, it looks for a database with the names <code>redis-leader</code> and <code>redis-replica</code> on port <code>6379</code>.</li>
<li>Because it is a Compose application, the containers are connected on the same network. This means that a neighboring container can be network-accessible simply by its container name.</li>
</ul>
<p>There is a set of environment variables that the web application can modify in the Compose application:</p>
<ul>
<li><code>REDIS_LEADER</code>: The default is <code>redis-leader</code>.</li>
<li><code>REDIS_REPLICAS</code>: The default is <code>redis-replica</code>. It can be comma-separated, such as <code>redis-replica-1,redis-replica-2</code>.</li>
<li><code>REDIS_PORT</code>: The default is <code>6379</code>.</li>
<li><code>SERVER_PORT</code>: The default is <code>8080</code>.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_JmGV" id="scaling-more-replicas">Scaling more replicas<a href="#scaling-more-replicas" class="hash-link" aria-label="Direct link to Scaling more replicas" title="Direct link to Scaling more replicas"></a></h2>
<p>Want to scale more replicas? This can be achieved by adding an environment variable to your <code>compose.yaml</code> and duplicating your <code>redis-replica</code> entry.</p>
<ol>
<li>
<p>Modify your <code>compose.yaml</code> as follows:</p>
<div class="language-yaml codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-yaml codeBlock_RMoD thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">services</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">redis-leader</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> redis</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">leader</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> redis</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&#x27;6379&#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">redis-replica</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> redis</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">replica</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> redis</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&#x27;6379&#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> redis</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">server </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">replicaof redis</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">leader 6379</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">redis-replica-2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> redis</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">replica</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token number">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> redis</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&#x27;6379&#x27;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">command</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> redis</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">server </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">replicaof redis</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">leader 6379</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">web</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">container_name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> web</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">build</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> ./web</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token key atrule">ports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">&#x27;8080:8080&#x27;</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
<li>
<p>Run <code>podman compose up -d</code> again to ensure the new container has been added and the new environment variable has propagated:</p>
<div class="language-sh codeBlockContainer_mQmQ theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_D5yF"><pre tabindex="0" class="prism-code language-sh codeBlock_RMoD thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_AclH"><span class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">podman</span><span class="token plain"> compose up </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-d</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token operator">&gt;&gt;</span><span class="token operator">&gt;&gt;</span><span class="token plain"> Executing external compose provider </span><span class="token string" style="color:rgb(255, 121, 198)">&quot;/usr/local/bin/docker-compose&quot;</span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">.</span><span class="token plain"> Please refer to the documentation </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">for</span><span class="token plain"> details. </span><span class="token operator">&lt;&lt;&lt;</span><span class="token operator">&lt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">+</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> Running </span><span class="token number">4</span><span class="token plain">/4</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">✔ Container redis-replica-2 Started </span><span class="token number">0</span><span class="token plain">.0s</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">✔ Container redis-leader Running </span><span class="token number">0</span><span class="token plain">.0s</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">✔ Container web Started </span><span class="token number">0</span><span class="token plain">.0s</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">✔ Container redis-replica Running </span><span class="token number">0</span><span class="token plain">.0s</span><br></span></code></pre><div class="buttonGroup_aaMX"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_z5j7" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_FoOz"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_L0B6"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
</li>
</ol></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-tags-row"><div class="col"><b>Tags:</b><ul class="tags_Ow0B padding--none margin-left--sm"><li class="tag_DFxh"><a class="tag_otG2 tagRegular_s0E1" href="/tutorial/tags/podman-desktop">podman-desktop</a></li><li class="tag_DFxh"><a class="tag_otG2 tagRegular_s0E1" href="/tutorial/tags/working-with-compose">working-with-compose</a></li></ul></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/tutorial/creating-an-extension"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Creating an extension</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/tutorial/testcontainers-with-podman"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Testcontainers with Podman</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_XG6w thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#before-you-begin" class="table-of-contents__link toc-highlight">Before you begin</a></li><li><a href="#download-and-run-the-example-application" class="table-of-contents__link toc-highlight">Download and run the example application</a></li><li><a href="#viewing-the-guestbook-application" class="table-of-contents__link toc-highlight">Viewing the guestbook application</a></li><li><a href="#viewing-and-modifying-the-database" class="table-of-contents__link toc-highlight">Viewing and modifying the database</a><ul><li><a href="#how-does-it-work" class="table-of-contents__link toc-highlight">How does it work?</a></li></ul></li><li><a href="#scaling-more-replicas" class="table-of-contents__link toc-highlight">Scaling more replicas</a></li></ul></div></div></div></div></main></div></div></div><footer class="footer"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Documentation</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/installation">Installing Podman Desktop</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/migrating-from-docker">Migrating from Docker</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/kubernetes">Working with Kubernetes</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/troubleshooting">Troubleshooting</a></li></ul></div><div class="col footer__col"><div class="footer__title">Links</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/podman-desktop/podman-desktop" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPrP"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://discord.com/invite/x5GzFF6QH4" target="_blank" rel="noopener noreferrer" class="footer__link-item">Chat (bridged): #podman-desktop on Discord<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPrP"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/podman-desktop/podman-desktop#communication" target="_blank" rel="noopener noreferrer" class="footer__link-item">Other ways to Communicate<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPrP"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/orgs/podman-desktop/projects/4/views/3" target="_blank" rel="noopener noreferrer" class="footer__link-item">Current Sprint<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPrP"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">
<div class="flex flex-col items-start text-left gap-4">
<div class="w-96 mt-8 mb-8">
<img class="dark:hidden" alt="Cloud Native Computing Foundation" src="/img/cncf-logo.svg">
<img class="hidden dark:inline" alt="Cloud Native Computing Foundation" src="/img/cncf-logo-dark.svg">
</div>
<div class="text-sm">
<p class="mb-1">We are a <a href="https://cncf.io/" class="underline">Cloud Native Computing Foundation</a> sandbox project.</p>
<p class="mb-1">© Copyright Podman Desktop Contributors 2025. © 2025 The Linux Foundation. All rights reserved.</p>
<p class="mb-1">The Linux Foundation has registered trademarks and uses trademarks.
For a list of trademarks of The Linux Foundation, please see our
<a href="https://www.linuxfoundation.org/trademark-usage/" class="underline"> Trademark Usage</a> page.</p>
</div>
</div>
</div></div></div></footer></div>
</body>
</html>