Skip to content

nerdctl: containerd の Docker 互換 CLI

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.jsondocker-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 でサインオフし、実名でコミットをサインオフして証明してください。

コマンド リファレンス

コマンドリファレンス に移動しました

追加書類

構成ガイド:

基本機能:

Advanced features:

実験的な機能:

実装の詳細:

  • dir.md: Directory layout (/var/lib/nerdctl)

その他: