nerdctl: containerd の Docker 互換 CLI
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)でコンテナを実行するには:
BuildKit を使用してイメージをビルドするには、次のようにします。
BuildKit を使用してビルドし、出力をローカルディレクトリに送信するには、次のようにします。
docker-compose.yaml からコンテナーを実行するには、次のようにします。
./examples/compose-wordpress も参照してください。
Kubernetes のデバッグ
ローカルのKubernetesコンテナを一覧表示するには、次のようにします。
レジストリを使用せずにローカル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 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 を起動するには、次のようにします。
rootless containerd でコンテナを実行するには、次のようにします。
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をインストールできます。
これは現在、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を実行するには:
モチベーション
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.iocontainerd名前空間にあります)
- 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 でサインオフし、実名でコミットをサインオフして証明してください。
コマンド リファレンス
コマンドリファレンス に移動しました
追加書類
構成ガイド:
- nerdctl.tomlによるnerdctlの構成:- /etc/nerdctl/nerdctl.tomlと- ~/.config/nerdctl/nerdctl.tomlの構成方法
- レジストリ認証:- ~/.docker/config.jsonを利用したレジストリ認証
基本機能:
- compose.md: Compose
- rootless.md: Rootless mode
- cni.md: CNI for containers network
- build.md:- nerdctl buildwith BuildKit
Advanced features:
- stargz.md: Lazy-pulling using Stargz Snapshotter
- nydus.md: Lazy-pulling using Nydus Snapshotter
- overlaybd.md: Lazy-pulling using OverlayBD Snapshotter
- ocicrypt.md: Running encrypted images
- gpu.md: Using GPUs inside containers
- multi-platform.md: Multi-platform mode
実験的な機能:
- experimental.md: 実験的な機能
- freebsd.md: FreeBSD jail の実行
- ipfs.md: IPFSでのコンテナイメージの配布
- builder-debug.md: Dockerfile の対話型デバッグ
実装の詳細:
- dir.md: Directory layout (- /var/lib/nerdctl)
その他: