为什么不用Docker?
k8s
需要ContainerRuntime
来运行节点中的容器,随着越来越多的容器出现(docker
、containerd
…),在k8s 1.5
版本后推出了CRI
(ContainerRuntimeInterface,容器运行时接口)用于与容器交互,但只有遵循CRI
规范的容器才能与其交互,如containerd
,docekr
虽然使用containerd
作为后端,但docker
本身不遵循CRI
规范,所以需要加一个中间层dockershim
(已被移除,现在使用cri-dockerd
)来与docker
交互,既然containerd
遵循CRI
规范为什么不直接使用containerd
呢?
- 如果你想要更方便的单机使用容器,
docker
仍然是最好的选择 - 如果要用于
k8s
集群,containerd
或者CRI-O
或许是更好的选择
容器扫盲
-
Container Runtime Interface(CRI):
k8s
使用grpc
协议通信的容器运行时接口,k8s
可以与遵循CRI
规范的容器运行时交互 -
Open Container Initiative (OCI):OCI 开放容器倡议,维护容器镜像格式规范、容器如何运行,只要运行时符合
OCI
倡议的规范,例如使用Docker
在win
上可以跑的镜像,在Linux
用containerd
也能跑- 容器运行时规范: 定义了如何根据相应的配置构建容器运行时
- 容器镜像规范: 定义了容器运行时使用的镜像的打包规范
-
runc(libcontainer):符合
OCI
规范的容器执行器,或叫低级容器运行时,使用一个符合OCI
规范的容器即可通过runc
运行,是大多数容器运行时的底层容器执行器(低级运行时)实现,只关注容器创建、运行和与操作系统的交互,runc
使用Linux
内核的cgroups
、namespace
和其他特性来实现容器的隔离和资源管理 -
conatinerd:高级容器运行时,守护进程,专注于容器生命周期管理(创建、管理、销毁容器),遵循
OCI
规范,提供了容器的生命周期管理、镜像管理、存储和网络等核心功能- cri-containerd(containerd 2.0会删除):在
conatinerd:v1.0
需要cri-containerd
来与k8s的CRI
接口交互,conatinerd:v1.1
后通过CRI插件实现,只需要安装containerd
即可
- cri-containerd(containerd 2.0会删除):在
-
CRI-O:高级容器运行时,遵循
CRI
和OCI
规范,专为k8s
提供符合CRI
规范API的容器运行时 -
Docker:容器化平台,可以用来开发、运输、运行容器,运行容器实际上是使用
Containerd
和runc
来运行的- dockershim:由于
Docker
不遵循CRI
接口规范,k8s
与Docker
交互需要加这个中间层,这个中间层遵循CRI
规范 - cri-docker:
dockershim
已经从kubelet
中移除,dockershim
的替代品 - dockerd(Docker Daemon):守护进程,用于构建、运行、管理容器
- Docker Hub:官方镜像仓库
- docker cli:用于与容器、镜像交互的命令行工具
- dockershim:由于
-
Podman(Pod Manager):直接调用
runc
接口来管理容器的命令行工具,遵循OCI
规范,相当于docker cli
+dockerd
,大多数docker
命令换成podman
即可使用,如查看正在运行的容器:docker ps
->podman ps
- podman cli:命令行工具
- conmon:负责监控,日志,TTY 分配,以及类似
out-of-memory
情况的杂事
-
rkt(rocket):高级容器运行时,遵循
OCI
规范,已停止活跃开发rktlet
:遵循OCI规范的容器执行器
-
CRI-O:高级容器运行时,专为
k8s
设计的轻量级容器运行时,与containerd
同级,遵循CRI
和OCI
规范,底层使用runc
系统环境(Linux)
Debian12
一、安装Containerd
在线安装 containerd
#查看软件包
apt list | grep containerd
#安装
sudo apt-get install containerd.io
#卸载
sudo apt-get remove containerd
设置containerd开机自启动
systemctl enable containerd
systemctl start containerd
#查看状态
systemctl status containerd
检查
ctr version
离线安装 containerd
1、从 https://github.com/containerd/containerd/releases 下载最新版containerd(右键复制链接)
#下载
wget https://github.com/containerd/containerd/releases/download/v1.7.20/containerd-1.7.20-linux-amd64.tar.gz
#解压
tar Cxzvf /usr/local containerd-1.7.20-linux-amd64.tar.gz
#清理
rm containerd-1.7.20-linux-amd64.tar.gz
新建目录mkdir -p /usr/local/lib/systemd/system
新增加配置文件vim /usr/local/lib/systemd/system/containerd.service
# Copyright The containerd Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
[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
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999
[Install]
WantedBy=multi-user.target
然后执行
systemctl daemon-reload
systemctl enable --now containerd
2、安装 runc
从https://github.com/opencontainers/runc/releases下载最新版runc(右键复制链接)
#下载
wget https://github.com/opencontainers/runc/releases/download/v1.1.13/runc.amd64
#安装
install -m 755 runc.amd64 /usr/local/sbin/runc
#清理
rm runc.amd64
#检查
runc -v
3、安装 CNI 插件
从 https://github.com/containernetworking/plugins/releases 下载最新版CNI(右键复制链接)
#下载
wget https://github.com/containernetworking/plugins/releases/download/v1.5.1/cni-plugins-linux-amd64-v1.5.1.tgz
#新建目录
mkdir -p /opt/cni/bin
#解压
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.5.1.tgz
#清理
rm cni-plugins-linux-amd64-v1.5.1.tgz
检查
ctr version
二、自定义conatinerd
配置详情https://github.com/containerd/containerd/blob/main/docs/man/containerd-config.toml.5.md
生成默认配置
containerd config default > /etc/containerd/config.toml
三、containerd使用
- 单机运行的
conatinerd
使用内置的ctr
来执行命令 k8s
中的containerd
使用k8s
的命令行工具crictl
来执行命令- 只要是符合
OCI
规范的镜像就可以使用,比如docker
的镜像就可以直接使用
如查看本地镜像单机中使用ctr images ls
,在k8s
中使用crictl images ls
(ctr大多数命令crictl都不支持)
镜像命令
Docker | Containerd | 解释 |
---|---|---|
docker pull docker.io/library/nginx:latest | ctr i pull docker.io/library/nginx:latest | 下载镜像(一定要指定主机) |
docker images | ctr i ls orctr image list | 查看本地镜像 |
docker run --name mysql -v /opt/soft/mysql/log:/var/log/mysql mysql:5.7 | ctr i mount docker.io/library/nginx:latest /mnt | 挂载镜像 |
`` | umount /mnt | 解挂 |
docker save -o nginx.tar.gz nginx:latest | ctr i export nginx.tar.gz docker.io/library/nginx:latest | 导出镜像 |
docker load -i nginx.tar.gz | ctr i import nginx.tar.gz | 导入镜像 |
docker rmi docker.io/library/nginx:latest | ctr i rm docker.io/library/nginx:latest | 删除镜像 |
docker tag docker.io/library/nginx:latest nginx:latest | ctr i tag docker.io/library/nginx:latest nginx:latest | 修改镜像tag |
容器命令
Docker | Containerd | 解释 |
---|---|---|
docker ps -a | ctr conatiner ls orctr c ls | 查看静态容器列表 |
docker start mynginx | ctr task ls orctr t ls | 查看正在运行的容器 |
docker run nginx | ctr c create docker.io/library/nginx:latest nginx | 创建容器(静态容器,需要提前pull下载) |
docker rmi nginx | ctr c rm nginx | 删除静态容器 |
docker start nginx | ctr t start -d nginx | 启动静态容器为动态容器 |
docker stop mynginx | ctr t kill nginx | 停止容器 |
docker pause mynginx | ctr t pause nginx | 暂停容器 |
docker unpause mynginx | ctr t resume nginx | 恢复容器 |
docker rm mynginx | ctr t rm nginx | 删除容器进程 |
docker rm mynginx | ctr c rm nginx | 删除容器(先停再删) |
docker ps | ctr t ps nginx | 查看容器所有进程 |
docker exec -it mynginx /bin/sh | ctr t exec --exec-id 1 nginx /bin/sh | 进入容器 |
docker inspect mynginx | ctr c info nginx | 查看容器详细信息 |
docker run | ctr run | 创建并启动容器(动态容器) |
快照命令
Containerd | 解释 |
---|---|
ctr snapshot ls | 查看容器快照 |
ctr snapshot create <container_id> <snapshot_name> | 创建容器快照 |
ctr snapshot rm <snapshot_name> | 删除指定快照 |
ctr snapshot restore <snapshot_name> <new_container_id> | 恢复容器快照 |
命名空间命令
Containerd | 解释 |
---|---|
ctr namespace create k8s orctr ns create k8s | 创建命名空间 |
ctr ns default i ls | 查看默认命名空间的镜像 |
ctr ns rm k8s | 删除命名空间 |
ctr ns label k8s env=production | 为命名空间添加标签 |