
一. docker
1.1 dnf/Yum安装
1.1.1 配置基础初始化环境
# 关闭防火墙
[root@k8s-master ~]# systemctl stop firewalld
[root@k8s-master ~]# systemctl disable firewalld
# 关闭 selinux
[root@k8s-master ~]# sed -i 's/enforcing/disabled/' etc/selinux/config
[root@k8s-master ~]# setenforce 0
# 关闭 swap分区
[root@k8s-master ~]# swapoff -a
[root@k8s-master ~]# sed -ri 's/.*swap.*/#&/' etc/fstab
1.1.2 配置基础环境docker安装
# 安装前源准备
[root@k8s-master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置yum源
# 官网源:yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@k8s-master ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 查看可安装的docker版本
[root@k8s-master ~]# yum list docker-ce --showduplicates | sort -r
# 安装26.1.3版本docker
[root@k8s-master ~]# yum install -y docker-ce-26.1.3
# 开启Docker服务
[root@k8s-master ~]# systemctl start docker
# 设置开机自起
[root@k8s-master ~]# systemctl enable docker
# 修改docker存储位置
[root@k8s-master ~]# mkdir -p data/docker
[root@k8s-master ~]# vim etc/docker/daemon.json
{
"data-root": "/data/docker"
}
# 开启Docker服务
[root@k8s-master ~]# systemctl restart docker
# 验证更改:
[root@k8s-master ~]# docker info | grep "Docker Root Dir"
yum remove docker-*
#查看安装过的包
yum list installed | grep docker
#删除包
yum -y remove docker.x86_64
# 删除注册服务文件
rm -rf etc/systemd/system/docker.service
# 删除配置
rm -rf etc/docker/
#查看主程序位置
docker info
# 删除主程序文件(查看Docker Root Dir: var/lib/docker)
rm -rf var/lib/docker
1.3 配置基础环境docker-compose安装
# 安装docker-compose
[root@k8s-master ~]# curl -L "https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-$(uname -s)-$(uname -m)" -o usr/local/bin/docker-compose
# 授予docker-compose执行权限
[root@k8s-master ~]# chmod +x usr/local/bin/docker-compose
查看docker-compose版本
[root@k8s-master ~]# docker-compose -v
1.2 二进制安装docker
1.2.1 解压docker程序
# 二进制包下载地址:https://download.docker.com/linux/static/stable/x86_64/
# wget https://mirrors.ustc.edu.cn/docker-ce/linux/static/stable/x86_64/docker-27.4.0.tgz
#解压
tar xf docker-*.tgz
#拷贝二进制文件
cp docker/* usr/bin/
1.2.2 创建containerd的service文件
#创建containerd的service文件,并且启动
cat >/etc/systemd/system/containerd.service <<EOF
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=1048576
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
EOF
# 参数解释:
#
# [Unit]
# - Description=containerd container runtime:指定服务的描述信息。
# - Documentation=https://containerd.io:指定服务的文档链接。
# - After=network.target local-fs.target:指定服务的启动顺序,在网络和本地文件系统启动之后再启动该服务。
#
# [Service]
# - ExecStartPre=-/sbin/modprobe overlay:在启动服务之前执行的命令,使用`-`表示忽略错误。
# - ExecStart=/usr/bin/containerd:指定服务的启动命令。
# - Type=notify:指定服务的类型,`notify`表示服务会在启动完成后向systemd发送通知。
# - Delegate=yes:允许服务代理其他服务的应答,例如收到关机命令后终止其他服务。
# - KillMode=process:指定服务终止时的行为,`process`表示终止服务进程。
# - Restart=always:指定服务终止后是否自动重启,`always`表示总是自动重启。
# - RestartSec=5:指定服务重启的时间间隔,单位为秒。
# - LimitNPROC=infinity:限制服务的最大进程数,`infinity`表示没有限制。
# - LimitCORE=infinity:限制服务的最大核心数,`infinity`表示没有限制。
# - LimitNOFILE=1048576:限制服务的最大文件数,指定为1048576。
# - TasksMax=infinity:限制服务的最大任务数,`infinity`表示没有限制。
# - OOMScoreAdjust=-999:指定服务的OOM(Out of Memory)得分,负数表示降低被终止的概率。
#
# [Install]
# - WantedBy=multi-user.target:指定服务的安装方式,`multi-user.target`表示该服务在多用户模式下安装。
# 设置开机自启
systemctl enable --now containerd.service
1.2.3 准备docker的service文件
#准备docker的service文件
cat > etc/systemd/system/docker.service <<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service cri-docker.service docker.socket containerd.service
Wants=network-online.target
Requires=docker.socket containerd.service
[Service]
Type=notify
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
OOMScoreAdjust=-500
[Install]
WantedBy=multi-user.target
EOF
# 参数解释:
#
# [Unit]
# - Description: 描述服务的作用,这里是Docker Application Container Engine,即Docker应用容器引擎。
# - Documentation: 提供关于此服务的文档链接,这里是Docker官方文档链接。
# - After: 说明该服务在哪些其他服务之后启动,这里是在网络在线、firewalld服务和containerd服务后启动。
# - Wants: 说明该服务想要的其他服务,这里是网络在线服务。
# - Requires: 说明该服务需要的其他服务,这里是docker.socket和containerd.service。
#
# [Service]
# - Type: 服务类型,这里是notify,表示服务在启动完成时发送通知。
# - ExecStart: 命令,启动该服务时会执行的命令,这里是/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock,即启动dockerd并指定一些参数,其中-H指定dockerd的监听地址为fd://,--containerd指定containerd的sock文件位置。
# - ExecReload: 重载命令,当接收到HUP信号时执行的命令,这里是/bin/kill -s HUP $MAINPID,即发送HUP信号给主进程ID。
# - TimeoutSec: 服务超时时间,这里是0,表示没有超时限制。
# - RestartSec: 重启间隔时间,这里是2秒,表示重启失败后等待2秒再重启。
# - Restart: 重启策略,这里是always,表示总是重启。
# - StartLimitBurst: 启动限制次数,这里是3,表示在启动失败后最多重试3次。
# - StartLimitInterval: 启动限制时间间隔,这里是60秒,表示两次启动之间最少间隔60秒。
# - LimitNOFILE: 文件描述符限制,这里是infinity,表示没有限制。
# - LimitNPROC: 进程数限制,这里是infinity,表示没有限制。
# - LimitCORE: 核心转储限制,这里是infinity,表示没有限制。
# - TasksMax: 最大任务数,这里是infinity,表示没有限制。
# - Delegate: 修改权限,这里是yes,表示启用权限修改。
# - KillMode: 杀死模式,这里是process,表示杀死整个进程组。
# - OOMScoreAdjust: 用于调整进程在系统内存紧张时的优先级调整,这里是-500,表示将OOM分数降低500。
#
# [Install]
# - WantedBy: 安装目标,这里是multi-user.target,表示在多用户模式下安装。
# 在WantedBy参数中,我们可以使用以下参数:
# 1. multi-user.target:指定该服务应该在多用户模式下启动。
# 2. graphical.target:指定该服务应该在图形化界面模式下启动。
# 3. default.target:指定该服务应该在系统的默认目标(runlevel)下启动。
# 4. rescue.target:指定该服务应该在系统救援模式下启动。
# 5. poweroff.target:指定该服务应该在关机时启动。
# 6. reboot.target:指定该服务应该在重启时启动。
# 7. halt.target:指定该服务应该在停止时启动。
# 8. shutdown.target:指定该服务应该在系统关闭时启动。
# 这些参数可以根据需要选择一个或多个,以告知系统在何时启动该服务。
1.2.4 准备docker的socket文件
#准备docker的socket文件
cat > etc/systemd/system/docker.socket <<EOF
[Unit]
Description=Docker Socket for the API
[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF
# 这是一个用于Docker API的socket配置文件,包含了以下参数:
#
# [Unit]
# - Description:描述了该socket的作用,即为Docker API的socket。
#
# [Socket]
# - ListenStream:指定了socket的监听地址,该socket会监听在/var/run/docker.sock上,即Docker守护程序使用的默认sock文件。
# - SocketMode:指定了socket文件的权限模式,此处为0660,即用户和用户组有读写权限,其他用户无权限。
# - SocketUser:指定了socket文件的所有者,此处为root用户。
# - SocketGroup:指定了socket文件的所属用户组,此处为docker用户组。
#
# [Install]
# - WantedBy:指定了该socket被启用时的目标,此处为sockets.target,表示当sockets.target启动时启用该socket。
#
# 该配置文件的作用是为Docker提供API访问的通道,它监听在/var/run/docker.sock上,具有root用户权限,但只接受docker用户组的成员的连接,并且其他用户无法访问。这样,只有docker用户组的成员可以通过该socket与Docker守护进程进行通信。
1.2.5 配置加速器
# 配置加速器
mkdir etc/docker/ -pv
cat >/etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://jockerhub.com"
],
"max-concurrent-downloads": 10,
"log-driver": "json-file",
"log-level": "warn",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"data-root": "/var/lib/docker"
}
EOF
# 该参数文件中包含以下参数:
#
# 1. exec-opts: 用于设置Docker守护进程的选项,native.cgroupdriver=systemd表示使用systemd作为Cgroup驱动程序。
# 2. registry-mirrors: 用于指定Docker镜像的镜像注册服务器。在这里有三个镜像注册服务器:https://docker.m.daocloud.io、https://docker.mirrors.ustc.edu.cn和http://hub-mirror.c.163.com。
# 3. max-concurrent-downloads: 用于设置同时下载镜像的最大数量,默认值为3,这里设置为10。
# 4. log-driver: 用于设置Docker守护进程的日志驱动程序,这里设置为json-file。
# 5. log-level: 用于设置日志的级别,这里设置为warn。
# 6. log-opts: 用于设置日志驱动程序的选项,这里有两个选项:max-size和max-file。max-size表示每个日志文件的最大大小,这里设置为10m,max-file表示保存的最大日志文件数量,这里设置为3。
# 7. data-root: 用于设置Docker守护进程的数据存储根目录,默认为/var/lib/docker,这里设置为/var/lib/docker。
1.2.6 启动docker
groupadd docker
#创建docker组
systemctl daemon-reload
# 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
systemctl enable --now docker.socket
# 启用并立即启动docker.socket单元。docker.socket是一个systemd的socket单元,用于接收来自网络的Docker API请求。
systemctl enable --now docker.service
# 启用并立即启动docker.service单元。docker.service是Docker守护进程的systemd服务单元。
systemctl stop docker.service
# 停止运行中的docker.service单元,即停止Docker守护进程。
systemctl start docker.service
# 启动docker.service单元,即启动Docker守护进程。
systemctl restart docker.service
# 重启docker.service单元,即重新启动Docker守护进程。
systemctl status docker.service
# 显示docker.service单元的当前状态,包括运行状态、是否启用等信息。
docker info
#验证
二. 拓展安装:安装Containerd(k8s)环境
2.1 dnf/yum安装
2.1.1 安装容器运行时(Containerd)
从Kubernetes 1.20版本开始官方不推荐使用Docker,1.24版本将完全弃用docker。如果安装1.22以上版本的k8s,官方推荐使用containerd,docker支持k8s版本最高为1.23.16。
版本选择
每个k8s版本都有对应的Containerd版本范围,具体参考官方文档https://github.com/kubernetes/kubernetes/releases
以1.24.X为例,查看
kubernetes/CHANGELOG/CHANGELOG-1.24.md at master · kubernetes/kubernetes

由更新日志可知,支持的最低版本Containerd为1.4.12
2.1.2安装container
RHEL/CENTOS/ROCKY
# 安装依赖
[root@k8s-master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加yum源
[root@k8s-master ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 查看可安装的containerd版本
[root@k8s-master ~]# yum list containerd.io.x86_64 --showduplicates | sort -r
# 安装1.6.4版本containerd
[root@k8s-master ~]# yum install -y containerd.io-1.6.4-3.1.el8.x86_64
[root@k8s-master ~]# containerd -v
containerd containerd.io 1.6.4 212e8b6fa2f44b9c21b2798135fc6fb7c53efc16
Debian/Ubuntu
# step 1: 安装必要的一些系统工具
root@k8s-master:~# apt-get update && apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
root@k8s-master:~# curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add -
# Step 3: 写入软件源信息
root@k8s-master:~# add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装containerd
root@k8s-master:~# apt-get -y update && apt-cache madison containerd.io | sort -V
root@k8s-master:~# apt-get -y install containerd.io=1.5.11-1
# 验证
root@k8s-master:~# containerd -v
2.1.3修改container配置
生成默认配置文件
[root@k8s-master ~]# containerd config default > etc/containerd/config.toml
替换镜像源(具体看自己k8s版本所对应的基础容器版本)以3.6为例子
由于国内环境原因我们需要将 sandbox_image 镜像源设置为阿里云google_containers镜像源。把sandbox_image = "k8s.gcr.io/pause:3.6"修改为:sandbox_image=“registry.aliyuncs.com/google_containers/pause:3.6”
2.1.4 配置cgroup驱动器
在 Linux 上,控制组(CGroup)用于限制分配给进程的资源。
kubelet 和底层容器运行时都需要对接控制组 为 Pod 和容器管理资源 ,如 CPU、内存这类资源设置请求和限制。 若要对接控制组(CGroup),kubelet 和容器运行时需要使用一个 cgroup 驱动。 关键的一点是 kubelet 和容器运行时需使用相同的 cgroup 驱动并且采用相同的配置。
[root@k8s-master ~]# sed -i 's/SystemdCgroup\ =\ false/SystemdCgroup\ =\ true/g' etc/containerd/config.toml
2.1.5配置国内镜像加速
与我们之前配置docker镜像源的做法类似,在国内使用containerd依然需要更换成国内的镜像源。但是这里有一些问题需要说明一下:
- 配置的镜像仓库在使用crictl工具调用或者kubernetes调用时才会生效,如果使用ctr命令拉取镜像是不生效的。
- Docker 只支持为 Docker Hub 配置 mirror,而 Containerd 支持为任意镜像仓库配置 mirror
# 修改container配置,指定registry配置从文件读取
[root@k8s-master ~]# vim etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d" # 添加配置文件地址
# 创建配置文件目录
[root@k8s-master ~]# mkdir -p etc/containerd/certs.d/docker.io
# 新增加速配置
[root@k8s-master ~]# cat > etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"
[host."https://registry-1.docker.io"]
capabilities = ["pull", "resolve"]
[host."https://934du3yi.mirror.aliyuncs.com"]
capabilities = ["pull", "resolve"]
EOF
从配置文件里面我们看到的
- server表示需要配置的mirror的镜像仓库,例如:https://docker.io表示配置的是docker.io的mirror,这是最基本的镜像。
- host:表示提供的mirror的镜像加速服务,可以使用中国科技大学的,也可以使用阿里云的镜像。
参考文档:配置镜像加速器_容器镜像服务(ACR)-阿里云帮助中心
参考:Containerd的两种安装方式-阿里云开发者社区
2.2 二进制安装Containerd
2.2.1安装Containerd
# https://github.com/containernetworking/plugins/releases/
# wget https://mirrors.chenby.cn/https://github.com/containernetworking/plugins/releases/download/v1.6.1/cni-plugins-linux-amd64-v1.6.1.tgz
cd cby/
#创建cni插件所需目录
mkdir -p etc/cni/net.d opt/cni/bin
#解压cni二进制包
tar xf cni-plugins-linux-amd64-v*.tgz -C opt/cni/bin/
# https://github.com/containerd/containerd/releases/
# wget https://mirrors.chenby.cn/https://github.com/containerd/containerd/releases/download/v2.0.1/containerd-2.0.1-linux-amd64.tar.gz
#解压
tar -xzf containerd-*-linux-amd64.tar.gz -C usr/local/
#创建服务启动文件
cat > etc/systemd/system/containerd.service <<EOF
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
EOF
# 参数解释:
#
# 这是一个用于启动containerd容器运行时的systemd unit文件。下面是对该文件不同部分的详细解释:
#
# [Unit]
# Description=containerd container runtime
# 描述该unit的作用是作为containerd容器运行时。
#
# Documentation=https://containerd.io
# 指向容器运行时的文档的URL。
#
# After=network.target local-fs.target
# 定义了在哪些依赖项之后该unit应该被启动。在网络和本地文件系统加载完成后启动,确保了容器运行时在这些依赖项可用时才会启动。
#
# [Service]
# ExecStartPre=-/sbin/modprobe overlay
# 在启动containerd之前执行的命令。这里的命令是尝试加载内核的overlay模块,如果失败则忽略错误继续执行下面的命令。
#
# ExecStart=/usr/local/bin/containerd
# 实际执行的命令,用于启动containerd容器运行时。
#
# Type=notify
# 指定服务的通知类型。这里使用notify类型,表示当服务就绪时会通过通知的方式告知systemd。
#
# Delegate=yes
# 允许systemd对此服务进行重启和停止操作。
#
# KillMode=process
# 在终止容器运行时时使用的kill模式。这里使用process模式,表示通过终止进程来停止容器运行时。
#
# Restart=always
# 定义了当容器运行时终止后的重启策略。这里设置为always,表示无论何时终止容器运行时,都会自动重新启动。
#
# RestartSec=5
# 在容器运行时终止后重新启动之前等待的秒数。
#
# LimitNPROC=infinity
# 指定容器运行时可以使用的最大进程数量。这里设置为无限制。
#
# LimitCORE=infinity
# 指定容器运行时可以使用的最大CPU核心数量。这里设置为无限制。
#
# LimitNOFILE=infinity
# 指定容器运行时可以打开的最大文件数。这里设置为无限制。
#
# TasksMax=infinity
# 指定容器运行时可以创建的最大任务数。这里设置为无限制。
#
# OOMScoreAdjust=-999
# 指定容器运行时的OOM(Out-Of-Memory)分数调整值。负数值表示容器运行时的优先级较高。
#
# [Install]
# WantedBy=multi-user.target
# 定义了服务的安装位置。这里指定为multi-user.target,表示将服务安装为多用户模式下的启动项。
2.2.2 配置Containerd所需的模块
cat <<EOF | sudo tee etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
# 参数解释:
#
# containerd是一个容器运行时,用于管理和运行容器。它支持多种不同的参数配置来自定义容器运行时的行为和功能。
#
# 1. overlay:overlay是容器d默认使用的存储驱动,它提供了一种轻量级的、可堆叠的、逐层增量的文件系统。它通过在现有文件系统上叠加文件系统层来创建容器的文件系统视图。每个容器可以有自己的一组文件系统层,这些层可以共享基础镜像中的文件,并在容器内部进行修改。使用overlay可以有效地使用磁盘空间,并使容器更加轻量级。
#
# 2. br_netfilter:br_netfilter是Linux内核提供的一个网络过滤器模块,用于在容器网络中进行网络过滤和NAT转发。当容器和主机之间的网络通信需要进行DNAT或者SNAT时,br_netfilter模块可以将IP地址进行转换。它还可以提供基于iptables规则的网络过滤功能,用于限制容器之间或容器与外部网络之间的通信。
#
# 这些参数可以在containerd的配置文件或者命令行中指定。例如,可以通过设置--storage-driver参数来选择使用overlay作为存储驱动,通过设置--iptables参数来启用或禁用br_netfilter模块。具体的使用方法和配置细节可以参考containerd的官方文档。
2.2.3 加载模块
systemctl restart systemd-modules-load.service
# 参数解释:
# - `systemctl`: 是Linux系统管理服务的命令行工具,可以管理systemd init系统。
# - `restart`: 是systemctl命令的一个选项,用于重新启动服务。
# - `systemd-modules-load.service`: 是一个系统服务,用于加载内核模块。
#
# 将上述参数结合在一起来解释`systemctl restart systemd-modules-load.service`的含义:
# 这个命令用于重新启动系统服务`systemd-modules-load.service`,它是负责加载内核模块的服务。在重新启动该服务后,系统会重新加载所有的内核模块。
2.2.4 配置Containerd所需的内核
cat <<EOF | sudo tee etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
# 加载内核
sysctl --system
# 参数解释:
#
# 这些参数是Linux操作系统中用于网络和网络桥接设置的参数。
#
# - net.bridge.bridge-nf-call-iptables:这个参数控制网络桥接设备是否调用iptables规则处理网络数据包。当该参数设置为1时,网络数据包将被传递到iptables进行处理;当该参数设置为0时,网络数据包将绕过iptables直接传递。默认情况下,这个参数的值是1,即启用iptables规则处理网络数据包。
#
# - net.ipv4.ip_forward:这个参数用于控制是否启用IP转发功能。IP转发使得操作系统可以将接收到的数据包从一个网络接口转发到另一个网络接口。当该参数设置为1时,启用IP转发功能;当该参数设置为0时,禁用IP转发功能。在网络环境中,通常需要启用IP转发功能来实现不同网络之间的通信。默认情况下,这个参数的值是0,即禁用IP转发功能。
#
# - net.bridge.bridge-nf-call-ip6tables:这个参数与net.bridge.bridge-nf-call-iptables类似,但是它用于IPv6数据包的处理。当该参数设置为1时,IPv6数据包将被传递到ip6tables进行处理;当该参数设置为0时,IPv6数据包将绕过ip6tables直接传递。默认情况下,这个参数的值是1,即启用ip6tables规则处理IPv6数据包。
#
# 这些参数的值可以通过修改操作系统的配置文件(通常是'/etc/sysctl.conf')来进行设置。修改完成后,需要使用'sysctl -p'命令重载配置文件使参数生效。
2.2.5 创建Containerd的配置文件
# 参数解释:
#
# 这段代码是用于修改并配置containerd的参数。
#
# 1. 首先使用命令`mkdir -p etc/containerd`创建/etc/containerd目录,如果该目录已存在,则不进行任何操作。
# 2. 使用命令`containerd config default | tee etc/containerd/config.toml`创建默认配置文件,并将输出同时传递给/etc/containerd/config.toml文件。
# 3. 使用sed命令修改/etc/containerd/config.toml文件,将SystemdCgroup参数的值从false改为true。-i参数表示直接在原文件中进行编辑。
# 4. 使用cat命令结合grep命令查看/etc/containerd/config.toml文件中SystemdCgroup参数的值是否已修改为true。
# 5. 使用sed命令修改/etc/containerd/config.toml文件,将registry.k8s.io的地址替换为m.daocloud.io/registry.k8s.io。-i参数表示直接在原文件中进行编辑。
# 6. 使用cat命令结合grep命令查看/etc/containerd/config.toml文件中sandbox_image参数的值是否已修改为m.daocloud.io/registry.k8s.io。
# 7. 使用sed命令修改/etc/containerd/config.toml文件,将config_path参数的值从""改为"/etc/containerd/certs.d"。-i参数表示直接在原文件中进行编辑。
# 8. 使用cat命令结合grep命令查看/etc/containerd/config.toml文件中certs.d参数的值是否已修改为/etc/containerd/certs.d。
# 9. 使用mkdir命令创建/etc/containerd/certs.d/docker.io目录,如果目录已存在,则不进行任何操作。-p参数表示创建目录时,如果父级目录不存在,则自动创建父级目录。
#
# 最后,使用cat重定向操作符将内容写入/etc/containerd/certs.d/docker.io/hosts.toml文件。该文件会配置加速器,其中server参数设置为"https://docker.io",host参数设置为"https://hub-mirror.c.163.com",并添加capabilities参数。
# 创建默认配置文件
mkdir -p etc/containerd
containerd config default | tee etc/containerd/config.toml
# 修改Containerd的配置文件
# sed -i "s#SystemdCgroup\ \=\ false#SystemdCgroup\ \=\ true#g" etc/containerd/config.toml
# cat etc/containerd/config.toml | grep SystemdCgroup
# 沙箱pause镜像
sed -i "s#registry.k8s.io#registry.aliyuncs.com/chenby#g" etc/containerd/config.toml
cat etc/containerd/config.toml | grep sandbox
# 配置加速器
[root@k8s-master01 ~]# vim etc/containerd/config.toml
[root@k8s-master01 ~]# cat etc/containerd/config.toml | grep certs.d -C 5
[plugins.'io.containerd.cri.v1.images'.pinned_images]
sandbox = 'registry.aliyuncs.com/chenby/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']
[root@k8s-master01 ~]#
mkdir etc/containerd/certs.d/docker.io -pv
cat > etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"
[host."https://jockerhub.com"]
capabilities = ["pull", "resolve"]
EOF
# 注意!
# SystemdCgroup参数是containerd中的一个配置参数,用于设置containerd在运行过程中使用的Cgroup(控制组)路径。Containerd使用SystemdCgroup参数来指定应该使用哪个Cgroup来跟踪和管理容器的资源使用。
#
# Cgroup是Linux内核提供的一种资源隔离和管理机制,可以用于限制、分配和监控进程组的资源使用。使用Cgroup,可以将容器的资源限制和隔离,以防止容器之间的资源争用和不公平的竞争。
#
# 通过设置SystemdCgroup参数,可以确保containerd能够找到正确的Cgroup路径,并正确地限制和隔离容器的资源使用,确保容器可以按照预期的方式运行。如果未正确设置SystemdCgroup参数,可能会导致容器无法正确地使用资源,或者无法保证资源的公平分配和隔离。
#
# 总而言之,SystemdCgroup参数的作用是为了确保containerd能够正确地管理容器的资源使用,以实现资源的限制、隔离和公平分配。
2.2.6 启动并设置为开机启动
systemctl daemon-reload
# 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
systemctl enable --now containerd.service
# 启用并立即启动docker.service单元。docker.service是Docker守护进程的systemd服务单元。
systemctl stop containerd.service
# 停止运行中的docker.service单元,即停止Docker守护进程。
systemctl start containerd.service
# 启动docker.service单元,即启动Docker守护进程。
systemctl restart containerd.service
# 重启docker.service单元,即重新启动Docker守护进程。
systemctl status containerd.service
# 显示docker.service单元的当前状态,包括运行状态、是否启用等信息。
2.2.6 配置crictl客户端连接的运行时位置
# https://github.com/kubernetes-sigs/cri-tools/releases/
# wget https://mirrors.chenby.cn/https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.32.0/crictl-v1.32.0-linux-amd64.tar.gz
#解压
tar xf crictl-v*-linux-amd64.tar.gz -C usr/bin/
#生成配置文件
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
#测试
systemctl restart containerd
crictl info
# 注意!
# 下面是参数`crictl`的详细解释
#
# `crictl`是一个用于与容器运行时通信的命令行工具。它是容器运行时接口(CRI)工具的一个实现,可以对容器运行时进行管理和操作。
#
# 1. `runtime-endpoint: unix:///run/containerd/containerd.sock`
# 指定容器运行时的终端套接字地址。在这个例子中,指定的地址是`unix:///run/containerd/containerd.sock`,这是一个Unix域套接字地址。
#
# 2. `image-endpoint: unix:///run/containerd/containerd.sock`
# 指定容器镜像服务的终端套接字地址。在这个例子中,指定的地址是`unix:///run/containerd/containerd.sock`,这是一个Unix域套接字地址。
#
# 3. `timeout: 10`
# 设置与容器运行时通信的超时时间,单位是秒。在这个例子中,超时时间被设置为10秒。
#
# 4. `debug: false`
# 指定是否开启调式模式。在这个例子中,调式模式被设置为关闭,即`false`。如果设置为`true`,则会输出更详细的调试信息。
#
# 这些参数可以根据需要进行修改,以便与容器运行时进行有效的通信和管理。
nerdctl命令行工具
nerdctl 简介
nerdctl 是一个命令行工具,旨在为用户提供与 Docker 相似的体验,但它是通过 containerd 来管理容器的。containerd 是一个高性能的容器运行时,用于管理容器的生命周期,包括镜像拉取、容器的创建、运行、停止等。nerdctl 的出现是为了简化和容器管理工具之间的差距,尤其是在不使用 Docker 的情况下,仍然能够获得类似 Docker 的体验。
nerdctl的目标并不是单纯地复制 docker 的功能,它还实现了很多 docker 不具备的功能,例如延迟拉取镜像(lazy-pulling)、镜像加密(imgcrypt)等
nerdctl 特点
- 兼容 Docker 命令:它的语法尽可能与 Docker 相似,减少用户的学习成本。
- 基于 containerd:nerdctl 是在 containerd 的基础上开发的,而 containerd 是一个较为轻量级的容器运行时,相比 Docker 它提供了更为精细的控制。
- 支持 Kubernetes 和其他容器相关的技术:nerdctl 在功能上与 Kubernetes 和容器的标准协作非常好,适用于那些不依赖 Docker 的环境。
- 跨平台支持:nerdctl 支持在 Linux、macOS 和 WSL(Windows Subsystem for Linux)环境中使用。
安装 nerdctl
项目地址:Releases · containerd/nerdctl
# 安装
wget https://github.com/containerd/nerdctl/releases/download/v2.0.0/nerdctl-2.0.0-linux-amd64.tar.gz
# 解压并移动到二进制文件夹
tar -xxf nerdctl-2.0.0-linux-amd64.tar.gz
mv nerdctl /usr/local/bin
# 检查安装
nerdctl version
# 用法和docker 一样




