容器管理工具Containerd

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 容器管理工具Containerd

阅读目录

回到顶部

一、Containerd介绍

1.前言

  • 早在2016年3月,Docker 1.11的Docker Engine里就包含了containerd,而现在则是把containerd从Docker Engine里彻底剥离出来,作为一个独立的开源项目独立发展,目标是提供一个更加开放、稳定的容器运行基础设施。和原先包含在Docker Engine里containerd相比,独立的containerd将具有更多的功能,可以涵盖整个容器运行时管理的所有需求。
  • containerd并不是直接面向最终用户的,而是主要用于集成到更上层的系统里,比如Swarm, Kubernetes, Mesos等容器编排系统。
  • containerd以Daemon的形式运行在系统上,通过暴露底层的gRPC API,上层系统可以通过这些API管理机器上的容器。
  • 每个containerd只负责一台机器,Pull镜像,对容器的操作(启动、停止等),网络,存储都是由containerd完成。具体运行容器由runC负责,实际上只要是符合OCI规范的容器都可以支持。
  • 对于容器编排服务来说,运行时只需要使用containerd+runC,更加轻量,容易管理。
  • 独立之后containerd的特性演进可以和Docker Engine分开,专注容器运行时管理,可以更稳定。

2.Containerd前世今生

2013年docker公司在推出docker产品后,由于其对全球技术产生了一定的影响力,Google公司明显感觉到自己公司内部所使用的Brog系统江湖地位受到的威胁,希望Docker公司能够与自己联合打造一款开源的容器运行时作为Docker核心依赖,但Docker公司拒绝了;接着Google公司联合RedHat、IBM等公司说服Docker公司把其容器核心技术libcontainer捐给中立社区(OCI,Open Container Intiative),并更名为runC。 为了进一步遏制Docker在未来技术市场影响力,避免在容器市场上Docker一家独大,Google公司带领导RedHat、IBM等成立了CNCF(Cloud Native Computing Fundation)基金会,即云原生计算基金会。CNCF的目标很明确,既然在容器应用领域无法与Docker相抗衡,那就做Google更有经验的技术市场------大规模容器编排应用场景,Google公司把自己内部使用的Brog系统开源------Kubernetes,也就是我们今天所说的云原生技术生态。

2016年Docker公司推出了Docker Swarm,意在一统Docker生态,让Docker既可以实现容器应用管理,也可以实现大规模容器编排,经过近1年左右时间的市场验证后,发现在容器编排方面无法独立抗衡kubernetes,所以Docker公司于2017年正式宣布原生支持Kubernetes,至此,Docker在大规模容器编排应用市场败下阵来,但是Docker依然不甘心失败,把Docker核心依赖Containerd捐给了CNCF,依此说明Docker依旧是一个PaaS平台。

2020年CNCF基金会宣布Kubernetes 1.20版本将不再仅支持Docker容器管理工具,此事的起因主要也与Docker捐给CNCF基金会的Containerd有关,早期为了实现Kubernetes能够使用Docker实现容器管理,专门在Kubernetes组件中集成一个shim(垫片)技术,用来将Kubernetes容器运行时接口(CRI,Container Runntime Interface)调用翻译成Docker的API,这样就可以很好地使用Docker了,但是随着Kubernetes在全球技术市场的广泛应用,有更多的容器管理工具的出现,它们都想能够借助于Kubernetes被用户所使用,所以就提出标准化容器运行时接口,只要适配了这个接口就可以集成到Kubernetes生态当中,所以Kubernetes取消了对shim的维护,并且由于Containerd技术的成功,可以实现无缝对接Kubernetes,所以接下来Kubernetes容器运行时的主角是Containerd。

3.Containerd架构

3.1 架构图

