Migration Project

Apply everything you’ve learned by migrating a Docker-based application to Podman, including Compose conversion, systemd integration, and rootless configuration.

By Kevin McAleer,    5 Minutes

Page last updated May 24, 2025


Cover


It’s time to put your knowledge into practice! In this hands-on project, you’ll migrate a simple Docker-based application to Podman, step by step.

You’ll see how to:

  • Convert a Docker Compose setup to Podman
  • Use podman-compose or pods directly
  • Add systemd integration
  • Run everything rootlessly

🎯 Project Goals

By the end of this project, you will have:

  • Replaced docker commands with podman
  • Converted a docker-compose.yml to podman-compose
  • Created a rootless pod
  • Generated a systemd service to manage your container

📁 Step 1: Clone the Sample App

git clone https://github.com/kevinmcaleer/docker-migration-demo.git
cd docker-migration-demo

This app contains:

  • docker-compose.yml
  • A simple web app (Node.js or Flask)
  • A Redis backend

🔁 Step 2: Run with Podman Compose

Install podman-compose if you haven’t already:

pip3 install podman-compose

Then run:

podman-compose up

Inspect the generated pod:

podman pod ps

Check logs:

podman logs <container-id>

🛠 Step 3: Migrate to Native Podman Commands (Optional)

Create a pod manually:

podman pod create --name myapp -p 8080:80

Start your containers inside the pod:

podman run -dt --pod myapp --name redis redis
podman run -dt --pod myapp --name webapp myapp-image

⚙️ Step 4: Add Systemd Integration

Generate a systemd unit file:

podman generate systemd --name webapp --files --restart-policy=always

Move it into place:

mkdir -p ~/.config/systemd/user
mv container-webapp.service ~/.config/systemd/user/
systemctl --user daemon-reexec
systemctl --user enable --now container-webapp.service

Repeat for other services as needed.


🔐 Step 5: Verify Rootless Configuration

Ensure no root privileges are required:

whoami
podman ps

You should see your containers running under your user.


✅ Project Complete

You’ve now fully migrated a Docker-based app to Podman:

  • ✅ Replaced Docker CLI
  • ✅ Used podman-compose or pods
  • ✅ Enabled rootless containerization
  • ✅ Integrated with systemd for background service management

🚀 Challenge

Try deploying another project with:

  • Kubernetes YAML (via generate kube)
  • A more complex docker-compose.yml
  • Additional features like volume mounts, secrets, or health checks

Next up: Wrap-up and Future Outlook



Let me know when you're ready for the final lesson!

Here is Lesson 12 of your course:


📄 12_migration_project.md

---
title: Migration Project
description: Apply everything you’ve learned by migrating a Docker-based application to Podman, including Compose conversion, systemd integration, and rootless configuration.
layout: lesson
type: page
cover: assets/podman-cover.jpg
date_updated: 2025-05-24
---

![Cover](assets/podman-cover.jpg){:class="cover"}

---

It’s time to put your knowledge into practice! In this hands-on project, you’ll migrate a simple Docker-based application to Podman, step by step.

You’ll see how to:

- Convert a Docker Compose setup to Podman
- Use `podman-compose` or pods directly
- Add systemd integration
- Run everything rootlessly

---

## 🎯 Project Goals

By the end of this project, you will have:

- Replaced `docker` commands with `podman`
- Converted a `docker-compose.yml` to `podman-compose`
- Created a rootless pod
- Generated a systemd service to manage your container

---

## 📁 Step 1: Clone the Sample App

```bash
git clone https://github.com/example/docker-migration-demo.git
cd docker-migration-demo

This app contains:

  • docker-compose.yml
  • A simple web app (Node.js or Flask)
  • A Redis backend

🔁 Step 2: Run with Podman Compose

Install podman-compose if you haven’t already:

pip3 install podman-compose

Then run:

podman-compose up

Inspect the generated pod:

podman pod ps

Check logs:

podman logs <container-id>

🛠 Step 3: Migrate to Native Podman Commands (Optional)

Create a pod manually:

podman pod create --name myapp -p 8080:80

Start your containers inside the pod:

podman run -dt --pod myapp --name redis redis
podman run -dt --pod myapp --name webapp myapp-image

⚙️ Step 4: Add Systemd Integration

Generate a systemd unit file:

podman generate systemd --name webapp --files --restart-policy=always

Move it into place:

mkdir -p ~/.config/systemd/user
mv container-webapp.service ~/.config/systemd/user/
systemctl --user daemon-reexec
systemctl --user enable --now container-webapp.service

Repeat for other services as needed.


🔐 Step 5: Verify Rootless Configuration

Ensure no root privileges are required:

whoami
podman ps

You should see your containers running under your user.


✅ Project Complete

You’ve now fully migrated a Docker-based app to Podman:

  • ✅ Replaced Docker CLI
  • ✅ Used podman-compose or pods
  • ✅ Enabled rootless containerization
  • ✅ Integrated with systemd for background service management

🚀 Challenge

Try deploying another project with:

  • Kubernetes YAML (via generate kube)
  • A more complex docker-compose.yml
  • Additional features like volume mounts, secrets, or health checks

Next up: Wrap-up and Future Outlook


< Previous Next >

You can use the arrows  ← → on your keyboard to navigate between lessons.