見出し画像

nerdctlのFAQとトラブルシューティング

プロジェクト

nerdctlはdockerとどう違うのですか?

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

このような機能には、オンデマンドのイメージプル(遅延プル)イメージの暗号化/復号化が含まれますが、これらに限定されません。 参照 .タイトルページ nerdctlには存在するがDockerには存在しない機能のリスト(またはその逆)です。

nerdctlの目標は、Dockerに_対抗することでは_ありません。これらの最先端の機能は、最終的にはDockerでも利用できるようになる予定です。

nerdctlはctrやcrictlとどう違うのですか?

ctr は containerd にバンドルされているデバッグユーティリティです。

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 にも同様の制限があります。

Mac & Windows

nerdctlはmacOSで動作しますか?

はい、Linux 仮想マシン経由です。

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

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

Mac用のRancher Desktopおよびcolimaは、nerdctlを備えたカスタムLimaマシンも提供します。

nerdctlはWindowsで実行できますか?

Windows コンテナー: 利用できますが実験的です。

Linux コンテナー: WSL2 経由で実行できます。Windows用のRancher Desktopは、WSL2マシンでnerdctlバイナリを実行するように構成されたnerdctl.exe.exeを提供します。

構成

nerdctl ignores [plugins."io.containerd.grpc.v1.cri"] config

nerdctlはCRI(Kubernetes Container Runtime Interface)APIを使用しないため、予想される動作です。

nerdctlの設定方法については、以下の質問を参照してください。

レジストリにログインする方法は?

nerdctl login を使用するか、~/.docker/config.json を作成します。 nerdctl は、docker-credential-ecr-login などの資格情報ヘルパー バイナリもサポートしています。

HTTPS以外のレジストリを使用する方法は?

nerdctl --insecure-registry run <IMAGE>を使用します。レジストリ認証 も参照してください。

レジストリのCA証明書を指定する方法は?

必要条件nerdctl >= 0.16

~/.config/containerd/certs.d/<HOST:PORT>/hosts.toml (ルートフル の場合は/etc/containerd/certs.d/...) を作成して、CA 証明書を指定します。

# An example of ~/.config/containerd/certs.d/192.168.12.34:5000/hosts.toml
# (The path is "/etc/containerd/certs.d/192.168.12.34:5000/hosts.toml" for rootful)

server = "https://192.168.12.34:5000"
[host."https://192.168.12.34:5000"]
  ca = "/path/to/ca.crt"

hosts.toml の構文については、 https://github.com/containerd/containerd/blob/main/docs/hosts.md を参照してください。

Docker スタイルのディレクトリもサポートされています。 パスは、ルートレスの場合は~/.config/docker/certs.d、ルートフルの場合は/etc/docker/certs.d です。

レジストリ認証 も参照してください。

cgroupドライバを変更するには?

  • オプション1: nerdctl --cgroup-manager=(cgroupfs|systemd|none)。

  • オプション2: nerdctl.toml cgroup_managerプロパティを設定する

デフォルト値は、cgroup v2 ホスト (rootful と rootless の両方) では systemd、cgroup v1 rootful ホストでは cgroupfs、cgroup v1 rootless ホストでは none です。

ヒント: Kubernetes (io.containerd.grpc.v1.cri) に対応する構成



snapshotter を変更するには?

  • オプション 1: nerdctl --snapshotter=(overlayfs|native|btrfs|...)を使用します

  • オプション 2: $CONTAINERD_SNAPSHOTTERを設定する

  • オプション3: nerdctl.tomlでsnapshotter プロパティを設定する

既定値は、 overlayfsです。

ヒント: Kubernetes (io.containerd.grpc.v1.cri) に対応する構成



ランタイムを変更する方法は?

nerdctl run --runtime=<RUNTIME>を使用する。

<RUNTIME>には、 (io.containerd.runc.v2 など)の containerd ランタイムプラグイン名や、 (/usr/local/sbin/runc など)runc 互換のバイナリのパスの、いずれかを指定します。

ヒント: Kubernetes (io.containerd.grpc.v1.cri) に対応する構成



CNIバイナリパスを変更する方法は?

  • オプション1: nerdctl --cni-path=<PATH>を使用する

  • オプション2: $CNI_PATHを設定する

  • オプション 3: nerdctl.tomlで、 cni_pathプロパティを設定します。

既定値は、次の候補をチェックすることで自動的に検出されます。 - ~/.local/libexec/cni - ~/.local/lib/cni - ~/opt/cni/bin - /usr/local/libexec/cni - /usr/local/lib/cni - /usr/libexec/cni - /usr/lib/cni - /opt/cni/bin

ヒント: Kubernetes (io.containerd.grpc.v1.cri) に対応する構成



Kubernetes

nerdctl ps -aはKubernetesコンテナを表示しません