Containerd设计的目的是为了嵌入到Kubernetes中使用,它是一个工业级的容器运行时,不提供给开发人员和终端用户直接使用,这样就避免了与Docker产生竞争,但事实上,Containerd已经实现大多数容器管理功能,例如:容器生命周期管理、容器镜像传输和管理、容器存储与网络管理等。

  • Containerd 采用标准的 C/S 架构
  • 服务端通过 GRPC 协议提供稳定的 API
  • 客户端通过调用服务端的 API 进行高级的操作
  • 为了实现解耦,Containerd 将不同的职责划分给不同的组件,每个组件就相当于一个子系统(subsystem)。连接不同子系统的组件被称为模块。
  • Containerd 两大子系统为:
  • Bundle : 在 Containerd 中,Bundle 包含了配置、元数据和根文件系统数据,你可以理解为容器的文件系统。而 Bundle 子系统允许用户从镜像中提取和打包 Bundles。
  • Runtime : Runtime 子系统用来执行 Bundles,比如创建容器。
  • 其中,每一个子系统的行为都由一个或多个模块协作完成(架构图中的 Core 部分)。每一种类型的模块都以插件的形式集成到 Containerd 中,而且插件之间是相互依赖的。
    例如,上图中的每一个长虚线的方框都表示一种类型的插件,包括 Service Plugin、Metadata Plugin、GC Plugin、Runtime Plugin 等,其中 Service Plugin 又会依赖 Metadata Plugin、GC Plugin 和 Runtime Plugin。每一个小方框都表示一个细分的插件,例如 Metadata Plugin 依赖 Containers Plugin、Content Plugin 等。

3.2 常用插件

  • Content Plugin : 提供对镜像中可寻址内容的访问,所有不可变的内容都被存储在这里。
  • Snapshot Plugin : 用来管理容器镜像的文件系统快照。镜像中的每一个 layer 都会被解压成文件系统快照,类似于 Docker 中的 graphdriver
  • Metrics : 暴露各个组件的监控指标。

3.3 架构缩略图

Containerd 被分为三个大块:StorageMetadataRuntime

3.4 与其它容器运行时工具性能对比

这是使用 bucketbench 对 Docker、crio 和 Containerd 的性能测试结果,包括启动、停止和删除容器,以比较它们所耗的时间:

结论: Containerd 在各个方面都表现良好,总体性能优于 Dockercrio

回到顶部

二、Containerd安装

操作系统: CentOS7.6

1.YUM方式安装

1.获取阿里云YUM源
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2.查看YUM源中Containerd软件
yum makecache fast
yum list | grep containerd
containerd.io.x86_64                        1.6.27-3.1.el7             docker-ce-stable
3.安装Containerd.io软件,即可安装Containerd
yum -y install containerd.io-1.6.27  
4.使用rpm -qa命令查看是否安装
rpm -qa | grep containerd
containerd.io-1.6.27-3.1.el7.x86_64
5.设置containerd服务启动及开机自启动
systemctl enable containerd
systemctl start containerd
systemctl status containerd
6.验证
# 安装Containerd时ctr命令亦可使用,ctr命令主要用于管理容器及容器镜像等。
ctr version #使用ctr命令查看Containerd客户端及服务端相关信息
Client:
  Version:  1.6.27
  Revision: a1496014c916f9e62104b33d1bb5bd03b0858e59
  Go version: go1.20.13
Server:
  Version:  1.6.27
  Revision: a1496014c916f9e62104b33d1bb5bd03b0858e59
  UUID: 598e20b7-9fe2-4b93-8705-ad9a74eb6501

2.二进制方式安装

Containerd有两种安装包:

第一种是containerd-xxx,这种包用于单机测试没问题,不包含runC,需要提前安装。


第二种是cri-containerd-cni-xxxx,包含runc和k8s里的所需要的相关文件。k8s集群里需要用到此包。虽然包含runC,但是依赖系统中的seccomp(安全计算模式,是一种限制容器调用系统资源的模式。)

2.1 安装Containerd

下载地址:https://github.com/containerd/containerd/releases根据系统及平台下载对应的安装包

