With Windows Subsystem for Linux (WSL) version 2, running Linux containers is possible and easy. However, Docker does not work without the docker daemon running, systemd is usually used to govern this, and WSL typically does not have systemd running.
Podman is a drop-in replacement for the docker commandline tool. It is "daemonless" (in other words, does not require systemd or other service to run in the background), and is backed by Redhat. Podman also works well without root—in other words, containers can easily run in userspace.
Note that it is possible to run the docker daemon without systemd and on pretty much any WSL distribution, even without Docker Desktop. I documented my working setup in a separate article. But I still favor podman for reasons noted in this article.
I use Fedora (you may read more about how I installed Fedora on WSL). In my setup, I needed some minor configuration in order for podman to work properly, and to run rootless. Here are the steps I used.
To install podman, follow the official instructions. Most likely, guidance for your distro should be included there.
A quick summary:
sudo dnf install podman
sudo yum --enablerepo=extras install podman
- Debian 11 (bullseye) or later, or sid/unstable:
sudo apt install podman
sudo pacman -S podmanand then tweaks for rootless
- Debian 10: see the guide for how to set up
aptto use the Kubic repos then make sure to run
sudo apt updatethen
sudo apt install podman
Without systemd, the $XDG_RUNTIME_DIR was not available for podman to use for temporary files. I added the following to my
if [[ -z "$XDG_RUNTIME_DIR" ]]; then export XDG_RUNTIME_DIR=/run/user/$UID if [[ ! -d "$XDG_RUNTIME_DIR" ]]; then export XDG_RUNTIME_DIR=/tmp/$USER-runtime if [[ ! -d "$XDG_RUNTIME_DIR" ]]; then mkdir -m 0700 "$XDG_RUNTIME_DIR" fi fi fi
This script checks if the $XDG_RUNTIME_DIR is set, and, if not, sets it to the default systemd location (
/run/user/$UID). If that does not exist, then set and create a temporary directory for the current user.
(Now source your .bashrc with
source ~/.bashrc to update environment variables.)
Do you have
~/.config/containers/containers.conf? If so, great. On Fedora, and possibly other distributions, you may first need to copy
~/.config/containers. Once the file exists, edit it, making sure that:
cgroup_manager = "cgroupfs"(not systemd)
events_logger = "file"(not journald)
log_driver = "k8s-file"(not journald)
On Fedora, I had to reinstall shadow-utils in order to have a properly installed
sudo dnf reinstall shadow-utils
The following should give you a simple command prompt:
$ podman run -it docker.io/library/alpine:latest Trying to pull docker.io/library/alpine:latest... Getting image source signatures Copying blob df20fa9351a1 done Copying config a24bb40132 done Writing manifest to image destination Storing signatures / #