Files

配置 containerd 镜像

sudo bash ./setup_containerd_mirror.sh

更改containerd 的镜像存储位置

# 检查配置文件
sudo containerd config dump

镜像使用

手动拉取镜像的命令

直接使用nerdctl pull 来拉取镜像总会用docker.io官方的源所以这里直接使用ctr拉取镜像到指定空间。

sudo ctr --namespace=k8s.io image pull --hosts-dir /etc/containerd/certs.d docker.io/library/alpine:latest sudo ctr --namespace=k8s.io image pull --hosts-dir /etc/containerd/certs.d docker.io/library/alpine:latest

使用nerdctl 命令查看 ctr拉取的镜像。nerdctl 无法直接拉取镜像。

sudo nerdctl --namespace k8s.io images sudo nerdctl --namespace default images

删除所有镜像

sudo nerdctl --namespace k8s.io image prune -a sudo nerdctl --namespace default image prune -a sudo nerdctl --namespace k8s.io image prune -a --force sudo nerdctl --namespace default image prune -a --force sudo ctr --namespace=k8s.io images ls -q

nerdctl 的配置文件

配置Nerdctl

设置默认配置 对于大部分用户Nerdctl不需要额外的配置即可直接使用。 若需自定义配置,可以在 /etc/nerdctl/nerdctl.toml 或用户目录的 ~/.config/nerdctl/nerdctl.toml 创建配置文件。查看 配置文档 获取更多细节。

配置Rootless模式如果适用

Rootful mode: /etc/nerdctl/nerdctl.toml Rootless mode: ~/.config/nerdctl/nerdctl.toml

需要安装RootlessKit和slirp4netns并且设置Nerdctl使用这些工具。参照 Rootless模式文档 进行配置。

构建镜像时候没有使用缓存的原因

参考 nerdctl build

BuildKit 的两种工作模式:

containerd worker允许 BuildKit 使用 containerd 管理的本地镜像缓存,也就是说 nerdctl 构建的镜像能够用作基础镜像。 OCI worker不使用 containerd 管理的镜像缓存,这意味着无法访问由 nerdctl 构建的镜像,因为它们被 containerd 所管理。因此,若使用 OCI workerBuildKit 只能直接从镜像仓库拉取镜像,无法利用本地缓存。

默认情况下如果没有特别设置BuildKit 很可能使用 OCI worker因此无法使用 containerd 管理的镜像。 若要确保 BuildKit 使用 containerd worker需要配置 /etc/buildkit/buildkitd.toml (/etc/buildkit/buildkit.toml) 文件,将 [worker.containerd] 设置为 enabled = true 并指定 namespace 为 "default"(或你指定的 namespace

sudo systemctl status buildkit

sudo systemctl enable --now buildkit

编辑文件/etc/buildkit/buildkit.toml

[worker.oci]
  # 关闭OCI
  enabled = false

[worker.containerd]
  enabled = true
  # namespace should be "k8s.io" for Kubernetes (including Rancher Desktop)
  namespace = "buildkit" # 修改为'k8s.io' 可以从这里进行缓存镜像。
  platforms = [ "linux/amd64", "linux/arm64" ]
  gc = true
  # gckeepstorage sets storage limit for default gc profile, in MB.
  gckeepstorage = 9000

# registry configures a new Docker register used for cache import or output.
[registry."docker.io"]
  # mirror configuration to handle path in case a mirror registry requires a /project path rather than just a host:port
  mirrors = ["https://upnuemce.mirror.aliyuncs.com", "core.harbor.domain/proxy.docker.io"]
  http = true
  insecure = true
  #ca=["/etc/config/myca.pem"]
  #[[registry."docker.io".keypair]]
    #key="/etc/config/key.pem"
    #cert="/etc/config/cert.pem"

https://docker.unsee.tech https://dockerhub.icu

sudo systemctl restart buildkit

root 用户创建 buildkit.service

    echo "配置 buildkitd 服务..."

    # 创建 buildkitd 配置文件目录
    sudo mkdir -p /etc/buildkit
    # https://github.com/moby/buildkit/blob/master/docs/buildkitd.toml.md
    sudo tee /etc/buildkit/buildkit.toml > /dev/null <<EOT
[worker.oci]
  enabled = false

[worker.containerd]
  enabled = true
  # namespace should be "k8s.io" for Kubernetes (including Rancher Desktop)
  namespace = "buildkit"
  platforms = [ "linux/amd64", "linux/arm64" ]
  gc = true
  # gckeepstorage sets storage limit for default gc profile, in MB.
  gckeepstorage = 9000

# registry configures a new Docker register used for cache import or output.
[registry."docker.io"]
  # mirror configuration to handle path in case a mirror registry requires a /project path rather than just a host:port
  mirrors = ["https://upnuemce.mirror.aliyuncs.com", "core.harbor.domain/proxy.docker.io"]
  http = true
  insecure = true
  #ca=["/etc/config/myca.pem"]
  #[[registry."docker.io".keypair]]
    #key="/etc/config/key.pem"
    #cert="/etc/config/cert.pem"
EOT

    sudo tee /etc/systemd/system/buildkit.service > /dev/null <<EOT
[Unit]
Description=BuildKit Daemon
Documentation=https://github.com/moby/buildkit
Requires=buildkit.socket
After=network.target buildkit.socket

[Service]
Type=notify
ExecStart=/usr/local/bin/buildkitd --config /etc/buildkit/buildkit.toml --addr fd://
Restart=always
RestartSec=10s
StartLimitInterval=0

[Install]
WantedBy=multi-user.target
EOT

    sudo tee /etc/systemd/system/buildkit.socket > /dev/null <<EOT
[Unit]
Description=BuildKit
Documentation=https://github.com/moby/buildkit

[Socket]
ListenStream=%t/buildkit/buildkitd.sock
SocketMode=0660

[Install]
WantedBy=sockets.target
EOT