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.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
でサインオフし、実名でコミットをサインオフして証明してください。
コマンド リファレンス
コマンドリファレンス
に移動しました
追加書類
構成ガイド:
nerdctl.tomlによるnerdctlの構成
:/etc/nerdctl/nerdctl.toml
と~/.config/nerdctl/nerdctl.toml
の構成方法レジストリ認証
:~/.docker/config.json
を利用したレジストリ認証
基本機能:
compose.md
: Composerootless.md
: Rootless modecni.md
: CNI for containers networkbuild.md
:nerdctl build
with BuildKit
Advanced features:
stargz.md
: Lazy-pulling using Stargz Snapshotternydus.md
: Lazy-pulling using Nydus Snapshotteroverlaybd.md
: Lazy-pulling using OverlayBD Snapshotterocicrypt.md
: Running encrypted imagesgpu.md
: Using GPUs inside containersmulti-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
)
その他: