![見出し画像](https://assets.st-note.com/production/uploads/images/128689423/rectangle_large_type_2_8196f035db66486b73f6ab47c86cd602.png?width=1200)
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 を設定します。
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