Ink

Contents related to tech, hobby, etc

Windows WSL2上にcontainerdとnerdctlをインストールする

|

Windows WSL2上にcontainerdとnerdctlをインストールする

別段Docker for Windowsでも良いが、良い機会なので新しいものを試してみることとした。 nerdctlはWindowsではまだexperimentalであるため、今回はWSL2上で使用することとする。

WSL2のセットアップ

インストール

これは簡単。Windows Terminalをおもむろに開き、

wsl --install -d ubuntu

でインストールする。本当はnixOS or archlinuxにしたい所だが、まぁ今回は これを常用するわけではないので一番楽そうなubuntuにしておく。インストー ルが終わったら再起動する。

Systemdを有効化する

containerdはsystemdを利用するため、そのセットアップをしてあげる必要がある。 デフォルトでは無効化されているが、learn.microsoft.comのドキュメントの 通りにするとすぐに有効化出来る。具体的には、WLS2環境から /etc/wsl.conf に以下を書き込んでWSL2を再起動すれば良い。

[boot]
systemd=true

WSL2の再起動は、powershell等から wsl --shutdown で落として wsl で 起動しなおすことで行える。

nerdctlのインストール

apt等では配付されておらず、パッケージマネージャーとしてはlinuxbrewが唯 一の選択肢となる。しかし、 ちょっとインストーラー読むのが面倒だったので これのためだけにパッケージマネージャーを増やすのが少し嫌だったため、バ イナリを持ってくることにした。又この際、イメージのビルド等も行えるよう にしたかったので nerdctl-full のtarファイルを持ってきている。

$ wget https://github.com/containerd/nerdctl/releases/download/v1.2.1/nerdctl-full-1.2.1-linux-amd64.tar.gz
$ tar zxf nerdctl-full-1.2.1-linux-amd64.tar.gz
$ sudo mv bin/* /usr/local/bin
$ sudo mv lib/* /usr/local/lib
$ sudo mv libexec /usr/local/libexec
$ sudo mv share/* /usr/local/share

newuidmapのインストール

nerdctlはコンテナをrootlessで実行することが出来る。そのためには rootlesskitというソフトウェアが必要になる。それを走らせるために newuidmap というツールが必要になるので、インストールする。

$ sudo apt install uidmap

rootlessで起動する

これもまぁそのままドキュメントの指示に従う

$ containerd-rootless-setuptool.sh install

buildkitをインストールする

最初は気付かなかったが、どうやら nerdctl build . とかしようとすると buildkitのインストールが必要となるらしい(インストールされているとばか り思っていたが、上記のではダメらしい)。

(一度 nerdctl build . して怒られた)

そこで、言われた通りにコマンドを実行しておく

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

トラブルシューティング

イメージをpullしようとするとタイムアウトする

どうやら既知の問題らしい。containerd/nerdctl #677のコメントにあるように、 containerd-rootless-setuptool.sh nsenter bash でrootlesskitの名前空 間に入った後、 /etc/resolv.conf のnameserverを8.8.8.8にしたら疎通す るようになった。

CGroup v2の対応方法

containerdをrootlessで使っている場合、一部の機能が制限されてしまう。 それを避けたい場合CGroup v2に対応する必要があるが、公式で示されている 方法はgrubの設定を書き換える必要があり、Grubが使用されていないWSL2環境 では行うことが出来ない。そこで、.wslconfigを設定してあげる必要がある。

Rootlessにするべきなのか否か?

まぁ基本的にはRoot権限を用いない方が良いというのはそうなのだが、ならば デフォルトでそう設定されているはず。デフォルトでRootを必要とするという ことは、何らかしらのトレードオフが存在していると考えて良い。ということ で、Rootlessにする場合のメリット・デメリットをすこし軽く調べてみた

[補足] Containerdのインストール

今回はnerdctlと共に導入したのでこれは結局アンインストールしたが、 containerdのみをインストールするのも先にやっていたのでメモとして残して おく。

containerdはaptで配付されているが、独自のレポジトリを追加してあげる必 要がある。これはcontainerdプロジェクトではなくdockerからの提供となって いるので注意。ということで、Dockerのドキュメントにある手順を元にして Dockerに関する部分を省きつつインストールする。具体的には、大体はそのま まだが apt-get で一部分のみをインストールすることにする。 ちなみにこれで足りているのかはわからん。

- sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
+ sudo apt-get install containerd.io