sudo nerdctl --namespace=k8s.io ps -a を試してみる.

注意: k3s ユーザは、 --address も指定する必要あり: sudo nerdctl --address=/run/k3s/containerd/containerd.sock --namespace=k8s.io ps -a

Kubernetesのイメージを構築する方法は?

マルチノードクラスタの場合:

$ nerdctl build -t example.com/foo /some-dockerfile-directory
$ nerdctl push example.com/foo


レジストリのない単一ノードクラスタの場合:

# 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


containerd ソケット・アドレス

  • ルートフル: /run/containerd/containerd.sock

  • rootless (例えば Lima インスタンス): /proc/<PID of containerd>/root/run/containerd/containerd.sockまたは次のコマンドを実行して調べることができます: echo /proc/$(cat $XDG_RUNTIME_DIR/containerd-rootless/child_pid)/root/run/containerd/containerd.sock(詳細の動作はrootlessutil.ParentMainを確認してください)。

nerdctlにはDOCKER_HOST=ssh://<USER>@<REMOTEHOST>に相当するものがありますか?

ありません。ssh -l <USER> <REMOTEHOST> nerdctl を使用する方法しかありません。

nerdctlにはsudo usermod -aG docker <USER> に相当するものがありますか?

まったく同じではありませんが、nerdctlバイナリにSETUIDビット(chmod + s)を設定すると、同様のユーザーエクスペリエンスが得られます。

mkdir -p $HOME/bin
chmod 700 $HOME/bin
cp /usr/local/bin/nerdctl $HOME/bin
sudo chown root $HOME/bin/nerdctl
sudo chmod +s $HOME/bin/nerdctl
export PATH=$HOME/bin:$PATH

$HOME/bin を 700 に モード変更 することが重要です。そうしないと、意図しないユーザーが SETUID ビットを介して root 権限を取得する可能性があります。

SETUID ビットの使用はお勧めしません。可能な限り、代わりにルートレスモードを使用することを検討してください。

ルートレス

root以外のユーザーとしてnerdctlを使用する方法は?(ルートレスモード)

containerd-rootless-setuptool.sh install
nerdctl run -d --name nginx -p 8080:80 nginx:alpine

関連項目: - ルートレスモード - https://rootlesscontaine.rs/getting-started/common/ - https://rootlesscontaine.rs/getting-started/containerd/

nerdctl run -p <PORT>はソースIPを伝播しません

既定のrootlesskitポートドライバで想定されている動作です。

解決策は、ポートドライバをslirp4netnsに変更することです(パフォーマンスを犠牲にします)。

https://rootlesscontaine.rs/getting-started/containerd/#changing-the-port-forwarder 参照してください.

nerdctl run -p <PORT> は、1024 未満のポート番号では機能しません

sysctl 値 net.ipv4.ip_unprivileged_port_start=0 を設定します。

https://rootlesscontaine.rs/getting-started/common/sysctl/#optional-allowing-listening-on-tcp--udp-ports-below-1024 を参照してください。

pingを実行できない

sysctl 値 net.ipv4.ping_group_range=0 2147483647 を設定します。

https://rootlesscontaine.rs/getting-started/common/sysctl/#optional-allowing-ping を参照してください

ホストの再起動後にコンテナが自動的に起動しない

sudo loginctl enable-linger $(whoami) を実行します。

https://rootlesscontaine.rs/getting-started/common/login/ を参照してください

Error failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: unable to apply cgroup configuration: unable to start unit ... {Name:Slice Value:"user.slice"} {Name:Delegate Value:true} ... Permission denied: unknown

systemd cgroup ドライバーでルートレスコンテナを実行するには、dbus をユーザーセッションサービスとして実行する必要があります。

そうしないと、runcが次のようなエラーで失敗する可能性があります。

FATA[0000] failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: unable to apply cgroup configuration: unable to start unit "nerdctl-7bda4abaa1f006ab9feeb98c06953db43f212f1c0aaf658fb8a88d6f63dff9f9.scope" (properties [{Name:Description Value:"libcontainer container 7bda4abaa1f006ab9feeb98c06953db43f212f1c0aaf658fb8a88d6f63dff9f9"} {Name:Slice Value:"user.slice"} {Name:Delegate Value:true} {Name:PIDs Value:@au [1154]} {Name:MemoryAccounting Value:true} {Name:CPUAccounting Value:true} {Name:IOAccounting Value:true} {Name:TasksAccounting Value:true} {Name:DefaultDependencies Value:false}]): Permission denied: unknown


解決法:

sudo apt-get install -y dbus-user-session

systemctl --user start dbus


アンインストールする方法は? ~/.local/share/containerdを削除できません

次のコマンドを実行します。

containerd-rootless-setuptool.sh uninstall
rootlesskit rm -rf ~/.local/share/containerd ~/.local/share/nerdctl ~/.config/containerd

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