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を動かしてみました。いろんな部品をコンパイルしないといけないのでちょっと面倒ですね...