Skip to main content

DDEV 1.25.0 Podman and Docker Rootless: What Actually Changes

· 4 min read
Victor Jimenez
Software Engineer & AI Agent Builder

DDEV 1.25.0 ships experimental support for Podman and Docker rootless. This opens up corporate-friendly runtimes, but introduces trade-offs that the announcement does not emphasize enough.

I built a CLI that audits your global_config.yaml so you know before you flip the switch.

The Claim

"DDEV 1.25.0 adds experimental support for both Podman and Docker rootless."

— DDEV Blog, Podman and Docker Rootless

Context

"Experimental" means what it says. DDEV is being transparent about the maturity level here, which I respect. But teams need to understand the specific configuration requirements before committing to Podman or rootless Docker in shared environments.

What Actually Changes

SettingRequired ValueWhy
Router HTTP port8080Podman on macOS cannot bind to port 80
Router HTTPS port8443Podman on macOS cannot bind to port 443
Global config location$HOME/.ddev or XDG pathStandard DDEV config path
$HOME/.ddev/global_config.yaml
router_http_port: "8080"
router_https_port: "8443"

The Real Trade-offs

FeatureStandard DockerPodman (macOS)Docker Rootless
Port 80/443 bindingYesNo — needs 8080/8443Yes (with caveats)
Bind mountsYesYesNo — requires no-bind-mounts
Corporate policy friendlyDependsYesYes
Config changes requiredNonePort overridesMount mode change
MaturityStableExperimentalExperimental
Reality Check

If your team shares DDEV config via repo-committed .ddev/config.yaml, switching to Podman or rootless Docker means everyone on the team needs matching global config. One developer with default ports and another with 8080/8443 will produce different environments. Coordinate before switching.

What I Built

A CLI that audits global_config.yaml and flags missing settings for Podman or Docker rootless, with a focused checklist for macOS Podman users.

View Code

Full macOS Podman checklist
  1. Install Podman via Homebrew or official package
  2. Ensure global_config.yaml sets router_http_port: "8080"
  3. Ensure global_config.yaml sets router_https_port: "8443"
  4. Verify Podman machine is running (podman machine start)
  5. Run ddev start and confirm routing works on new ports
  6. Update team documentation with new port numbers
  7. Check browser bookmarks and proxy configs for port changes

What I Learned

  • DDEV 1.25.0 adds experimental support for both Podman and Docker rootless.
  • Podman on macOS cannot bind to ports 80/443, so DDEV needs router ports set to 8080/8443.
  • Docker rootless cannot use bind mounts, so no-bind-mounts mode is required.
  • DDEV global configuration lives in global_config.yaml, and the config can live under $HOME/.ddev or an XDG location.
  • The biggest risk is not the runtime change itself. It is team coordination around shared config.

Why this matters for Drupal and WordPress

DDEV is the most widely used local development environment for both Drupal and WordPress projects. Podman and Docker rootless support matters for agencies and enterprise teams whose corporate policies prohibit Docker Desktop or require rootless containers. Drupal and WordPress developers sharing .ddev/config.yaml via git need to coordinate runtime choices across the team — one developer on Podman with port 8080 and another on standard Docker with port 80 will produce inconsistent local environments.

References


Looking for an Architect who doesn't just write code, but builds the AI systems that multiply your team's output? View my enterprise CMS case studies at victorjimenezdev.github.io or connect with me on LinkedIn.