Podman is a daemonless container engine for developing, managing, and running OCI Containers on your Linux System. It was created to replace Docker which requires a daemon running in the background. This guide will walk you through the installation of Podman on Debian 10 (Buster) and Debian 9 (Stretch) Linux machines.

Podman uses container runtimes as well for example runc but the launched containers are direct descendants of the podman process. It is part of the libpod library

Step 1: Update System

Update package index:

sudo apt -y update && sudo apt -y upgrade

Step 2: Install pre-requisites

In our installation, we will build the packages from source code. Install all dependencies required by running the next commands:

sudo apt -y install \
  gcc \
  make \
  cmake \
  git \
  btrfs-progs \
  golang-go \
  go-md2man \
  iptables \
  libassuan-dev \
  libc6-dev \
  libdevmapper-dev \
  libglib2.0-dev \
  libgpgme-dev \
  libgpg-error-dev \
  libostree-dev \
  libprotobuf-dev \
  libprotobuf-c-dev \
  libseccomp-dev \
  libselinux1-dev \
  libsystemd-dev \
  pkg-config \
  runc \
  uidmap \

Step 3: Install conmon

The latest version of conmon is expected to be installed on the system. Conmon is used to monitor OCI Runtimes.

git clone https://github.com/containers/conmon
cd conmon
sudo make podman
sudo cp /usr/local/libexec/podman/conmon  /usr/local/bin/

Step 4: Install CNI plugins

Run below commands to ensure CNI plugins are installed on the system.

git clone https://github.com/containernetworking/plugins.git $GOPATH/src/github.com/containernetworking/plugins
cd $GOPATH/src/github.com/containernetworking/plugins
sudo mkdir -p /usr/libexec/cni
sudo cp bin/* /usr/libexec/cni

Step 5: Setup CNI networking:

After installation of CNI commands, add configuration files.

sudo mkdir -p /etc/cni/net.d
curl -qsSL https://raw.githubusercontent.com/containers/libpod/master/cni/87-podman-bridge.conflist | sudo tee /etc/cni/net.d/99-loopback.conf

Step 6: Populate configuration files

We need to manually add configuration files such as ones for registry and policy.

sudo mkdir -p /etc/containers
sudo curl https://raw.githubusercontent.com/projectatomic/registries/master/registries.fedora -o /etc/containers/registries.conf
sudo curl https://raw.githubusercontent.com/containers/skopeo/master/default-policy.json -o /etc/containers/policy.json

Step 7: Install Podman

We can now download Podman source code from Github and build the binary application.

git clone https://github.com/containers/libpod/ $GOPATH/src/github.com/containers/libpod
cd $GOPATH/src/github.com/containers/libpod
sudo make install

Check podman version

$ podman version
Version:            1.4.5-dev
RemoteAPI Version:  1
Go Version:         go1.11.6
OS/Arch:            linux/amd64

You can display information pertaining to the host, current storage stats, and build of podman.

$ podman info
  BuildahVersion: 1.9.2
    package: Unknown
    path: /usr/local/bin/conmon
    version: 'conmon version 1.0.1-dev, commit: 8392df88fba944510b51c7d5b92aa745a15863f8'
    distribution: debian
    version: "10"
  MemFree: 6179495936
  MemTotal: 8167223296
    package: 'runc: /usr/sbin/runc'
    path: /usr/sbin/runc
    version: |-
      runc version 1.0.0~rc6+dfsg1
      commit: 1.0.0~rc6+dfsg1-3
      spec: 1.0.1
  SwapFree: 0
  SwapTotal: 0
  arch: amd64
  cpus: 2
  eventlogger: journald
  hostname: debian10
  kernel: 4.19.0-5-amd64
  os: linux
  rootless: false
  uptime: 13m 44.64s
  blocked: null
  insecure: null
  - docker.io
  - registry.fedoraproject.org
  - registry.access.redhat.com
  ConfigFile: /etc/containers/storage.conf
    number: 0
  GraphDriverName: overlay
  GraphOptions: null
  GraphRoot: /var/lib/containers/storage
    Backing Filesystem: extfs
    Native Overlay Diff: "true"
    Supports d_type: "true"
    Using metacopy: "false"
    number: 0
  RunRoot: /var/run/containers/storage
  VolumePath: /var/lib/containers/storage/volumes

Main configuration files:

  • /etc/containers/registries.conf – configuration file which specifies which container registries should be consulted when completing image names which do not include a registry or domain portion.
  • /etc/containers/mounts.conf – specify volume mount directories that are automatically mounted inside containers when executing the podman run or podman build commands

Test Podman installation on Debian

Pull Alpine docker image.

$ podman pull alpine
Trying to pull docker.io/library/alpine...
Getting image source signatures
Copying blob 050382585609 done
Copying config b7b28af77f done
Writing manifest to image destination
Storing signatures

Run docker container:

$ podman images
REPOSITORY                 TAG      IMAGE ID       CREATED       SIZE
docker.io/library/alpine   latest   b7b28af77ffe   3 weeks ago   5.85 MB

$ podman run -ti b7b28af77ffe /bin/sh
/ # cat /etc/os-release 
NAME="Alpine Linux"
PRETTY_NAME="Alpine Linux v3.10"
/# exit

Now that we have confirmed we can create a container, let’s remove it.

# podman rm -f `podman ps -aq`

There you go. Check more examples on Podman tutorial available in Github and our guide How To run Docker Containers using Podman and Libpod

Setup Private registry: Setup Docker Container Registry with Podman & Let’s Encrypt SSL

Related guides:

How To Install Podman on Arch Linux / Manjaro

How To Install Podman on CentOS 7 & Fedora 30/29/28

How to Install Podman on Ubuntu