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)がありません
✅ [オプションで]遅延プルをサポート(Stargz、Nydus、OverlayBD)
✅ [オプション:] 暗号化されたイメージ(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によるキャッシュのプルーニングなど、一部の機能は古いバージョンでは動作しません。
RootlessKit と slirp4netns (オプション): ルートレスモード用
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:
Stargz / Nydus / OverlayBD / SOCI Snapshotterを使用したオンデマンドイメージプル(遅延プル): nerdctl --snapshotter=stargz|nydus|overlaybd|soci run IMAGE 。
ocicrypt (imgcrypt)を使用したイメージの暗号化と復号化: nerdctlイメージ(encrypt|decrypt)SRC DST
IPFSを使用したP2Pイメージの配布:nerdctl run ipfs://CID。 P2Pイメージ配信(IPFS)は完全にオプションです。IPFSデーモンのインストールと実行をオプトインしない限り、ホストはどのP2Pネットワークにも接続されていません。
Cosign の統合: nerdctl pull --verify=cosign と nerdctl push --sign=cosign、および Compose ``
bypass4netns を使用したルートレス コンテナーの高速化: nerdctl run --label nerdctl/bypass4netns=true
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 でサインオフし、実名でコミットをサインオフして証明してください。