2025-05-09
docker
00

目录

1. 背景
1. 安装 containerd
2. 生成空白 config.toml 文件. 默认会放置在目录 /etc/containerd
3. 编辑/etc/containerd/config.toml 内容如下
3. 配置私有镜像仓库
4. 镜像加速
The End

1. 背景

image.png containerd config.tmol v3标准出来很久了,而且在containerd2.1版本之后将不再支持旧的配置版本. 但到目前很多项目仍然在使用旧的配置版本. 如果在网上搜类似的文档,会得到很多使用旧版配置的内容, 进行像下面这样的配置:

toml
[plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."myregistry"] endpoint = ["myregistry"] ... [plugins."io.containerd.grpc.v1.cri".registry.configs."myregistry".tls] insecure_skip_verify = true

然后就会在containerd的日志中看到类似这样的警告:

log
The `mirrors` property of `[plugins."io.containerd.grpc.v1.cri".registry]` is deprecated

本文会简短的以一个真实的示例来说明怎么使用v3 版本 配置文件,以及如何配置私有镜像仓库免TLS认证, 以及过程中遇到的坑.

1. 安装 containerd

本示例containerd版本: v2.0.4. 安装过程不再赘述, 可以使用apt/dnf 等包管理工具,也可以使用二进制手动安装. 具体请参考文档: Getting started with containerd

2. 生成空白 config.toml 文件. 默认会放置在目录 /etc/containerd

3. 编辑/etc/containerd/config.toml 内容如下

注意:

  1. 里面使用了 'local1.harbor.com:8443' 私有仓库. 后面还会有怼他的配置.
  2. config_path = "/etc/containerd/certs.d" 必须填写, 否则无法找到私有仓库的配置地址.
