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 \
  libapparmor-dev

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
make
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
./build_linux.sh
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
make
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
host:
  BuildahVersion: 1.9.2
  Conmon:
    package: Unknown
    path: /usr/local/bin/conmon
    version: 'conmon version 1.0.1-dev, commit: 8392df88fba944510b51c7d5b92aa745a15863f8'
  Distribution:
    distribution: debian
    version: "10"
  MemFree: 6179495936
  MemTotal: 8167223296
  OCIRuntime:
    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
registries:
  blocked: null
  insecure: null
  search:
  - docker.io
  - registry.fedoraproject.org
  - registry.access.redhat.com
store:
  ConfigFile: /etc/containers/storage.conf
  ContainerStore:
    number: 0
  GraphDriverName: overlay
  GraphOptions: null
  GraphRoot: /var/lib/containers/storage
  GraphStatus:
    Backing Filesystem: extfs
    Native Overlay Diff: "true"
    Supports d_type: "true"
    Using metacopy: "false"
  ImageStore:
    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
b7b28af77ffec6054d13378df4fdf02725830086c7444d9c278af25312aa39b9

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"
ID=alpine
VERSION_ID=3.10.1
PRETTY_NAME="Alpine Linux v3.10"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://bugs.alpinelinux.org/
/# exit

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

# podman rm -f `podman ps -aq`
d16db8f39c82f50f3a2bbf4834d948b660525a5c2b98979e433c3428f613c18d

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

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