Ubuntuにrootlessな感じでcontainerdをインストールする
Ubuntuにcontainerdをインストールしたい!
概要
今回の記事では、Ubuntuにcontainerdをrootlessな感じでインストールする手順を掲載する。
コンテナを使った開発環境の構築やデプロイができるようになりたく、コンテナを使える環境をVM環境のUbuntuの中に作ってみる。
コンテナについて私は全く詳しくないんだけども、コンテナといえばDockerというくらいの名前は聞いたことがあった程度。そのDocker一択の時代があって2024年2月現在はDocker以外の選択肢も多くある状況。Docker Desktopのライセンス体系が変わったとかでDocker以外のコンテナ環境に移行するケースが多いみたい。Docker、コンテナ関連の情報については下記の記事が勉強になりました。ありがとうございました。
最初はcri-oをUbuntuにインストールしようとしたが断念。残念。cri-o自体のインストールはなんとか出来たんだけども、その後のpodmanのインストールで依存関係が解決できず。
仕様書
環境
- Ubuntu 22.04.2 LTS
- containerd 1.7.2-0ubuntu1~22.04.1
- nerdctl v1.7.4
- buildkit v0.13.0
手順書
「ユーザー作成編」「インストール編」「ルートレス編」の3部構成です。
ユーザー作成編
ルートレスな感じにするのでcontainerdを実行するユーザーを作る必要がある。今回は安直にcontainerd_user
という名前のユーザーを作った。
rootからsu
で作ったユーザーに切り替えると一部の環境変数が使えず、ルートレスでつまずく。なので、machinectl
コマンドを使ってユーザーを変更する必要がある。machinectl
コマンドが含まれるsystemd-container
を併せてインストールする。
- ユーザーを作る。
adduser containerd_user
- 作ったユーザーを
sudo
グループに参加させる。gpasswd -a containerd_user sudo
systemd-container
をインストールする。apt install systemd-container
- 先程作った
containerd_user
にユーザーを切り替える。machinectl shell containerd_user@
インストール編
containerd
やルートレスに必要なパッケージをインストールする。
- 必要なパッケージをインストールする。
sudo apt install containerd rootlesskit curl golang uidmap acl
- containerdでdockerのコマンドを使えるnerdctlをインストールする。
githubでインストールするnerdctlのバージョンを確認する。下記はv1.7.4
をインストールする例。curl -OL https://github.com/containerd/nerdctl/releases/download/v1.7.4/nerdctl-1.7.4-linux-amd64.tar.gz &&\ sudo tar -C /usr/local/bin -xzf nerdctl-1.7.4-linux-amd64.tar.gz &&\ rm -rf nerdctl-1.7.4-linux-amd64.tar.gz
- コンテナをビルドするためのbuildkitをインストールする。
githubでインストールするbuildkitのバージョンを確認する。下記はv0.13.0
をインストールする例。curl -OL https://github.com/moby/buildkit/releases/download/v0.13.0/buildkit-v0.13.0.linux-amd64.tar.gz &&\ sudo mkdir /usr/local/buildkit && \ sudo tar -C /usr/local/buildkit -xzf buildkit-v0.13.0.linux-amd64.tar.gz &&\ rm -rf buildkit-v0.13.0.linux-amd64.tar.gz
- buildkitにパスを通す。
echo "export PATH=$PATH:/usr/local/buildkit/bin" >> $HOME/.bashrc &&\ source $HOME/.bashrc
- コンテナのネットワーク接続を管理するためのcni-pluginsをインストールする。
githubでインストールするcni-pluginsのバージョンを確認する。下記はv0.13.0
をインストールする例。curl -OL https://github.com/containernetworking/plugins/releases/download/v1.4.1/cni-plugins-linux-amd64-v1.4.1.tgz && \ sudo mkdir -p /opt/cni/bin && \ sudo tar -C /opt/cni/bin -xzf cni-plugins-linux-amd64-v1.4.1.tgz && \ rm -rf cni-plugins-linux-amd64-v1.4.1.tgz
- ユーザーがcni-pluginsのディレクトリにアクセスできるよう権限を設定する。
sudo setfacl -m u:$USER:rwx -R /etc/cni
ルートレス編
- ユーザーレベルの
systemd
サービスでCPU等のリソースを管理できるよう設定ファイルを作る。sudo mkdir -p /etc/systemd/system/user@.service.d cat <<EOF | sudo tee /etc/systemd/system/user@.service.d/delegate.conf [Service] Delegate=cpu cpuset io memory pids EOF sudo systemctl daemon-reload
- 設定ファイルが読み込まれてるか確認する。
cat /sys/fs/cgroup/user.slice/user-$(id -u).slice/user@$(id -u).service/cgroup.controllers
コマンドを実行して下記のように出力されればOKだ!
cpuset cpu io memory pids
- ルートレスな
containerd
をインストールするスクリプトを実行する。containerd-rootless-setuptool.sh install
ルートレス
なbuildkit
をインストールするスクリプトを実行する。containerd-rootless-setuptool.sh install-buildkit
以上でUbuntuにルートレスなcontainerdと関連するパッケージがインストールされた。(はず)
試しにnerdctl
を実行するとヘルプが表示される。下記は出力の一部を抜粋したもの。
$ nerdctl
nerdctl is a command line interface for containerd
Config file ($NERDCTL_TOML): /home/containerd_user/.config/nerdctl/nerdctl.toml
Usage: nerdctl [flags]
Management commands:
apparmor Manage AppArmor profiles
builder Manage builds
container Manage containers
image Manage images
ipfs Distributing images on IPFS
namespace Manage containerd namespaces
network Manage networks
system Manage containerd
volume Manage volumes
Commands:
...
まとめ(感想文)
普通にインストールするだけでもかなり面倒だった。後日、この環境でコンテナのビルドを試す予定。
コンテナを試したいだけなら黙ってRancher DesktopをWindowsなりにインストールすれば楽だった説あり。
引用・参考文献
下記のページが参考になりました。ありがとうございました。