FAQとトラブルシューティング
- プロジェクト
- nerdctlは
dockerとどう違うのですか? - nerdctlは
ctrやcrictlとどう違うのですか? - Mac & Windows
- nerdctlはmacOSで動作しますか?
- nerdctlはWindowsで実行されますか?
- 構成
- nerdctl ignores
[plugins."io.containerd.grpc.v1.cri"]config - レジストリにログインする方法は?
- HTTPS以外のレジストリを使用する方法は?
- レジストリのCA証明書を指定する方法は?
- cgroupドライバを変更するには?
- snapshotter を変更するには?
- ランタイムを変更する方法は?
- CNIバイナリパスを変更する方法は?
- Kubernetes
nerdctl ps -aはKubernetesコンテナを表示しません- Kubernetesのイメージを構築する方法は?
- containerd ソケット・アドレス )
- nerdctlには
DOCKER_HOST=ssh://<USER>@<REMOTEHOST>に相当するものがありますか? - nerdctlには
sudo usermod -aG docker <USER>に相当するものがありますか? - ルートレス
- root以外のユーザーとしてnerdctlを使用する方法は?(ルートレスモード)
nerdctl run -p <PORT>はソースIPを伝播しませんnerdctl run -p <PORT>は、1024 未満のポート番号では機能しません- pingを実行できない
- ホストの再起動後にコンテナが自動的に起動しない
- 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 - アンインストールする方法は?
~/.local/share/containerdを削除できません
プロジェクト
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.tomlcgroup_managerプロパティを設定する
デフォルト値は、cgroup v2 ホスト (rootful と rootless の両方) では systemd、cgroup v1 rootful ホストでは cgroupfs、cgroup v1 rootless ホストでは none です。
ヒント: Kubernetes (io.containerd.grpc.v1.cri) に対応する構成
containerdに加えて、kubeletも設定する必要があります。 https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/configure-cgroup-driver/ も参照してください
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) に対応する構成
# An example of /etc/containerd/config.toml for Kubernetes
version = 2
[plugins."io.containerd.grpc.v1.cri".containerd]
default_runtime_name = "crun"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.crun]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.crun.options]
BinaryName = "/usr/local/bin/crun"
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 --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を使用する方法は?(ルートレスモード)
関連項目:
- ルートレスモード
- 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
解決法:
アンインストールする方法は? ~/.local/share/containerdを削除できません
次のコマンドを実行します。