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.toml
cgroup_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
を削除できません
次のコマンドを実行します。