toml
version = 3 root = '/var/lib/containerd' state = '/run/containerd' temp = '' plugin_dir = '' disabled_plugins = [] required_plugins = [] oom_score = 0 imports = [] [grpc] address = '/run/containerd/containerd.sock' tcp_address = '' tcp_tls_ca = '' tcp_tls_cert = '' tcp_tls_key = '' uid = 0 gid = 0 max_recv_message_size = 16777216 max_send_message_size = 16777216 [ttrpc] address = '' uid = 0 gid = 0 [debug] address = '' uid = 0 gid = 0 level = '' format = '' [metrics] address = '' grpc_histogram = false [plugins] [plugins.'io.containerd.cri.v1.images'] snapshotter = 'overlayfs' disable_snapshot_annotations = true discard_unpacked_layers = false max_concurrent_downloads = 3 image_pull_progress_timeout = '15m0s' image_pull_with_sync_fs = false stats_collect_period = 10 [plugins.'io.containerd.cri.v1.images'.pinned_images] sandbox = 'local1.harbor.com:8443/kubeapps/pause:3.10' [plugins.'io.containerd.cri.v1.images'.registry] config_path = "/etc/containerd/certs.d" [plugins.'io.containerd.cri.v1.images'.image_decryption] key_model = 'node' [plugins.'io.containerd.cri.v1.runtime'] enable_selinux = false selinux_category_range = 1024 max_container_log_line_size = 16384 disable_apparmor = false restrict_oom_score_adj = false disable_proc_mount = false unset_seccomp_profile = '' tolerate_missing_hugetlb_controller = true disable_hugetlb_controller = true device_ownership_from_security_context = false ignore_image_defined_volumes = false netns_mounts_under_state_dir = false enable_unprivileged_ports = true enable_unprivileged_icmp = true enable_cdi = true cdi_spec_dirs = ['/etc/cdi', '/var/run/cdi'] drain_exec_sync_io_timeout = '0s' ignore_deprecation_warnings = [] [plugins.'io.containerd.cri.v1.runtime'.containerd] default_runtime_name = 'runc' ignore_blockio_not_enabled_errors = false ignore_rdt_not_enabled_errors = false [plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes] [plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc] runtime_type = 'io.containerd.runc.v2' runtime_path = '' pod_annotations = [] container_annotations = [] privileged_without_host_devices = false privileged_without_host_devices_all_devices_allowed = false base_runtime_spec = '' cni_conf_dir = '' cni_max_conf_num = 0 snapshotter = '' sandboxer = 'podsandbox' io_type = '' [plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc.options] BinaryName = '' CriuImagePath = '' CriuWorkPath = '' IoGid = 0 IoUid = 0 NoNewKeyring = false Root = '' ShimCgroup = '' [plugins.'io.containerd.cri.v1.runtime'.cni] bin_dir = '/opt/cni/bin' conf_dir = '/etc/cni/net.d' max_conf_num = 1 setup_serially = false conf_template = '/etc/cni/net.d/10-default.conf' ip_pref = '' use_internal_loopback = false [plugins.'io.containerd.gc.v1.scheduler'] pause_threshold = 0.02 deletion_threshold = 0 mutation_threshold = 100 schedule_delay = '0s' startup_delay = '100ms' [plugins.'io.containerd.grpc.v1.cri'] disable_tcp_service = true stream_server_address = '127.0.0.1' stream_server_port = '0' stream_idle_timeout = '4h0m0s' enable_tls_streaming = false [plugins.'io.containerd.grpc.v1.cri'.x509_key_pair_streaming] tls_cert_file = '' tls_key_file = '' [plugins.'io.containerd.image-verifier.v1.bindir'] bin_dir = '/opt/containerd/image-verifier/bin' max_verifiers = 10 per_verifier_timeout = '10s' [plugins.'io.containerd.internal.v1.opt'] path = '/opt/containerd' [plugins.'io.containerd.internal.v1.tracing'] [plugins.'io.containerd.metadata.v1.bolt'] content_sharing_policy = 'shared' [plugins.'io.containerd.monitor.container.v1.restart'] interval = '10s' [plugins.'io.containerd.monitor.task.v1.cgroups'] no_prometheus = false [plugins.'io.containerd.nri.v1.nri'] disable = false socket_path = '/var/run/nri/nri.sock' plugin_path = '/opt/nri/plugins' plugin_config_path = '/etc/nri/conf.d' plugin_registration_timeout = '5s' plugin_request_timeout = '2s' disable_connections = false [plugins.'io.containerd.runtime.v2.task'] platforms = ['linux/arm64'] [plugins.'io.containerd.service.v1.diff-service'] default = ['walking'] sync_fs = false [plugins.'io.containerd.service.v1.tasks-service'] blockio_config_file = '' rdt_config_file = '' [plugins.'io.containerd.shim.v1.manager'] env = [] [plugins.'io.containerd.snapshotter.v1.blockfile'] root_path = '' scratch_file = '' fs_type = '' mount_options = [] recreate_scratch = false [plugins.'io.containerd.snapshotter.v1.btrfs'] root_path = '' [plugins.'io.containerd.snapshotter.v1.devmapper'] root_path = '' pool_name = '' base_image_size = '' async_remove = false discard_blocks = false fs_type = '' fs_options = '' [plugins.'io.containerd.snapshotter.v1.native'] root_path = '' [plugins.'io.containerd.snapshotter.v1.overlayfs'] root_path = '' upperdir_label = false sync_remove = false slow_chown = false mount_options = [] [plugins.'io.containerd.snapshotter.v1.zfs'] root_path = '' [plugins.'io.containerd.tracing.processor.v1.otlp'] [plugins.'io.containerd.transfer.v1.local'] max_concurrent_downloads = 3 max_concurrent_uploaded_layers = 3 config_path = '' [cgroup] path = '' [timeouts] 'io.containerd.timeout.bolt.open' = '0s' 'io.containerd.timeout.metrics.shimstats' = '2s' 'io.containerd.timeout.shim.cleanup' = '5s' 'io.containerd.timeout.shim.load' = '5s' 'io.containerd.timeout.shim.shutdown' = '3s' 'io.containerd.timeout.task.state' = '2s' [stream_processors] [stream_processors.'io.containerd.ocicrypt.decoder.v1.tar'] accepts = ['application/vnd.oci.image.layer.v1.tar+encrypted'] returns = 'application/vnd.oci.image.layer.v1.tar' path = 'ctd-decoder' args = ['--decryption-keys-path', '/etc/containerd/ocicrypt/keys'] env = ['OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf'] [stream_processors.'io.containerd.ocicrypt.decoder.v1.tar.gzip'] accepts = ['application/vnd.oci.image.layer.v1.tar+gzip+encrypted'] returns = 'application/vnd.oci.image.layer.v1.tar+gzip' path = 'ctd-decoder' args = ['--decryption-keys-path', '/etc/containerd/ocicrypt/keys'] env = ['OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf']

3. 配置私有镜像仓库

  1. 在 /etc/containerd/certs.d 下创建目录 'local1.harbor.com:8443' 请注意,如果私有仓库不是使用的443 或80端口,目录名称一定要包含端口.
  2. 在 local1.harbor.com:8443 目录下创建 hosts.toml 文件
toml
server = "https://local1.harbor.com:8443" [host."https://local1.harbor.com:8443"] capabilities = ["pull", "resolve", "push"] skip_verify = true
  1. 重启 containerd 服务
shell
systemctl daemon-reload systemctl restart containerd.service
  1. 拉取镜像测试
shell
root@master-01:~# crictl pull local1.harbor.com:8443/kubeapps/ubuntu/ubuntu:24.04 Image is up to date for sha256:7fc8925289a890695754108847a52df143c50fb950d185b28ec19be502d09071

4. 镜像加速

toml
server = "docker.io" [host."https://docker.1ms.run"] capabilities = ["pull", "resolve"] skip_verify = true [host."https://hub1.nat.tf"] capabilities = ["pull", "resolve"] skip_verify = true [host."https://docker.1panel.live"] capabilities = ["pull", "resolve"] skip_verify = true [host."https://proxy.1panel.live"] capabilities = ["pull", "resolve"] skip_verify = true [host."https://hub.rat.dev"] capabilities = ["pull", "resolve"] skip_verify = true [host."https://docker.amingg.com"] capabilities = ["pull", "resolve"] skip_verify = true

The End

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:王海生

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!