Ubuntuにrootlessな感じでcontainerdをインストールする

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

Ubuntuにrootlessな感じでcontainerdをインストールする

2024-2-19 | ,

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を併せてインストールする。

  1. ユーザーを作る。
    adduser containerd_user
  2. 作ったユーザーをsudoグループに参加させる。
    gpasswd -a containerd_user sudo
  3. systemd-containerをインストールする。
    apt install systemd-container
  4. 先程作ったcontainerd_userにユーザーを切り替える。
    machinectl shell containerd_user@

インストール編

containerdやルートレスに必要なパッケージをインストールする。

  1. 必要なパッケージをインストールする。
    sudo apt install containerd rootlesskit curl golang uidmap acl
  2. 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
  3. コンテナをビルドするための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
  4. buildkitにパスを通す。
    echo "export PATH=$PATH:/usr/local/buildkit/bin" >> $HOME/.bashrc &&\
    source $HOME/.bashrc
  5. コンテナのネットワーク接続を管理するための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
  6. ユーザーがcni-pluginsのディレクトリにアクセスできるよう権限を設定する。
    sudo setfacl -m u:$USER:rwx -R /etc/cni

ルートレス編

  1. ユーザーレベルの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
  2. 設定ファイルが読み込まれてるか確認する。
    cat /sys/fs/cgroup/user.slice/user-$(id -u).slice/user@$(id -u).service/cgroup.controllers

    コマンドを実行して下記のように出力されればOKだ!

    cpuset cpu io memory pids
  3. ルートレスなcontainerdをインストールするスクリプトを実行する。
    containerd-rootless-setuptool.sh install
  4. ルートレス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なりにインストールすれば楽だった説あり。

引用・参考文献

下記のページが参考になりました。ありがとうございました。