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