Amazon Linux 2023でPodmanを動かす

Red Hatの織です。本記事はAWS Containers Advent Calendar 2023の12/15のエントリーです。

内容としてはAmazon Linux 2023でPodmanを動かしてみました、という話です(AWSのコンテナ関連サービスを使ってなくて申し訳ありません...)。一言でまとめると、現状いろいろパッケージが足りないため、頑張ってコンパイルしていくhard wayな感じです。男らしくmainブランチのHEADをごりごりとビルドしていきます。

いろいろコンパイル

rpmがあるものについてはそれを活用します。

sudo dnf install -y git golang runc cni-plugins gpgme-devel

作業ディレクトリを作成しておきます。

mkdir work
cd work

最低限必要なソースコードをgit cloneします。

git clone https://github.com/containers/podman.git
git clone https://github.com/containers/conmon.git
git clone https://gitlab.freedesktop.org/slirp/libslirp.git
git clone https://github.com/rootless-containers/slirp4netns.git

conmon

Podman(およびCRI-O)のコンテナモニター (コンテナプロセスのsubreaperとして動きます、containerdにおけるshim+αに相当します) であるconmonをコンパイルします。

cd conmon
sudo dnf install -y \
  gcc \
  git \
  glib2-devel \
  glibc-devel \
  libseccomp-devel \
  make \
  pkgconfig \
  runc
make
sudo make install
cd ..

slirp4netns

rootless実行するときのユーザーランドネットワーキングで使用するslirp4netnsをコンパイルします...が、その前提となるlibslirpをまず作ります。

cd libslirp
sudo dnf install -y meson ninja-build
meson build
ninja -C build
sudo ninja -C build install
cd ..

次にslirp4netnsをビルドします。

cd slirp4netns
sudo dnf -y install autoconf automake libcap-devel
./autogen.sh
LDFLAGS='-Wl,-R/usr/local/lib64' ./configure
make
sudo make install
cd ..

podman

本題のpodmanをビルドします。

cd podman
make
sudo make install
cd ..

最低限の設定ファイルを作っておきます。

sudo mkdir /etc/containers
cat <<END | sudo tee /etc/containers/policy.json
{
    "default": [
        {
            "type": "insecureAcceptAnything"
        }
    ]
}
END

動作確認

まずはHello Podman Worldしてみましょう。

[ec2-user@ip-10-0-1-189 ~]$ podman run quay.io/podman/hello
Trying to pull quay.io/podman/hello:latest...
Getting image source signatures
Copying blob d08b40be6878 done   |
Copying config e2b3db5d4f done   |
Writing manifest to image destination
!... Hello Podman World ...!

         .--"--.
       / -     - \
      / (O)   (O) \
   ~~~| -=(,Y,)=- |
    .---. /`  \   |~~
 ~/  o  o \~~~~.----. ~~
  | =(X)= |~  / (O (O) \
   ~~~~~~~  ~| =(Y_)=-  |
  ~~~~    ~~~|   U      |~~

Project:   https://github.com/containers/podman
Website:   https://podman.io
Documents: https://docs.podman.io
Twitter:   @Podman_io

いい感じですね。次はNginxを起動します。

[ec2-user@ip-10-0-1-189 ~]$ podman run -d -p 8080:80 docker.io/library/nginx
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob 84b1ff10387b done   |
Copying blob 1f7ce2fa46ab done   |
Copying blob 9ea27b074f71 done   |
Copying blob 9b16c94bb686 done   |
Copying blob c6edf33e2524 done   |
Copying blob 9a59d19f9c5b done   |
Copying blob 517357831967 done   |
Copying config a6bd71f48f done   |
Writing manifest to image destination
3c1cb97dd6d3525383db7202c455817e3a635ae21e5205aa6fdfad1e528fd8ea

さらにNginx Podにアクセスしてみます。

[ec2-user@ip-10-0-1-189 ~]$ curl -q -s -o /dev/null -w '%{http_code}\n' http://localhost:8080
200

rootlessコンテナへのネットワークアクセスも問題なさそうです。

おまけ

最近のPodmanは、OCIランタイムとしてcrunを、ネットワークプラグインとしてnetavarkを使うことが多いです。これらもビルドして使ってみます。

crun

git clone https://github.com/containers/crun.git
cd crun
sudo dnf install -y make python git gcc automake autoconf libcap-devel     systemd-devel yajl-devel libseccomp-devel pkg-config libgcrypt-devel     go-md2man glibc-static python3-libmount libtool golang-github-cpuguy83-md2man
./autogen.sh
./configure
make -j
sudo make install
cd ..

netavark

git clone https://github.com/containers/netavark.git
cd netavark
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source "$HOME/.cargo/env"
sudo dnf install protobuf-devel protobuf-c-devel
make
sudo make install
cd ..

aardvark

git clone https://github.com/containers/aardvark-dns.git
cd aardvark-dns
make
sudo make install
cd ..

動作確認

まず、以前の設定(CNIプラグインで実行していたコンテナ等)をクリアしておきます。

podman system reset

今のバージョンだと、crunとnetavarkがあればデフォルトでそちらを使うようになっていますので、これで準備は完了です。 念のため以下のコマンドで確認しておきます。

$ podman info -f json | jq -r '.host.ociRuntime.path, .host.networkBackendInfo.path'
/usr/local/bin/crun
/usr/local/libexec/podman/netavark

あとは上でやったのと同じようにPodを起動してみましょう (結果は省略)。

最後に

Amazon Linux 2023でPodmanを動かしてみました。いろんな部品をコンパイルしないといけないのでちょっと面倒ですね...

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。