見出し画像

nerdctl: containerd の Docker 互換 CLI

これは、nerdctlの概要について(Readme)の日本語訳です。オリジナルのマニュアルは、Apache-2.0ライセンスで公開されております。オリジナルのドキュメントには、こちらからアクセスできます。https://github.com/containerd/nerdctl/blob/main/README.md


nerdctl は、containerd 向けの Docker 互換の CLI です。

✅ dockerと同じUI/UXを提供します

✅ Docker Compose (nerdctl compose up) をサポート

✅ [オプション] ルートレスモードをサポートし、slirpオーバーヘッド(bypass4netns)がありません

✅ [オプションで]遅延プルをサポート(StargzNydusOverlayBD)

✅ [オプション:] 暗号化されたイメージ(ocicrypt)をサポート

✅ [オプション] P2P image distribution (IPFS) (*1)をッサポート

✅ [オプション]: コンテナー イメージの署名と検証 (cosign) をサポートします

nerdctl は containerd の非コアサブプロジェクトです。

*1: P2P image distribution (IPFS) is completely optional. IPFSデーモンのインストールと実行をオプトインしない限り、ホストはどのP2Pネットワークにも接続されていません。

基本的な使い方

デフォルトのブリッジCNIネットワーク(10.4.0.0/24)でコンテナを実行するには:

# nerdctl run -it --rm alpine

BuildKit を使用してイメージをビルドするには、次のようにします。

# nerdctl build -t foo /some-dockerfile-directory
# nerdctl run -it --rm foo

BuildKit を使用してビルドし、出力をローカルディレクトリに送信するには、次のようにします。

# nerdctl build -o type=local,dest=. /some-dockerfile-directory

docker-compose.yaml からコンテナーを実行するには、次のようにします。

# nerdctl compose -f ./examples/compose-wordpress/docker-compose.yaml up

./examples/compose-wordpress も参照してください。

Kubernetes のデバッグ

ローカルのKubernetesコンテナを一覧表示するには、次のようにします。

# nerdctl --namespace k8s.io ps -a

レジストリを使用せずにローカルKubernetesのイメージをビルドするには、次のようにします。

# nerdctl --namespace k8s.io build -t foo /some-dockerfile-directory
# kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: foo
spec:
  containers:
    - name: foo
      image: foo
      imagePullPolicy: Never
EOF

イメージ・アーカイブ(docker save形式またはOCI形式)をローカルKubernetesにロードするには:

# nerdctl --namespace k8s.io load < /path/to/image.tar

ログを読み取るには (実験的):

# nerdctl --namespace=k8s.io ps -a
CONTAINER ID    IMAGE                                                      COMMAND                   CREATED          STATUS    PORTS    NAMES
...
e8793b8cca8b    registry.k8s.io/coredns/coredns:v1.9.3                     "/coredns -conf /etc…"    2 minutes ago    Up                 k8s://kube-system/coredns-787d4945fb-mfx6b/coredns
...

# nerdctl --namespace=k8s.io logs -f e8793b8cca8b
[INFO] plugin/reload: Running configuration SHA512 = 591cf328cccc12bc490481273e738df59329c62c0b729d94e8b61db9961c2fa5f046dd37f1cf888b953814040d180f52594972691cd6ff41be96639138a43908
CoreDNS-1.9.3
linux/amd64, go1.18.2, 45b0a11
...


ルートレスモード

rootless containerd を起動するには、次のようにします。

$ containerd-rootless-setuptool.sh install

rootless containerd でコンテナを実行するには、次のようにします。

$ nerdctl run -d -p 8080:80 --name nginx nginx:alpine

rootless.md を参照してください。

インストール

バイナリは以下から入手できます。 https://github.com/containerd/nerdctl/releases

containerd に加えて、次のコンポーネントをインストールする必要があります。

  • CNIプラグイン:nerdctl runを使用します。

  • v1.1.0以降を強くお勧めします。古いバージョンでは、ブリッジネットワークを分離するために追加のCNI分離プラグインが必要です(nerdctl network create)。

  • BuildKit (オプション): nerdctl build を使用します。BuildKit デーモン (buildkitd) が実行されている必要があります。BuildKit の設定に関するドキュメントも参照してください。

  • v0.11.0以降を強くお勧めします。nerdctl system pruneによるキャッシュのプルーニングなど、一部の機能は古いバージョンでは動作しません。

  • RootlessKitslirp4netns (オプション): ルートレスモード

  • RootlessKit は v0.10.0 以降である必要があります。v0.14.1以降を推奨します。

  • slirp4netns は v0.4.0 以降である必要があります。v1.1.7以降を推奨します。

これらの依存関係は nerdctl-full---<VERSION><OS><ARCH>.tar.gz に含まれていますが、nerdctl-<VERSION>-<OS>-<ARCH>.tar.gz には含まれていません。

Brew

Linuxシステムでは、brew経由でnerdctlをインストールできます。

brew install nerdctl

これは現在、macOSではサポートされていません。以下のセクションでは、brewを使用してmacOSにインストールする方法を示します。

macOS