1.下载Containerd安装包
wget https://github.com/containerd/containerd/releases/download/v1.7.12/cri-containerd-cni-1.7.12-linux-amd64.tar.gz #此处是下载的第二种
2.安装containerd
mkdir containerd
tar xf cri-containerd-cni-1.7.12-linux-amd64.tar.gz -C containerd/
cd containerd/
ls
cri-containerd.DEPRECATED.txt  etc  opt  usr
tree
.
├── cri-containerd.DEPRECATED.txt
├── etc    #etc目录主要为containerd服务管理配置文件及cni虚拟网卡配置文件
│   ├── cni
│   │   └── net.d
│   │       └── 10-containerd-net.conflist
│   ├── crictl.yaml
│   └── systemd
│       └── system
│           └── containerd.service
├── opt   #opt目录主要为gce环境中使用containerd配置文件及cni插件
│   ├── cni
│   │   └── bin
│   │       ├── bandwidth
│   │       ├── bridge
│   │       ├── dhcp
│   │       ├── dummy
│   │       ├── firewall
│   │       ├── host-device
│   │       ├── host-local
│   │       ├── ipvlan
│   │       ├── loopback
│   │       ├── macvlan
│   │       ├── portmap
│   │       ├── ptp
│   │       ├── sbr
│   │       ├── static
│   │       ├── tuning
│   │       ├── vlan
│   │       └── vrf
│   └── containerd
│       └── cluster
│           ├── gce
│           │   ├── cloud-init
│           │   │   ├── master.yaml
│           │   │   └── node.yaml
│           │   ├── cni.template
│           │   ├── configure.sh
│           │   └── env
│           └── version
└── usr   usr目录主要为containerd运行时文件,包含runc
    └── local
        ├── bin
        │   ├── containerd
        │   ├── containerd-shim
        │   ├── containerd-shim-runc-v1
        │   ├── containerd-shim-runc-v2
        │   ├── containerd-stress
        │   ├── crictl
        │   ├── critest
        │   ├── ctd-decoder
        │   └── ctr
        └── sbin
            └── runc
#查看containerd.service文件,了解containerd文件安装位置
 cat etc/systemd/system/containerd.service
