DockerからPodmanへ切り替えてみたく、Ubuntu 22.04と24.04でのインストールとcomposeを試した

DockerからPodmanへ切り替えてみたく、Ubuntu 22.04と24.04でのインストールとcomposeを試した
Page content

Podmanっておいしい?

ソフトウェアの開発作業を容易くし、また実行環境を構築しやすくしてくれるコンテナ技術。コンテナを実行するエンジンの定番と言えばDockerですが、Podmanというものの存在も知りました。Podmanは「Red Hat® エンジニアとオープンソース・コミュニティ」によって開発されているOSSです。

Podman が他のコンテナエンジンと異なるのは、デーモンを使用しないという点です。つまり、コンテナを実行するのに、root 権限を持つプロセスを必要としません。

私は、これまで使ってきたDocker (最近はrootless mode) とこのPodmanとの、権限に関する上記の基本思想の違いに興味惹かれました。Podmanのセキュア度合いについては、次のスライドにも詳しく説明されています。

そこで今回は、自分の趣味の範囲で使うコンテナエンジンをDockerからPodmanへ切り替えることができるのか、実験して確認してみます。実験の内容は、「docker compose向けに用意した次の拙作リポジトリを、podmanでcompose upすることができるか」です。

実験は、仮想マシンを使って次の3つのパターンでやってみました。最初に結論を言いますとすべて成功です。各実験パターンの記述は、それぞれの環境におけるPodmanインストール方法の紹介にもなっています。

  • 実験1: Ubuntu 24.04 LTSと標準のPodman (v4.9.3)
  • 実験2: Ubuntu 22.04 LTSと標準のPodman (v3.4.4)
  • 実験3: Ubuntu 22.04 LTSとopenSUSE提供のPodman (v4.6.2)

なお、podmanのサブコマンドとしてcomposeが使えるようになったのは、Running Compose files | Podman Desktop > Prerequisites によると「4.7.0以上」です。したがって、バージョン的にpodman composeできない実験ではpodman-composeを使っています。

実験について

実験1: Ubuntu 24.04 LTSと標準のPodman (v4.9.3) → 成功

項目内容
OSUbuntu Desktop 24.04 LTS (x86_64)
## パッケージの最新化と必要分をインストールする
$ sudo apt update ; sudo apt upgrade ; sudo apt dist-upgrade
$ sudo apt install vim git

## OS・環境を確認する
$ cat /etc/os-release | grep VERSION= ; uname -r -p
VERSION="24.04 LTS (Noble Numbat)"
6.8.0-40-generic x86_64

## インストールできるpodmanのバージョンを確認する
$ apt-cache show podman | grep Version
Version: 4.9.3+ds1-1ubuntu0.1
Version: 4.9.3+ds1-1build2

## podman関係をインストールする
$ sudo apt install podman podman-compose

## インストールしたpodmanとpodman-composeのバージョンを確認する
$ podman version
Client:       Podman Engine
Version:      4.9.3
API Version:  4.9.3
Go Version:   go1.22.2
Built:        Thu Jan  1 09:00:00 1970
OS/Arch:      linux/amd64
$ podman-compose version
podman-compose version: 1.0.6
['podman', '--version', '']
using podman version: 4.9.3
podman-compose version 1.0.6
podman --version
podman version 4.9.3
exit code: 0

## podmanに必要なregistries.confを用意する
$ mkdir -p ~/.config/containers/
$ vim ~/.config/containers/registries.conf
$ cat ~/.config/containers/registries.conf
unqualified-search-registries = ["docker.io"]
short-name-mode = "permissive"

## 実験用のリポジトリをcloneしてcompose upを実行する
$ mkdir -p ~/tmp/ ; cd ~/tmp/
$ git clone https://github.com/mah-jp/sphinx-docker_gen-html-pdf
$ cd sphinx-docker_gen-html-pdf
$ podman compose up # ここはpodman compose
(途中省略)
[sphinx-custom] | The HTML pages are in _build/html.
exit code: 0

## Sphinxでの生成物を確認する → 成功
$ ls -al docs/_build/html/index.html
-rw-r--r-- 1 user user 14456 Aug  8 23:51 docs/_build/html/index.html
$ ls -al docs/_build/latex/project_name.pdf
-rw-r--r-- 1 user user 300715 Aug  8 23:51 docs/_build/latex/project_name.pdf

実験2: Ubuntu 22.04 LTSと標準のPodman (v3.4.4) → 成功

項目内容
OSUbuntu Desktop 22.04.4 LTS (x86_64)
## パッケージの最新化と必要分をインストールする
$ sudo apt update ; sudo apt upgrade ; sudo apt dist-upgrade
$ sudo apt install vim git curl

## OS・環境を確認する
$ cat /etc/os-release | grep VERSION= ; uname -r -p
VERSION="22.04.4 LTS (Jammy Jellyfish)"
6.5.0-45-generic x86_64

## インストールできるpodmanのバージョンを確認する
$ apt-cache show podman | grep Version
Version: 3.4.4+ds1-1ubuntu1.22.04.2
Version: 3.4.4+ds1-1ubuntu1

## podman関係をインストールする
$ sudo apt install podman python3-pip # podman-composeはpackageとしては無いので
$ pip install podman-compose # pipでpodman-composeをインストール
$ export PATH="$HOME/.local/bin:$PATH"
$ which podman-compose
/home/user/.local/bin/podman-compose

## インストールしたpodmanとpodman-composeのバージョンを確認する
$ podman version
Version:      3.4.4
API Version:  3.4.4
Go Version:   go1.18.1
Built:        Thu Jan  1 09:00:00 1970
OS/Arch:      linux/amd64
$ podman-compose version
podman-compose version 1.2.0
podman version 3.4.4

