280 lines
9.1 KiB
Bash
Executable File
280 lines
9.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
VERSION="1.7.6"
|
|
FILENAME="nerdctl-full-${VERSION}-linux-amd64.tar.gz"
|
|
# https://github.com/containerd/nerdctl/releases/download/v2.0.0/nerdctl-full-2.0.0-linux-amd64.tar.gz
|
|
DOWNLOAD_URL="https://ghproxy.dockless.eu.org/https://github.com/containerd/nerdctl/releases/download/v${VERSION}/${FILENAME}"
|
|
|
|
install_nerdctl() {
|
|
echo "正在安装必要的依赖包..."
|
|
|
|
# 删除 Docker 源
|
|
if [ -f /etc/apt/sources.list.d/docker.list ]; then
|
|
echo "删除 Docker APT 源..."
|
|
sudo rm /etc/apt/sources.list.d/docker.list
|
|
fi
|
|
|
|
sudo apt-get update
|
|
sudo apt-get install -y wget tar jq curl gnupg lsb-release uidmap
|
|
|
|
# 检查文件是否已经下载
|
|
if [ -f "${FILENAME}" ]; then
|
|
echo "${FILENAME} 已存在,跳过下载。"
|
|
else
|
|
echo "下载 nerdctl-full..."
|
|
wget ${DOWNLOAD_URL}
|
|
fi
|
|
|
|
echo "解压并移动到 /usr/local..."
|
|
sudo tar -C /usr/local -xzf ${FILENAME}
|
|
|
|
# echo "清理下载文件..."
|
|
# rm ${FILENAME}
|
|
|
|
echo "安装 nerdctl bash 自动补全..."
|
|
sudo apt install bash-completion -y
|
|
sudo nerdctl completion bash | sudo tee /etc/bash_completion.d/nerdctl > /dev/null
|
|
sudo nerdctl completion bash | sudo tee /etc/bash_completion.d/docker > /dev/null
|
|
sudo bash -c "source /etc/bash_completion.d/nerdctl"
|
|
sudo bash -c "source /etc/bash_completion.d/docker"
|
|
|
|
echo "创建 docker 兼容命令..."
|
|
sudo tee /usr/local/bin/docker > /dev/null <<EOT
|
|
#!/bin/bash
|
|
exec nerdctl "\$@"
|
|
EOT
|
|
sudo chmod +x /usr/local/bin/docker
|
|
|
|
echo "for root 生成 nerdctl 默认配置文件..."
|
|
sudo mkdir -p /etc/nerdctl
|
|
sudo tee /etc/nerdctl/nerdctl.toml > /dev/null <<EOT
|
|
debug = false
|
|
address = "unix:///run/containerd/containerd.sock"
|
|
namespace = "k8s.io"
|
|
snapshotter = "overlayfs"
|
|
cgroup_manager = "cgroupfs"
|
|
hosts_dir = ["/etc/containerd/certs.d"]
|
|
experimental = true
|
|
EOT
|
|
|
|
|
|
echo "for 普通用户 安装 nerdctl"
|
|
/usr/local/bin/containerd-rootless-setuptool.sh install
|
|
|
|
echo "for 普通用户 生成 nerdctl 默认配置文件..."
|
|
mkdir -p ~/.config/nerdctl
|
|
tee ~/.config/nerdctl/nerdctl.toml > /dev/null <<EOT
|
|
debug = false
|
|
address = "unix:///run/containerd/containerd.sock"
|
|
namespace = "k8s.io"
|
|
snapshotter = "overlayfs"
|
|
cgroup_manager = "cgroupfs"
|
|
hosts_dir = ["/etc/containerd/certs.d"]
|
|
experimental = true
|
|
EOT
|
|
|
|
echo "启动并启用 containerd 服务..."
|
|
sudo systemctl enable --now containerd
|
|
|
|
check_containerd_socket
|
|
|
|
echo "验证安装..."
|
|
nerdctl --version
|
|
|
|
echo "nerdctl-full 安装完成。"
|
|
}
|
|
|
|
check_containerd_socket() {
|
|
SOCKET_PATH="/run/containerd/containerd.sock"
|
|
|
|
if [ -S "$SOCKET_PATH" ]; then
|
|
echo "containerd 启动成功,套接字文件已存在:$SOCKET_PATH"
|
|
else
|
|
echo "containerd 未启动或套接字文件不存在,尝试启动 containerd..."
|
|
sudo systemctl restart containerd
|
|
|
|
# 再次检查套接字文件
|
|
if [ -S "$SOCKET_PATH" ]; then
|
|
echo "containerd 启动成功,套接字文件已创建:$SOCKET_PATH"
|
|
else
|
|
echo "containerd 启动失败,请检查服务状态。"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
|
|
uninstall_nerdctl() {
|
|
echo "停止 containerd 服务..."
|
|
sudo systemctl disable --now containerd
|
|
|
|
# 移除 BuildKit、bypass4netnsd、fuse-overlayfs 和 stargz 插件的 systemd 单元文件
|
|
echo "卸载 BuildKit、bypass4netnsd、fuse-overlayfs 和 stargz 插件..."
|
|
|
|
/usr/local/bin/containerd-rootless-setuptool.sh uninstall-buildkit
|
|
/usr/local/bin/containerd-rootless-setuptool.sh uninstall-bypass4netnsd
|
|
/usr/local/bin/containerd-rootless-setuptool.sh uninstall-fuse-overlayfs
|
|
/usr/local/bin/containerd-rootless-setuptool.sh uninstall-stargz
|
|
|
|
echo "删除 nerdctl 二进制文件..."
|
|
sudo rm -rf /usr/local/bin/nerdctl
|
|
sudo rm -rf /usr/local/libexec/cni
|
|
|
|
echo "删除 containerd..."
|
|
sudo rm -rf /usr/local/bin/containerd*
|
|
sudo rm -rf /usr/local/bin/ctr
|
|
sudo rm -rf /usr/local/bin/runc
|
|
|
|
echo "删除相关文件和目录..."
|
|
sudo rm -rf /etc/containerd
|
|
sudo rm -rf /data/containerd
|
|
sudo rm -rf /var/lib/containerd
|
|
sudo rm -rf /usr/local/libexec/cni
|
|
|
|
echo "删除 buildkit 服务和 socket 文件..."
|
|
sudo systemctl stop buildkit
|
|
sudo systemctl stop buildkit.socket
|
|
sudo systemctl disable buildkit
|
|
sudo systemctl disable buildkit.socket
|
|
sudo rm -f /etc/systemd/system/buildkit.service
|
|
sudo rm -f /etc/systemd/system/buildkit.socket
|
|
sudo rm -f /usr/lib/systemd/system/buildkit.service
|
|
sudo rm -f /usr/lib/systemd/system/buildkit.socket
|
|
|
|
echo "删除 nvidia-container-toolkit..."
|
|
sudo apt-get remove --purge -y nvidia-container-toolkit
|
|
|
|
echo "删除 nerdctl bash 自动补全..."
|
|
sudo rm -f /etc/bash_completion.d/nerdctl
|
|
sudo rm -f /etc/bash_completion.d/docker
|
|
|
|
echo "删除 docker 兼容命令..."
|
|
sudo rm -f /usr/local/bin/docker
|
|
|
|
echo "清理完成。"
|
|
}
|
|
|
|
install_nvidia_docker() {
|
|
echo "正在安装 NVIDIA Docker..."
|
|
sudo apt-get update
|
|
sudo apt-get install -y curl gnupg lsb-release
|
|
|
|
if ! grep -q "^deb .\+nvidia-container-toolkit" /etc/apt/sources.list /etc/apt/sources.list.d/*; then
|
|
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
|
|
&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
|
|
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
|
|
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
|
|
else
|
|
echo "NVIDIA Docker 源已经配置,跳过此步骤。"
|
|
fi
|
|
|
|
sudo apt-get update
|
|
sudo apt-get install -y nvidia-container-toolkit
|
|
}
|
|
|
|
configure_containerd() {
|
|
echo "正在配置 containerd 使用 NVIDIA runtime..."
|
|
|
|
# 创建 /etc/containerd 目录并生成默认配置文件
|
|
sudo mkdir -p /etc/containerd
|
|
containerd config default | sudo tee /etc/containerd/config.toml
|
|
|
|
# 使用 sed 命令在特定位置添加配置项
|
|
sudo sed -i '/\[plugins."io.containerd.grpc.v1.cri".registry.configs\]/a \\t[plugins."io.containerd.grpc.v1.cri".registry.configs."docker.io".tls]\n\t\tinsecure_skip_verify = true' /etc/containerd/config.toml
|
|
|
|
# 配置 NVIDIA runtime
|
|
sudo nvidia-ctk runtime configure --runtime=containerd
|
|
|
|
# 配置镜像源
|
|
echo "配置镜像源....."
|
|
bash ./setup_containerd_mirror_addall.sh
|
|
|
|
# 重启 containerd 服务
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl restart containerd
|
|
}
|
|
|
|
start_containerd() {
|
|
echo "正在启动 containerd..."
|
|
sudo systemctl enable --now containerd
|
|
if [ $? -ne 0 ]; then
|
|
echo "启动 containerd 失败。"
|
|
exit 1
|
|
fi
|
|
echo "containerd 启动成功。"
|
|
}
|
|
|
|
configure_buildkitd() {
|
|
echo "配置 buildkitd 服务..."
|
|
|
|
/usr/local/bin/containerd-rootless-setuptool.sh check
|
|
/usr/local/bin/containerd-rootless-setuptool.sh install-buildkit
|
|
echo "buildkitd 服务 安装完成。"
|
|
}
|
|
|
|
configure_fuse_overlayfs() {
|
|
echo "配置 FUSE-OverlayFS..."
|
|
/usr/local/bin/containerd-rootless-setuptool.sh check
|
|
/usr/local/bin/containerd-rootless-setuptool.sh install-fuse-overlayfs
|
|
echo "FUSE-OverlayFS 安装完成。"
|
|
}
|
|
|
|
configure_stargz_snapshotter() {
|
|
echo "配置 Stargz Snapshotter..."
|
|
/usr/local/bin/containerd-rootless-setuptool.sh check
|
|
/usr/local/bin/containerd-rootless-setuptool.sh install-stargz
|
|
echo "Stargz Snapshotter 安装完成。"
|
|
}
|
|
|
|
configure_bypass4netnsd() {
|
|
echo "配置 bypass4netnsd 网络加速..."
|
|
/usr/local/bin/containerd-rootless-setuptool.sh check
|
|
/usr/local/bin/containerd-rootless-setuptool.sh install-bypass4netnsd
|
|
echo "bypass4netnsd 安装完成。"
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable --now buildkit.socket
|
|
sudo systemctl start buildkit
|
|
|
|
echo "buildkit 服务配置完成。"
|
|
}
|
|
|
|
case "$1" in
|
|
install)
|
|
install_nerdctl
|
|
install_nvidia_docker
|
|
configure_containerd
|
|
start_containerd
|
|
configure_buildkitd
|
|
configure_fuse_overlayfs
|
|
configure_stargz_snapshotter
|
|
configure_bypass4netnsd
|
|
;;
|
|
uninstall)
|
|
uninstall_nerdctl
|
|
;;
|
|
*)
|
|
echo "Usage: $0 {install|uninstall}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# https://blog.csdn.net/u013522701/article/details/142153885
|
|
# 跳过校验
|
|
# [plugins]
|
|
# [plugins."io.containerd.grpc.v1.cri"]
|
|
# [plugins."io.containerd.grpc.v1.cri".registry]
|
|
# [plugins."io.containerd.grpc.v1.cri".registry.configs]
|
|
# [plugins."io.containerd.grpc.v1.cri".registry.configs."docker.io".tls]
|
|
# insecure_skip_verify = true
|
|
# 配置镜像
|
|
# 在这里一行([plugins."io.containerd.grpc.v1.cri".registry])后面的一行加上:
|
|
# config_path = "/etc/containerd/certs.d"
|
|
# 然后在这个加上的路径上面添加文件夹(docker.io)并在这个文件里面添加hosts.toml文件
|
|
# cd /etc/containerd/certs.d
|
|
# mkdir -p docker.io
|
|
# 内容如下:
|
|
# server = "https://docker.io"
|
|
# [host."https://docker.rainbond.cc"]
|
|
# capabilities = ["pull", "resolve"]
|
|
|
|
# [host."https://docker.1panel.live"]
|
|
# capabilities = ["pull", "resolve"] |