ExecStart=/usr/local/bin/containerd  查看此位置,把containerd二进制文件放置于此处即可完成安装。
#复制containerd运行时文件至系统
cp usr/local/bin/* /usr/local/bin/
#添加containerd.service文件至系统
cp etc/systemd/system/containerd.service /usr/lib/systemd/system/containerd.service
#  生成containerd模块配置文件,可以自定义一下配置,如有私有镜像仓库等,按需
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
cat /etc/containerd/config.toml
#启动containerd并验证
systemctl enable containerd
systemctl start containerd
systemctl status containerd
ctr version
Client:
  Version:  v1.7.12
  Revision: 71909c1814c544ac47ab91d2e8b84718e517bb99
  Go version: go1.20.13
Server:
  Version:  v1.7.12
  Revision: 71909c1814c544ac47ab91d2e8b84718e517bb99
  UUID: 57f57a6b-0a50-4579-8b69-0d7daefe2b16

2.2 安装runC

下载地址:https://github.com/opencontainers/runc/releases

由于二进制包中提供的runC默认需要系统中安装seccomp支持,需要单独安装,且不同版本runC对seccomp版本要求一致,所以建议单独下载runC 二进制包进行安装,里面包含了seccomp模块支持

wget https://github.com/opencontainers/runc/releases/download/v1.1.11/runc.amd64

mv runc.amd64 /usr/sbin/runc

chmod +x /usr/sbin/runc

runc -v

回到顶部

三、Containerd容器镜像管理

* docker使用docker images命令管理镜像
* 单机containerd使用ctr images命令管理镜像,containerd本身的CLI
* k8s中containerd使用crictl images命令管理镜像,Kubernetes社区的专用CLI工具
#命令及子命令帮助
ctr --help
ctr images --help
1.查看镜像
ctr images ls
2.下载镜像
# containerd支持oci标准的镜像,所以可以直接使用docker官方或dockerfile构建的镜像
ctr images pull --all-platforms docker.io/library/nginx:alpine #这里ctr命令pull镜像时,不能直接把镜像名字写成nginx:alpine
ctr images pull --platform linux/amd64 docker.io/library/nginx:alpine # 指定平台下载容器镜像
3.镜像挂载(查看镜像中包含的内容)
ctr images mount docker.io/library/nginx:alpine /mnt
ls /mnt
umount /mnt 卸载
4.镜像导出
ctr i export --all-platforms nginx.img docker.io/library/nginx:alpine  #--all-platforms,导出所有平台镜像
5.镜像删除
ctr image rm docker.io/library/nginx:alpine
6.镜像导入
ctr images import nginx.img
7.修改镜像tag
ctr images tag docker.io/library/nginx:alpine nginx:alpine #把docker.io/library/nginx:alpine 修改为 nginx:alpine

回到顶部

四、Containerd容器管理

1.获取命令帮助
ctr --help #ctr命令帮助
ctr container --help #获取创建静态容器命令帮助   使用`ctr container create `命令创建容器后,容器并没有处于运行状态,其只是一个静态的容器。这个 container 对象只是包含了运行一个容器所需的资源及配置的数据结构,例如: namespaces、rootfs 和容器的配置都已经初始化成功了,只是用户进程(本案例为nginx)还没有启动。需要使用`ctr tasks`命令才能获取一个动态容器。
 ctr run --help # 使用`ctr run`命令可以创建一个静态容器并使其运行。一步到位运行容器。
2.查看容器(container表示静态容器,可用c缩写代表container)
ctr container ls # 可以简写为 ctr c ls
3.查看任务(task表示容器里跑的进程, 可用t缩写代表task)
ctr task ls # 可以简写为 ctr t ls
4.创建静态容器
ctr c create docker.io/library/nginx:alpine nginx1
ctr container ls
ctr container info nginx1 #查看容器详细信息
5.静态容器启动为动态容器
ctr task start -d nginx1 #启动task,即表时在容器中运行了进程,即为动态容器 -d 后台
ctr task ls #容器是以宿主机进程的方式存在的
TASK      PID      STATUS    
nginx1    63911    RUNNING
ps aux|grep 63911
root      63911  0.0  0.0   8888  3264 ?        Ss   16:29   0:00 nginx: master process nginx -g daemon off;
root      64055  0.0  0.0 112724   988 pts/0    S+   16:38   0:00 grep --color=auto 63911
6.进入容器操作
ctr task exec --exec-id $RANDOM -t nginx1 /bin/sh #为exec进程设定一个id,可以随意输入,只要保证唯一即可,也可使用$RANDOM变量
7.直接运行一个动态容器
ctr run -d --net-host docker.io/library/nginx:alpine nginx2  # --net-host 代表容器的IP就是宿主机的IP(相当于docker里的host类型网络)
8.暂停容器
ctr tasks pause nginx2 
ctr tasks ls  #状态为PAUSED,表示暂停
TASK      PID     STATUS
nginx2    4061    PAUSED
9.恢复容器
ctr tasks resume nginx2
10.停止容器
ctr tasks kill nginx2
ctr tasks ls #容器停止后STATUS为STOPPED
11.删除容器
ctr tasks delete nginx2 #必须先停止tasks或先删除task,再删除容器
ctr container ls # 查看静态容器,确认其还存在于系统中
ctr container delete nginx2

回到顶部

五、Containerd使用私有容器镜像仓库 Harbor

1.手动在containerd宿主机上添加此配置信息,如果域名解析已存在忽略
vim /etc/hosts
192.168.1.101 my.harbor.com
2.修改Containerd配置文件 # 其他版本可能配置不同
vim /etc/containerd/config.toml
      [plugins."io.containerd.grpc.v1.cri".registry.configs]
        [plugins."io.containerd.grpc.v1.cri".registry.configs."my.harbor.com:8443".tls]
          insecure_skip_verify = true
        [plugins."io.containerd.grpc.v1.cri".registry.configs."my.harbor.com:8443".auth]
          username = "admin"
          password = "NEoCN0YjdGr"
3. 重启服务
systemctl restart containerd
4.测试
ctr images tag docker.io/library/nginx:latest  my.harbor.com/library/nginx:latest
ctr image push --user "admin:NEoCN0YjdGr" --skip-verify  my.harbor.com/library/nginx:latest
#如果没有使用https可以使用--plain-http 指定http协议

回到顶部

六、Containerd NameSpace管理

containerd中namespace的作用为:隔离运行的容器,可以实现运行多个容器

1.列出已有namespace
ctr namespace ls  #ctr默认有两个 crictl 是只有一个k8s.io
NAME    LABELS
default
k8s.io
2.创建namespace
ctr namespace create myns
3.删除namespace
ctr namespace rm myns
4.查看指定namespace中是否有用户进程在运行
ctr -n myns tasks ls
5.在指定namespace中下载容器镜像
 ctr -n myns images pull docker.io/library/nginx:latest
6.在指定namespace中创建静态容器
ctr -n myns  container create docker.io/library/nginx:latest nginxapp
7.查看在指定namespace中创建的容器
ctr -n myns  container ls

七、Containerd Network管理

默认Containerd管理的容器仅有lo网络,无法访问容器之外的网络,可以为其添加网络插件,使用容器可以连接外网。CNI(Container Network Interface)

下载地址:https://github.com/containernetworking/cni/releases

1.CNI及其插件
wget https://github.com/containernetworking/cni/archive/refs/tags/v1.1.2.tar.gz
wget https://github.com/containernetworking/plugins/releases/download/v1.4.0/cni-plugins-linux-amd64-v1.4.0.tgz
tar xf cni-1.1.2.tar.gz 
mkdir cni-plugins
tar xf cni-plugins-linux-amd64-v1.4.0.tgz -C cni-plugins
2.准备CNI网络配置文件(配置文件用于为容器提供网关、IP地址等)
vim /etc/cni/net.d/10-mynet.conf # 创建名为mynet的网络,其中包含名为cni0的网桥
{
  "cniVersion": "1.0.0",
  "name": "mynet",
  "type": "bridge",
  "bridge": "cni0",
  "isGateway": true,
  "ipMasq": true,
  "ipam": {
    "type": "host-local",
    "subnet": "10.1.0.0/16",
    "routes": [
      { "dst": "0.0.0.0/0" }
   ]
  }
}
vim /etc/cni/net.d/99-loopback.conf 
{
  "cniVerion": "1.0.0",
  "name": "lo",
  "type": "loopback"
}
3.生成CNI网络
yum -y install jq #需要epel源
cd cni-1.1.2/scripts/  # 必须在scripts目录中执行
CNI_PATH=/root/cni-plugins ./priv-net-run.sh echo "Hello World"
ip a # 在宿主机上查看是否生成容器网络名为cni0的网桥
......
5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether f6:5e:44:24:d1:bb brd ff:ff:ff:ff:ff:ff
    inet 10.1.0.1/16 brd 10.1.255.255 scope global cni0
       valid_lft forever preferred_lft forever
    inet6 fe80::f45e:44ff:fe24:d1bb/64 scope link 
       valid_lft forever preferred_lft forever
ip route  # 在宿主机上查看其路由表情况
default via 192.168.0.2 dev ens32 proto static metric 100
10.1.0.0/16 dev cni0 proto kernel scope link src 10.1.0.1
192.168.0.0/24 dev ens32 proto kernel scope link src 192.168.0.134 metric 100
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
4.为Containerd容器配置网络功能
ctr images pull docker.io/library/busybox:latest
ctr run -d docker.io/library/busybox:latest busybox
ctr tasks exec --exec-id $RANDOM -t busybox sh
/ # ip a s   #当前只有lo网卡
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
exit #退出容器
5.获取容器进程ID及其网络命名空间
pid=$(ctr tasks ls | grep busybox | awk '{print $2}')
netnspath=/proc/$pid/ns/net
6.为指定容器添加网络配置
CNI_PATH=/root/cni-plugins ./exec-plugins.sh add $pid $netnspath # 在script目录中执行
7.验证
ctr tasks exec --exec-id $RANDOM -t busybox sh
/ # ip a  #查看是否新增网卡及配置
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 9e:67:68:44:46:21 brd ff:ff:ff:ff:ff:ff
    inet 10.1.0.3/16 brd 10.1.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::9c67:68ff:fe44:4621/64 scope link 
       valid_lft forever preferred_lft forever
/ # ping 192.168.0.134 -c 1 # 在容器中ping容器宿主机IP地址
PING 192.168.0.134 (192.168.0.134): 56 data bytes
64 bytes from 192.168.0.134: seq=0 ttl=64 time=0.048 ms
/ # ping 192.168.0.2 -c 1 # 在容器中ping宿主机所在网络的网关IP地址
PING 192.168.0.2 (192.168.0.2): 56 data bytes
64 bytes from 192.168.0.2: seq=0 ttl=127 time=0.217 ms
/ # ping 192.168.0.133 -c 1 # 在容器中ping宿主机所在网络中的其它主机IP地址
PING 192.168.0.133 (192.168.0.133): 56 data bytes
64 bytes from 192.168.0.133: seq=0 ttl=63 time=0.714 ms
# 在容器中开启httpd服务
/ # echo "containerd net web test" > /tmp/index.html
/ # httpd -h /tmp
/ # wget -O - -q 127.0.0.1
containerd net web test
/ # exit
#在宿主机访问容器提供的httpd服务
curl http://10.1.0.3
containerd net web test

回到顶部

八、Containerd容器数据持久化存储

实现把宿主机目录挂载至Containerd容器中,实现容器数据持久化存储

ctr container create docker.io/library/busybox:latest busybox3 --mount type=bind,src=/tmp,dst=/hostdir,options=rbind:rw  # src=/tmp 为宿主机目录
dst=/hostdir 为容器中目录
ctr tasks start -d busybox3 bash
 ctr tasks exec --exec-id $RANDOM -t busybox3 sh
/ # ls /hostdir
/ # echo "hello world" > /hostdir/test.txt #写入测试文件
/ # exit
# 在宿主机上查看被容器挂载的目录中是否添加了新的文件,已添加表明被容器挂载成功,并可以读写此目录中内容
cat /tmp/test.txt
hello world

回到顶部

九、与其它Containerd容器共享命名空间

当需要与其它Containerd管理的容器共享命名空间时,可使用如下方法。

ctr tasks ls|grep busybox
busybox    66658    RUNNING
ctr container create --with-ns "pid:/proc/66658/ns/pid" docker.io/library/busybox:latest busybox2  # 注意此处的pid应当为你要共享容器的task的pid
ctr tasks exec --exec-id $RANDOM -t busybox sh
/ # ps #新容器启动前查看共享容器进程信息
PID   USER     TIME  COMMAND
    1 root      0:00 sh
   25 root      0:00 httpd -h /tmp
   43 root      0:00 sh
   50 root      0:00 ps
/ # exit
ctr tasks start -d busybox
ctr tasks exec --exec-id $RANDOM -t busybox sh
/ # ps #新容器启动后查看共享容器进程信息,可以看到多了一个sh进程
PID   USER     TIME  COMMAND
    1 root      0:00 sh
   25 root      0:00 httpd -h /tmp
   51 root      0:00 sh
   57 root      0:00 sh
   63 root      0:00 ps
/ # exit
 ctr tasks exec --exec-id $RANDOM -t busybox2 sh #新容器进程信息与共享容器一致
/ # ps
PID   USER     TIME  COMMAND
    1 root      0:00 sh
   25 root      0:00 httpd -h /tmp
   51 root      0:00 sh
   57 root      0:00 sh
   63 root      0:00 ps

回到顶部

十、Docker集成Containerd实现容器管理

目前Containerd主要任务还在于解决容器运行时的问题,对于其周边生态还不完善,所以可以借助Docker结合Containerd来实现Docker完整的功能应用。

1.安装Docker-ce YUM源
# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 yum -y install docker-ce
2.修改docker配置文件
vim /etc/systemd/system/multi-user.target.wants/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 
此处修改为
ExecStart=/usr/bin/dockerd --containerd  /run/containerd/containerd.sock --debug
systemctl daemon-reload
systemctl enable docker
systemctl start docker
systemctl status docker
ps aux | grep docker
docker run --name nginx1 -d nginx:latest
docker ps
ctr namespace ls # 使用ctr查看是否添加一个新的namespace,本案例中发现添加一个moby命名空间,即为docker使用的命名空间
NAME    LABELS
default
k8s.io
moby  #docker使用的命名空间
ctr -n moby container ls
CONTAINER                                                           IMAGE    RUNTIME                  
aa1c3d248ef49ab88a7379ddd6bf56c7b8edc2a2a3a0a482735a961badd5d9df    -        io.containerd.runc.v2    
ctr -n moby tasks ls
TASK                                                                PID      STATUS    
aa1c3d248ef49ab88a7379ddd6bf56c7b8edc2a2a3a0a482735a961badd5d9df    68052    RUNNING
docker stop aa1c3d248ef4 && docker rm aa1c3d248ef4 #删除容器再观察是否还有新创建容器的信息
ctr -n moby container ls
ctr -n moby tasks ls
相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
4天前
|
Kubernetes Docker 容器
容器运行时Containerd k8s
容器运行时Containerd k8s
16 2
|
1月前
|
Ubuntu Linux pouch
Docker容器管理工具
文章介绍了Docker容器管理工具,以及早期使用的LXC容器管理工具,包括它们的安装、使用和相关技术特点。
51 10
Docker容器管理工具
|
1月前
|
存储 Docker 容器
containerd容器运行时快速入门使用指南
关于containerd容器运行时的快速入门使用指南,涵盖了镜像管理、容器管理、NameSpace管理、数据持久化、镜像推送至Harbor仓库以及Docker与Containerd集成等内容。
57 1
containerd容器运行时快速入门使用指南
|
1月前
|
Linux pouch 容器
CentOS7部署阿里巴巴开源的pouch容器管理工具实战
关于如何在CentOS 7.6操作系统上安装和使用阿里巴巴开源的Pouch容器管理工具的实战教程。
73 2
CentOS7部署阿里巴巴开源的pouch容器管理工具实战
|
3天前
|
运维 Prometheus 监控
提升运维效率:容器化技术与自动化工具的结合
在当今信息技术飞速发展的时代,运维工作面临着前所未有的挑战。为了应对这些挑战,本文将探讨如何通过结合容器化技术和自动化工具来提升运维效率。我们将介绍容器化技术的基本概念和优势,然后分析自动化工具在运维中的应用,并给出一些实用的示例。通过阅读本文,您将了解到如何利用这些先进技术来优化您的运维工作流程,提高生产力。
|
2月前
|
Prometheus Kubernetes 监控
揭秘Kubernetes的秘密武器库:十大工具让你的容器编排如虎添翼!探索这些神秘而强大的工具,它们将如何彻底改变你的Kubernetes体验?
【8月更文挑战第19天】在容器世界里,Kubernetes是部署与管理容器化应用的首选平台。为了增强其功能,本文精选了十大必备工具:Helm简化复杂应用部署;Prometheus监控系统与应用指标;Grafana提供数据可视化;Fluentd统一日志管理;Envoy实现服务间通信与控制;Calico确保网络连接安全;CoreDNS提升DNS服务性能;Velero保障数据安全与迁移;Argo Workflows执行复杂工作流;Istio强化服务网格功能。这些工具覆盖部署、监控、日志等多个方面,助力提升Kubernetes的效率与稳定性。
39 3
|
2月前
|
Kubernetes Unix Linux
k8s将节点容器运行时从Docker迁移到Containerd
k8s将节点容器运行时从Docker迁移到Containerd
|
2月前
|
Kubernetes 监控 Shell
在K8S中,我们公司用户反应pod连接数非常多,希望看一下这些连接都是什么信息?什么状态?怎么排查?容器里面没有集成bash环境、网络工具,怎么处理?
在K8S中,我们公司用户反应pod连接数非常多,希望看一下这些连接都是什么信息?什么状态?怎么排查?容器里面没有集成bash环境、网络工具,怎么处理?
|
2天前
|
存储 监控 Shell
docker的底层原理二:容器运行时环境
本文深入探讨了Docker容器运行时环境的关键技术,包括命名空间、控制组、联合文件系统、容器运行时以及分离的进程树,这些技术共同确保了容器的隔离性、资源控制和可移植性。
13 5
|
9天前
|
Kubernetes Cloud Native 持续交付
云原生之旅:Docker容器化与Kubernetes集群管理
【9月更文挑战第33天】在数字化转型的浪潮中,云原生技术如同一艘航船,带领企业乘风破浪。本篇文章将作为你的航海指南,从Docker容器化的基础讲起,直至Kubernetes集群的高级管理,我们将一起探索云原生的奥秘。你将学习到如何封装应用、实现环境隔离,以及如何在Kubernetes集群中部署、监控和扩展你的服务。让我们启航,驶向灵活、可伸缩的云原生未来。