## podmanに必要なregistries.confを用意する
$ mkdir -p ~/.config/containers/
$ vim ~/.config/containers/registries.conf
$ cat ~/.config/containers/registries.conf
unqualified-search-registries = ["docker.io"]
short-name-mode = "permissive"

## 「WARN[0000] Error validating CNI config file ...」の事前回避
## Ref: https://qiita.com/kolinz/items/6ccde7ffa87bdd4f0a6f
$ curl -O http://archive.ubuntu.com/ubuntu/pool/universe/g/golang-github-containernetworking-plugins/containernetworking-plugins_1.1.1+ds1-3build1_amd64.deb
$ sudo dpkg -i containernetworking-plugins_1.1.1+ds1-3build1_amd64.deb

## 実験用のリポジトリをcloneしてcompose upを実行する
$ mkdir -p ~/tmp/ && cd ~/tmp/
$ git clone https://github.com/mah-jp/sphinx-docker_gen-html-pdf
$ cd sphinx-docker_gen-html-pdf
$ podman-compose up # ここはpodman-compose
(途中省略)
[sphinx-custom] | The HTML pages are in _build/html.

## Sphinxでの生成物を確認する → 成功
$ ls -al docs/_build/html/index.html
-rw-r--r-- 1 user user 14456  8月  9 00:04 docs/_build/html/index.html
$ ls -al docs/_build/latex/project_name.pdf
-rw-r--r-- 1 user user 300809  8月  9 00:04 docs/_build/latex/project_name.pdf

実験3: Ubuntu 22.04 LTSとopenSUSE提供のPodman (v4.6.2) → 成功

項目内容
OSUbuntu Desktop 22.04.4 LTS (x86_64)

ここでのインストール方法は、Twitter (現X) で提供いただいた次の情報を元に進めました。

下記のステップの「podmanをインストールする」部分では、openSUSE提供のdebを一個ずつダウンロードせずに、リポジトリをまるごと登録しているところが手数を省くポイントです。

## パッケージの最新化と必要分をインストールする
$ sudo apt update ; sudo apt upgrade ; sudo apt dist-upgrade
$ sudo apt install vim git curl

## OS・環境を確認する
$ cat /etc/os-release | grep VERSION= ; uname -r -p
VERSION="22.04.4 LTS (Jammy Jellyfish)"
6.5.0-45-generic x86_64

## podmanをインストールする
## Ref: https://zenn.dev/dozo/articles/0ced3feae9ac63#podman%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
## Ref: https://learn.microsoft.com/ja-jp/troubleshoot/azure/virtual-machines/linux/apt-common-issues-in-ubuntu
$ source /etc/os-release
$ echo deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/unstable/x${NAME}_${VERSION_ID}/ / | sudo tee -a /etc/apt/sources.list.d/devel:kubic:libcontainers:unstable.list
$ curl -fsSL https://download.opensuse.org/repositories/devel:kubic:libcontainers:unstable/x${NAME}_${VERSION_ID}/Release.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/devel_kubic_libcontainers_unstable.gpg > /dev/null
$ sudo apt update && sudo apt -y install podman

## podman-composeをインストールする
$ sudo apt install python3-pip # podman-composeはpackageとしては無いので
$ pip install podman-compose # pipでpodman-composeをインストール
$ export PATH="$HOME/.local/bin:$PATH"
$ which podman-compose
/home/user/.local/bin/podman-compose

## インストールしたpodmanとpodman-composeのバージョンを確認する
$ podman version
Client:       Podman Engine
Version:      4.6.2
API Version:  4.6.2
Go Version:   go1.18.1
Built:        Thu Jan  1 09:00:00 1970
OS/Arch:      linux/amd64
$ podman-compose version
podman-compose version 1.2.0
podman version 4.6.2

## podmanに必要なregistries.confを用意する
$ mkdir -p ~/.config/containers/
$ vim ~/.config/containers/registries.conf
$ cat ~/.config/containers/registries.conf
unqualified-search-registries = ["docker.io"]
short-name-mode = "permissive"

## 実験用のリポジトリをcloneしてcompose upを実行する
$ mkdir -p ~/tmp/ ; cd ~/tmp/
$ git clone https://github.com/mah-jp/sphinx-docker_gen-html-pdf
$ cd sphinx-docker_gen-html-pdf
$ podman-compose up # ここはpodman-compose
(途中省略)
[sphinx-custom] | The HTML pages are in _build/html.

## Sphinxでの生成物を確認する → 成功
$ ls -al docs/_build/html/index.html
-rw-r--r-- 1 user user 14456  8月  9 00:35 docs/_build/html/index.html
$ ls -al docs/_build/latex/project_name.pdf
-rw-r--r-- 1 user user 300808  8月  9 00:35 docs/_build/latex/project_name.pdf

追記 [2024-10-14]: 「Error validating CNI config file」エラーの対処方法

上記とは別のUbuntu 22.04環境でpodmanを導入して実行した際、WARN[0000] Error validating CNI config file ... というエラーが発生しました。このエラーは「containernetworking-plugins」というパッケージを導入することで解消できました。

実験後の感想

今回、Podmanを試してみて分かったことの一つは、Podmanのインストールは、Dockerのrootless modeの場合よりもかなり楽だと言うこと。シンプルな構成で運用できるという点は、私にとってコンテナエンジンをDockerからPodmanへ切り替える大きな理由になります。

また、Podmanの本格利用に向けて、あと少々試したいことは次の2つです。

  1. macOSのbrewでpodmanをインストールし、実行してみること
  2. 各環境でのPodman Desktopも使ってみること

そしてこれらでも特に問題が無ければ、私は自分のデスクトップ環境での組み合わせを、Docker+Rancher Desktopから、Podman+Podman Desktopへ、躊躇なく切り替えることでしょう。