Limaプロジェクトは、macOS用のLinux仮想マシンを提供し、nerdctlの統合が組み込まれています。

$ brew install lima
$ limactl start
$ lima nerdctl run -d --name nginx -p 127.0.0.1:8080:80 nginx:alpine

FreeBSD

freebsd.md を参照してください。

Windows

  • Linux コンテナー: WSL2 で動作することが確認済み

  • Windows コンテナー: Windows の実験的なサポート (現在動作することがわかっている機能については、以下を参照してください)

Docker

Docker内でcontainerdとnerdctlを実行するには:

docker build -t nerdctl .
docker run -it --rm --privileged nerdctl

モチベーション

nerdctlの目的は、Dockerには存在しないcontainerdの最先端の機能の実験を容易にすることです(以下を参照)。

Dockerとの競合はnerdctlの目標_ではない_ことに注意してください。これらの最先端の機能は、最終的にはDockerでも利用できるようになる予定です。

また、nerdctlはKubernetesクラスタのデバッグに役立つ可能性がありますが、主な目的ではありません。

nerdctlには存在するがDockerには存在しない機能

Major:

Minor:

  • 名前空間: nerdctl --namespace=<NS> ps . (注:すべてのKubernetesコンテナは、Kubernetesの名前空間に関係なく、k8s.io containerd名前空間にあります)

  • Docker/OCIデュアルフォーマット・アーカイブのエクスポート: nerdctl save .

  • OCIアーカイブおよびDockerアーカイブのインポート: nerdctl load .

  • イメージ以外の rootfs を指定する: nerdctl run -it --rootfs <ROOTFS> /bin/sh 。CLI 構文は Podman の規則に準拠しています。

  • コンテナーを一度に複数のネットワークに接続する: nerdctl run --net foo --net bar

  • FreeBSD jail の実行。

  • マルチプラットフォームサポートの改善(例:nerdctl pull --all-platforms IMAGE

  • (既存の) AppArmor プロファイルをルートレスコンテナに適用する: nerdctl run --security-opt apparmor=<PROFILE>。 sudo nerdctl apparmor loadを使用して、nerdctl-defaultプロファイルをロードします。

トリビア:

  • raw OCI構成の検査: nerdctl container inspect --mode=native .

Dockerに先駆けてnerdctlに実装された機能

  • 再帰的読み取り専用 (RRO) バインドマウント: nerdctl run -v /mnt:/mnt:rro (/mnt/usb などの子も読み取り専用にします)。 カーネル >= 5.12 が必要です。 同じ機能は、後に異なる構文で Docker v25 に導入されました。nerdctl は、将来的には Docker v25 構文もサポートする予定です。

類似のツール

  • ctr: Docker CLI と互換性がなく、ユーザーにとってフレンドリーではありません。 特に、ctr には、次の nerdctl コマンドに相当するものがありません。

  • nerdctl run -p <PORT>

  • nerdctl run --restart=always --net=bridge

  • ~/.docker/config.json と docker-credential-ecr-login などの資格情報ヘルパー バイナリを使用した nerdctl pull

  • nerdctl logs

  • nerdctl build

  • nerdctl compose up

  • crictl: Docker CLI と互換性がなく、ユーザーにとって使いやすくなく、CRI 以外の機能をサポートしていません

  • k3c v0.2 (放棄済み): 追加のデーモンが必要で、CRI 以外の機能をサポートしていません

  • Rancher Kim (旧姓 k3c v0.3): Kubernetes が必要で、kim build や kim push などのイメージ管理コマンド``のみに焦点を当てています

  • PouchContainer(放棄?):追加のデーモンが必要です

開発者ガイド

nerdctl は、Apache 2.0 ライセンスの下でライセンスされた、コンテナ化された非コアサブプロジェクトです。 コンテナ化された非コアサブプロジェクトとして、次のものが見つかります。

containerd/project リポジトリ内の情報。

ソースからnerdctlをコンパイルする

make && sudo make installを実行してください。

サポートされている Go の最小バージョンについては、go.mod のヘッダーを参照してください。

go install github.com/containerd/nerdctl/cmd/nerdctl を使用することは可能ですが、nerdctlバージョンで出力されたバージョン文字列を埋めないため、お勧めしません

テストスイート

単体テストの実行

go test -v ./pkg/...を実行してください

nerdctlに対する統合テストスイートの実行

make && sudo make installのあと、go test -exec sudo -v ./cmd/nerdctl/... を実行

ルートレスモードをテストする場合、-exec sudo は必要ありません。

コンテナーでテストを実行するには、次のようにします。

docker build -t test-integration --target test-integration .
docker run -t --rm --privileged test-integration

Dockerに対する統合テストスイートの実行

go test -exec sudo -v ./cmd/nerdctl/... -args -test.target=docker を実行して、テスト スイートが Docker と互換性があることを確認します。

nerdctlへの貢献

現在、多くのコマンドとフラグが欠落しています。プルリクエストは大歓迎です。

Developer Certificate of Origin (DCO) を git commit -s でサインオフし、実名でコミットをサインオフして証明してください。

この記事が気に入ったらサポートをしてみませんか?