動かざることバグの如し

近づきたいよ 君の理想に

UbuntuにnerdctlをインストールしてDockerコマンドっぽく使う

環境

  • Ubuntu 20.04
  • containerd v1.6.6

Dockerコマンドの代わりにnerdctlを使いたい

自宅サーバーにUbuntuを入れてKubernetesを構築しているのだが、現状Kubernetesとdocker-ceのパッケージの相性悪い。

いや、Kubernetesがすでにcontainerdに切り替えているのでDockerの影響を受けないはずなんだけど、 それでもdocker-ceを入れているとistio関連のデプロイに失敗する場合がある(これが余計に面倒

docker-ceを入れてVS-codeのリモートデバッグをしようと思っていたがここは諦めて いっそのこと既存のcontainerdを活用してnerdctlに乗り換えることにした

nerdctlとは

github.com

「Docker-compatible CLI for containerd」要はcontainerdをバックグラウンドにしてdockerコマンドっぽくコンテナの操作ができますよって感じ

インストール

nerdctl自体のインストールは一発 今回はv0.22.0を使用したが、containerd/nerdctlのReleaseから最新版のバージョンに差し替えて実行すること。

# curl -sSL https://github.com/containerd/nerdctl/releases/download/v0.22.0/nerdctl-full-0.22.0-linux-amd64.tar.gz | tar Cxzv /usr/local/

これだけでコンテナを起動できる 確認

# nerdctl run --rm -p 8000:80 nginx

が、これだとパフォーマンスに問題があったり、root以外で実行できないと諸問題があるので色々やってく

rootlessのインストール

rootじゃないと実行できないのは微妙なので、一般ユーザーでも使えるようにする

基本的には公式サイトのとおりに実行していけばおk

nerdctl/rootless.md at master · containerd/nerdctl

事前準備

# apt install uidmap

rootless本体のインストール

$ containerd-rootless-setuptool.sh install

エラーになったらslirp4netnsをインストールする

[rootlesskit:parent] error: exec: "slirp4netns": executable file not found in $PATH
[ERROR] RootlessKit failed, see the error messages and https://rootlesscontaine.rs/getting-started/common/ .

github.com

slirp4netnsのインストール

# curl -o /usr/local/bin/slirp4netns --fail -L https://github.com/rootless-containers/slirp4netns/releases/download/v1.2.0/slirp4netns-$(uname -m)
# chmod +x /usr/local/bin/slirp4netns

再度実行すると成功するはず

自動起動するようにする

thr3aは適宜

$ sudo loginctl enable-linger thr3a

BuildKitの有効化

デフォルトではBuildKitが使えないので使えるようにする

$ containerd-rootless-setuptool.sh install-buildkit
$ containerd-rootless-setuptool.sh install-buildkit-containerd

Stargz Snapshotterの有効化

イメージPullの高速化ができる「Stargz Snapshotter」というプラグインをインストールする

$ containerd-rootless-setuptool.sh install-stargz

~/.config/containerd/config.toml を新規作成して以下

[proxy_plugins]
  [proxy_plugins."stargz"]
      type = "snapshot"
# NOTE: replace "1000" with your actual UID
      address = "/run/user/1000/containerd-stargz-grpc/containerd-stargz-grpc.sock"

UIDは自分で調べて置き換えること

$ id -u thr3a
1000

containerdを再起動しないと反映されないので注意

$ systemctl --user restart containerd.service

確認

nerdctl run -it --rm ghcr.io/stargz-containers/alpine:3.10.2-esgz

インストールに失敗しているとpullに失敗するはず

FATA[0002] failed to stat snapshot sha256:9e0573c62127729a89b3e728371ebe4bd4a77996ea57c8f06bf8760bac3cf16d: snapshotter not loaded: stargz: invalid argument

普通のイメージに対しても nerdctl run --snapshotter=stargz xxxx をつけてpullすると高速になる。

または環境変数

export CONTAINERD_SNAPSHOTTER=stargz

をセットしておけばデフォルトで --snapshotter=stargz 相当になる

bypass4netns

rootlessを使うとネットワークのオーバーヘッドが大きくなってしまう問題がある。それをバイパスして解決してくれるのが「bypass4netns」

$ containerd-rootless-setuptool.sh install-bypass4netnsd

実行するときに --label nerdctl/bypass4netns=true をつける必要がある

$ nerdctl run -it --rm -p 8080:80 --label nerdctl/bypass4netns=true alpine

参考リンク