Docker 發(fā)展歷程
2013 年圾叼,隨著PaaS發(fā)展壯大,這個領(lǐng)域的從業(yè)者們發(fā)現(xiàn)了 PaaS 中最為棘手也最亟待解決的一個問題:究竟如何給應(yīng)用打包转绷?無論是 Cloud Foundry撞蚕、OpenShift蛙粘,還是 Clodify随闽,面對這個問題都沒能給出一個完美的答案父丰。一個并不引人矚目的 PaaS 創(chuàng)業(yè)公司 dotCloud,卻選擇了開源自家的一個容器項目 Docker橱脸,正好提供了一種非常便利的打包機制,然后就一發(fā)不可收拾分苇,圍繞著 Docker 項目進(jìn)行集成與創(chuàng)新涌現(xiàn)出來添诉,包括Mesosphere公司的Mesos項目等等,Docker 公司也順勢推出了Docker Compose医寿、Swarm 和 Machine“三件套”栏赴,docker生態(tài)圈很快發(fā)展起來了,開啟了一個新的容器時代靖秩。
2014年6月须眷,谷歌公司正式宣告了Kubernetes項目的誕生。這個時候容器出現(xiàn)多樣化沟突,包括google公司lmctfy容器花颗,coreos的rkt容器。Google公司提出和Docker合作惠拭,與Docker公司共同推進(jìn)一個中立的容器運行時庫作為Docker項目的核心依賴扩劝。此時Docker并不擔(dān)心,因為它維護的 Docker 社區(qū)也足夠龐大职辅,Docker項目已是容器生態(tài)的標(biāo)準(zhǔn)棒呛。于是,2015 年 6 月 22 日域携,由 Docker 公司牽頭簇秒,CoreOS、Google秀鞭、RedHat 等公司共同宣布趋观,Docker 公司將 Libcontainer 捐出,并改名為 RunC 項目锋边,交由一個完全中立的基金會管理拆内,然后以 RunC 為依據(jù),大家共同制定一套容器和鏡像的標(biāo)準(zhǔn)和規(guī)范宠默,這就是OCI麸恍。明顯OCI的成立容器玩家們出于自身利益進(jìn)行干涉的一個妥協(xié)結(jié)果,所以盡管Docker 是 OCI 的發(fā)起者和創(chuàng)始成員,但并沒有很積極的去推動抹沪,Docker注重是它商業(yè)價值刻肄。
2015年12月11日,Google融欧、RedHat 等開源基礎(chǔ)設(shè)施領(lǐng)域玩家們敏弃,共同牽頭發(fā)起了一個名為 CNCF(Cloud Native Computing Foundation)的基金,主要是以kubernetes項目為基礎(chǔ)打造一個平臺級生態(tài)噪馏。由于Kubernates項目煥然一新的設(shè)計理念和號召力麦到,2016年以后kubernates社區(qū)得到了空前的發(fā)展。
2016年6月欠肾,Docker v.1.12發(fā)布瓶颠,直接內(nèi)置Docker Swarm(多主機多容器的編排解決方案)
2016年12月, Kubernetes 發(fā)布 CRI (Container Runtime Interface刺桃, 容器運行時接口)
2017年粹淋,Docker 分拆了 Containerd,支持CNI瑟慈,將這個組件分解為一個單獨的項目桃移,使得 Docker 將容器的管理功能移出 Docker 引擎,并移入一個單獨的守護進(jìn)程中葛碧,即 Containerd借杰,并將其捐贈給了CNCF社區(qū)。同時Docker公司宣布將Docker項目改名為Moby进泼,交給社區(qū)自行維護第步。
2017年10月,Docker公司將自己的主打產(chǎn)品Docker EE 內(nèi)置Kubernetes項目缘琅,預(yù)示著Kubernetes的勝出粘都,成為容器編排的標(biāo)準(zhǔn)。
2017年11月 刷袍,K8s支持containerd
2018年 k8s集成containerd翩隧,正式GA,把CRI plugin嵌入 containerd中
2019年 rkt 終止使命被CNCF歸檔
2019 年 Mirantis 收購 Docker 的企業(yè)服務(wù)
OCI
OCI 代表開放容器標(biāo)準(zhǔn)呻纹, 它標(biāo)準(zhǔn)化了容器工具和底層實現(xiàn)(technologies)之間的大量接口堆生。 他們維護了打包容器鏡像(OCI image-spec)和運行容器(OCI runtime-spec)的標(biāo)準(zhǔn)規(guī)范。 他們還以 runc 的形式維護了一個 runtime-spec 的真實實現(xiàn)雷酪, 這也是 containerd 和 CRI-O 依賴的默認(rèn)運行時淑仆。 CRI 建立在這些底層規(guī)范之上,為管理容器提供端到端的標(biāo)準(zhǔn)
CRI
全稱Container Runtime Interface哥力,(容器運行時接口)是一個用來擴展容器運行時的接口蔗怠,能讓 kubelet 無需重新編譯就可以廣泛使用各種容器運行時的插件接口墩弯。CRI 由 protocol buffers 和 gRPC API 還有 streaming 庫構(gòu)成。用戶不需要關(guān)心內(nèi)部通信邏輯寞射,而只需要實現(xiàn)定義的接口就可以渔工,包括 RuntimeService 和 ImageService。
容器就是Docker?
其實準(zhǔn)確來講桥温,Docker和容器不是一回事引矩,但Docker普及了Linux容器這種技術(shù)模式,并在開發(fā)底層技術(shù)方面發(fā)揮了重要作用侵浸。 容器的生態(tài)相比于單純的 Docker旺韭,已經(jīng)進(jìn)化到了一個更寬廣的領(lǐng)域
棄用Docker
2020年 Kubernates 宣布移除dockershim,現(xiàn)在1.20版本以后掏觉,能使用但是kubelet會打印警告日志区端。最新消息dockershim 計劃在 Kubernetes 1.24 版被移除, 請參閱移除 Kubernetes 增強方案 Dockershim
容器運行時
主流的容器運行時有 containerd履腋,docker engine珊燎,cri-o惭嚣,Mirantis Container Runtime(商業(yè)版)
CRI | 維護者 | 主要特性 | 容器引擎 | 描述 |
---|---|---|---|---|
dockershim | Kubernetes | 內(nèi)置實現(xiàn)遵湖、特性最新 | Docker | 后面被廢棄了 |
cri-o | cri-o | OCI 標(biāo)準(zhǔn)不需要 Docker | OCI(runc、kata晚吞、gVisor…) | |
cri-containerd | Containerd | OCI 標(biāo)準(zhǔn)不需要 Docker | OCI(runc延旧、kata、gVisor…) | 主流的槽地,使用最廣泛 |
cri-dockerd | Mirantis | 內(nèi)置實現(xiàn) | Docker EE | 商業(yè)版迁沫,前身是Docker EE |
Containerd
Containerd是一個工業(yè)標(biāo)準(zhǔn)的容器運行時,它強調(diào)簡單性捌蚊、健壯性和可移植性集畅。它可以在宿主機中管理完整的容器生命周期:容器鏡像的傳輸和存儲、容器的執(zhí)行和管理缅糟、存儲和網(wǎng)絡(luò)等挺智,是目前適用最廣泛。
安裝
yum install containerd.io #使用yum 直接安裝
# 也可以直接從 github 下載 containerd 包窗宦,然后解壓
# 網(wǎng)址:https://github.com/containerd/containerd/releases
#查看版本
containerd -v
#查看幫助命令
containerd -h
配置
Containerd 的配置文件默認(rèn)為 /etc/containerd/config.toml[^ssh-copy-id]
containerd config default > /etc/containerd/config.toml #生成配置文件
#配置cgroup driver 為 systemd
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
...
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
#配置鏡像倉庫
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://registry-1.docker.io"]
[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.configs."docker.io".auth]
username = "xxxx"
password = "xxxx"
#把docker.io 換成內(nèi)部鏡像倉庫
每一個頂級配置塊的命名都是 plugins."io.containerd.xxx.vx.xxx" 這種形式赦颇,表示一個插件,其中 io.containerd.xxx.vx 表示插件的類型赴涵,vx 后面的 xxx 表示插件的 ID媒怯,我們可以通過 ctr plugin ls 查看插件列表
#設(shè)置開啟啟動
systemctl enable cotnainerd
#啟動
systemctl start containerd
#查看狀態(tài)
systemctl status containerd
存儲
containerd 將容器相關(guān)的數(shù)據(jù)持久化在 /var/lib/containerd/中(docker 默認(rèn)在 /var/lib/docker/)
如何使用
containerd 提供ctr CLI。
containerd 相比docker, 多了namespace概念, 每個image和container 都會在各自的namespace下可見, 目前k8s會使用k8s.io 作為命名空間髓窜。
命名空間管里
ctr ns ls #查看命名空間列表扇苞,ctr ns -h 查看管理命名空間的相關(guān)命令
export CONTAINERD_NAMESPACE=k8s.io #修改默認(rèn)命名空間
鏡像管理
不支持build,commit 鏡像
ctr i ls #查看鏡像列表,ctr i -h查看管理鏡像的相關(guān)命令
#拉取鏡像
ctr -n k8s.io i pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 #
#鏡像標(biāo)記tag
ctr -n k8s.io i tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2 # tag鏡像
#鏡像導(dǎo)入
ctr -n k8s.io i import kube-apiserver.tar #從tar 文件導(dǎo)入鏡像杨拐,tar可以由docker save
#鏡像導(dǎo)出
ctr -n k8s.io i export pause.tar k8s.gcr.io/pause:3.2 #
#鏡像推送
ctr -n k8s.io i push -k k8s.gcr.io/pause:3.2
容器管理
容器時依賴task祈餐,task 管理容器,刪除容器哄陶,得先終止task
ctr c ls # 查看容器列表帆阳, ctr c -h 查看管理容器 的相關(guān)命令
#運行容器
ctr run -d nginx:1.21 nginx1 #運行容器,有下面兩步組成
#創(chuàng)建容器
ctr c create nginx:1.21 nginx1
#創(chuàng)建任務(wù)指定容器
ctr task start -d nginx1
#進(jìn)入容器
ctr task exec --exec-id $RANDOM -t nginx1 sh #相當(dāng)于docker exec
#刪除容器
ctr task kill nginx1 #終止任務(wù) 相當(dāng)于 docker stop
ctr c rm nginx1 #刪除容器 相當(dāng)于 docker rm
#容器暫停/繼續(xù)
ctr task pause nginx1 #暫停任務(wù) 相當(dāng)于docker pause
ctr task resume nginx1 #恢復(fù)任務(wù)
#日志查看
ctr event nginx1
#復(fù)制容器文件
ctr snapshot mounts /usr/share/nginx/html
CRI Tools
CRI Tools是社區(qū)針對 CRI 接口開發(fā)的CLI及驗證工具屋吨。
它包括兩個工具:crictl 和 critest蜒谤。crictl 是一個容器運行時命令行接口,適用所有CRI兼容的容器運行時至扰,與Docker cli類似功能鳍徽,但是docker cli只適用于Docker運行時。由于Kubernetes 是支持所有CRI兼容的容器運行時敢课,所以推薦crictl用于 Kubernetes 節(jié)點上 pod阶祭、容器以及鏡像的除錯工具。
#查看命令詳細(xì)幫助
crictl -h
vim /etc/crictl.yaml #編輯文件直秆,修改默認(rèn)配置
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: true
針對pod操作如下:
#打印所有pod清單
crictl pods
#根據(jù)標(biāo)簽打印pod
crictl pods --label run=nginx
#詳細(xì)幫助命令
crictl pods -h
critest 則是一個容器運行時的驗證測試工具濒募,用于驗證容器運行時是否符合 Kubelet CRI 的要求。除了驗證測試圾结,critest 還提供了 CRI 接口的性能測試瑰剃,比如 critest -benchmark
常用命令對比
crictl(kubernetes) | ctr(containerd) | docker | 說明 |
---|---|---|---|
crictl ps | ctr task ls/ctr container ls | docker ps | 查看運行容器 |
crictl exec | ctr task exec --exec-id | docker exec | 進(jìn)入容器 |
crictl images | ctr i ls | docker images | 查看鏡像 |
crictl logs | 無 | docker logs | 查看日志 |
crictl inspect/inspecti | ctr container info | docker inspect | 查看容器/鏡像信息 |
crictl stats | 無 | docker stats | 查看容器資源 |
crictl start/stop | ctr task start/kill | docker start/stop | 啟動/關(guān)閉已有的容器 |
無 | ctr image tag | docker tag | 修改鏡像標(biāo)簽 |
無 | ctr image import/export | docker load/save | 鏡像導(dǎo)入導(dǎo)出 |
crictl pull | ctr image pull | docker pull | 拉取鏡像 |
無 | ctr image push | docker push | 推送鏡像 |
crictl 命令行工具基本與docker 命令行工具保持一致,只是docker關(guān)鍵換成crictl筝野,對于之前使用docker的人員來說晌姚,可以說是無縫切換
運行時Docker切成Containerd
- 先隔離要切換的docker節(jié)點,置成不可以調(diào)度狀態(tài)(unschedulable )
kubectl cordon test1
- .再驅(qū)逐節(jié)點上pod歇竟,保留DaemonSet控制管理的pod,因為這些pods不用驅(qū)逐到其它節(jié)點挥唠。
kubectl drain test1 --ignore-daemonsets
- 切換containerd
停止kubelet和docker
systemctl stop kubelet
systemctl stop docker
systemctl stop containerd
根據(jù)上文內(nèi)容知道Docker也是依賴Containerd,因此安裝Docker同時也安裝Containerd焕议,那么切Containerd就可以不用再安裝宝磨,當(dāng)然你也可以將 Docker 和 containerd 完全卸載掉,然后重新安裝号坡。
Containerd 中默認(rèn)已經(jīng)實現(xiàn)了 CRI懊烤,但是是以 plugin 的形式配置的,之前 Docker 中自帶的 containerd 默認(rèn)是將 CRI 這個插件禁用掉了的(使用配置 disabled_plugins = ["cri"])宽堆,所以這里我們重新生成默認(rèn)的配置文件來覆蓋掉, 具體查看上面Containerd 配置
接下來配置kubelet腌紧,修改/etc/sysconfig/kubelet,container-runtime指定容器運行時畜隶,默認(rèn)值是docker壁肋, --container-runtime-endpoint指定運行時套接字地址号胚,containerd套接字unix:///run/containerd/containerd.sock
KUBELET_EXTRA_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock"
配置完成后啟動containerd和kubelet
systemctl daemon-reload
systemctl start containerd
systemctl start kubelet
重啟完成后查看節(jié)點狀態(tài)
kubectl get node -o wide
- 節(jié)點恢復(fù)使用
kubectl uncordon test1
節(jié)點要維護端盆, 比如我們需要變更節(jié)點配置襟铭、升級內(nèi)核等操作的時候都可以先將節(jié)點進(jìn)行驅(qū)逐禀崖,然后再進(jìn)行維護曹傀,再恢復(fù)