被棄用的 Docker 會被 Podman 取代嗎?

2020-12-13 CSDN

Kubernetes 團隊近日宣布將在最新版本中棄用 Docker 支持的功能,後續版本會陸續刪除這些功能。

編譯 | 彎月 責編 | 張文,鄭麗媛

頭圖 | CSDN 下載自視覺中國

近日,Kubernetes 團隊發布了最新的 1.20 版本,新版本更新了許多內容:

存儲卷快照功能趨於穩定;Kubectl Debug 進入 Beta;Beta:API 優先級和公平性;IPV4/IPV6 Alpha 功能更新;GA:限制進程 PID;Dockershim 棄用;Exec 探針超時處理等等(詳情可查看:https://kubernetes.io/blog/2020/12/08/kubernetes-1-20-release-announcement/)

其 中,有一項更新對於開發者社區來說無疑是一枚重磅炸彈:正式宣布棄用 Docker 支持的功能。那麼,究竟 Kubernetes 為什麼要這麼做,以及這麼做會有什麼影響呢?

Docker 是一種以容器化的方式打包、分發和部署應用程式的方式。自 2013 年 3 月 13 日初始版本發布以來,Docker 已成為容器業界的事實標準。而Kubernetes 是一款由 Google 開發的開源容器編排系統。

圖:Kubernetes 架構示意圖,來自維基百科

Docker 與 OpenShift

在 2015 年的峰會上,紅帽發布了 OpenShift V3.0,該新版本 OpenShift 底層採用 Docker 容器,同時開始使用 Kubernetes 來編排鏡像。然而,在 2016 年的紅帽峰會期間,Docker 對紅帽的 OpenShift 展開了鋒芒畢露的攻擊。他們不僅發表了以下推文,還給與會者發放帶有「我們不接受模仿」字樣的T恤衫:

顯然左邊的仿製鯨魚就是在嘲諷紅帽的 OpenShift。當時,OpenShift 採用了基於 Docker 的容器。紅帽發布的 Docker 一般會比原版落後一點點,而且為了提供所謂的「企業支持」,紅帽採取了給舊版本 Docker 打補丁的行為。但相比之下,Docker 總是在發布最新版。

當然,對於維護企業應用應該採用升級還是採用移植補丁的方式,到現在依然眾說紛紜,所以對於這一點在此不做評論,但 Docker 在紅帽自己的峰會上的這種行為確實有點出乎意料。不得不承認,在此之前 Docker 是一項偉大的技術,畢竟它是 RedShift 的重要組成部分,但從那天起,事情就開始變味了。

平臺之爭

早期的 PaaS 平臺主要是 OpenShift,以及兩家競爭對手 Docker 和Pivotal 。Docker 人所共知就不用多說了,Pivotal 是 EMC 和 VMware 於2013 年創建的公司,專注於開源 PaaS 的解決方案。他們的企業解決方案非常成功,原因非常簡單:用戶體驗非常好,尤其是結合 Pivotal Labs 使用的時候。

而 Docker 是企業解決方案的後起之秀,他們的優勢就是開發者們早已熟知Docker 引擎了。而當時 Kubernetes 還不知道在哪兒。然而,Docker 對OpenShift 的攻擊行為,使紅帽不得不將資源投入到了 Kubernetes 上。後來的結果大家都看到了,Kubernetes 大獲成功,並且獲得了整個行業的擁護。

此時 Docker 為了挽回敗局而推出了 Docker Swarm,但為時已晚。2016 年後半年,Kubernetes 超過了 Docker Swarm,成了行業事實上的標準。最終,Docker Swarm 並沒有給 Kubernetes 帶來任何衝擊。可以認為這是Docker 的第一次死亡,從此以後,Docker 不再是企業級的 PaaS 解決方案,只能作為雲原生系統中的一部分存在,好在它一直是 Kubernetes 中的一個重要組成部分。

Kubernetes 宣布棄用 Docker

近日 Kubernetes 宣布棄用 Docker。

(官網博客連結:https://kubernetes.io/blog/2020/12/02/dont-panic-kubernetes-and-docker/):

這無疑是第二次宣布了 Docker 的死亡。按照 Kubernetes 自己的說法,Docker 已不再是必須的技術,而是變成了技術債務。1.19 版以前的Kubernetes 需要通過一個名為 Dockershim 的模塊連接到 Docker,然後由Docker 連接到 Containerd 來創建容器。從技術上來看,實際的容器運行時是 Containerd,而不是 Docker。Docker 的作用只不過是在 Containerd 上創建容器而已。作為人類用戶,只需運行一個 Docker run 就可以創建一個容器,這一點非常方便;然而在方便的同時,Docker 也帶來了許多無用的操作和技術債務,對於 Kubernetes 而言,這就是負擔。Kubernetes 完全可以繞過Docker,自己在 Containerd 上創建容器,從而獲得同樣的效果。而Kubernetes 1.20 中就採用了這種做法。

儘管 Docker 公司的商業模式失敗了,但我們必須承認 Docker 為整個行業做出的巨大貢獻。Docker 公司帶來的技術是業內最好的。時至今日,我們的CI/CD 系統還極其依賴 Docker。沒有 Docker,也不可能有 Kubernetes 的成功,而且 Kubernetes 依然有 Docker 的影子。

不過也不用擔心,Kubernetes 團隊已經做了大量的努力,儘可能使升級過程平穩。即使你升級到 1.20,也只會收到一個關於 Docker 已被棄用的警告。目前Kubernetes 的計劃是在 2021 年末期發布的 1.22 中徹底移除 Docker 支持,所以開發者必須在那之前切換到其他的容器運行時,比如 Containerd 或 CRI-O 等。

Docker的替代品

棄用 Docker 之後,開發者們對其替代品的討論逐漸熱烈,其中 Containerd 和 Podman 倍受期待。

Containerd 是一個工業級標準的容器運行時,它強調簡單性、健壯性和可移植性。它可以管理容器的生命周期,可以被 Kubernets CRI 等項目使用,並為廣泛的行業合作打下基礎等。

Podman 原來是 CRI-O 項目的一部分,後來被分離成一個單獨的項目叫 libpod。Podman 的使用體驗和 Docker 類似,不同的是 Podman 沒有 daemon。直接通過 OCI runtime(默認也是 runc)來啟動容器,所以容器的進程是 Podman 的子進程。這比較像 Linux 的 fork/exec 模型,而 Docker 採用的是 C/S(客戶端/伺服器)模型。

雖然目前容器市場 Docker 還是佔用很大的比例,但被棄用的結局已定,在這個過渡期中,不妨去擁抱Containerd 和 Podman吧!

參考連結:https://www.tariqislam.com/posts/kubernetes-docker-dep/

本文為 CSDN 編譯,轉載請註明來源出處。

相關焦點

  • 下一代容器工具podman介紹及與Docker的比較
    容器可以確保您的應用擁有必需的庫、依賴項和文件,讓您可以在生產中自如地遷移這些應用,無需擔心會出現任何負面影響。實際上,您可以將容器鏡像中的內容,視為 Linux 發行版的一個安裝實例,因為其中完整包含 RPM 軟體包、配置文件等內容。但是,安裝容器鏡像發行版,要比安裝新的作業系統副本容易得多。這樣可以避免危機,做到皆大歡喜。
  • Docker 的第二次死亡
    2016 年 9 月,Google 和 RedHat 聯合宣布了「fork Docker」,也就是後來的 CRI-O 項目,這就是這次棄用事件的起始,同時也宣告了競爭的結束。 誰會受到影響?
  • Kubernetes決定棄用Docker,到底會影響到誰?
    導讀:Kubernetes 在其最新的 Changelog 中宣布,自 Kubernetes 1.20 之後將棄用 Docker 作為容器運行時。那麼這到底是怎麼回事?開發者和企業會受到什麼樣到影響?而且,「棄用 Docker」這個詞本身有多重的含義,Docker 並非一個單層軟體,Kubernetes 1.20 啟用 dockershim 並不代表棄用了 Docker 的全部,仍有 containerd 可以對接 docker。
  • Kubernetes 將棄用 Docker
    近日,Kubernetes 官方發布公告,宣布自 v1.20 起放棄對 Docker 的支持,屆時用戶將收到 Docker 棄用警告
  • 雲計算核心技術Docker教程:docker Stack介紹
    Docker在進行多服務部署和管理時通常會使用Docker Stack來解決大規模部署管理問題,Docker引擎在1.12 版本集成了Docker Swarm, 內置新的容器編排工具docker stack,通過提供期望狀態、滾動升級、簡單易用、擴縮容、健康檢查等特性簡化了應用的管理
  • Docker再體驗之Docker Compose,及它與Kubernetes的區別
    雖然Docker Swarm也是多節點管理,但基本已棄用,了解一下就好了。安裝Docker Compose接上一篇的例子,安裝Docker Compose,並進行賦權和檢驗。sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-composesudo chmod +x /usr
  • 雲計算核心技術Docker教程:Docker Compose的pull和push命令詳解
    Docker-Compose pull命令可以拉取docker-compose.yml或者docker-stack.yml文件中定義的服務關聯的鏡像,Docker-Compose push命令可以將服務鏡像推送到registry/repository中。
  • K8S棄用Docker了?Docker 不能用了?別逗了!
    Docker 源於 Linux Container,可以將一臺機器的資源分成 N 份容器,做到資源的隔離,並將可運行的程序定義為標準的 docker image;Kubernetes 則可以把不同機器的每份容器進行編排、調度,組成分布式系統。
  • Docker集群管理之Docker Compose
    使用Docker Compose你只需要在一個配置文件中定義多個Docker容器,然後使用一條命令將多個容器啟動,Docker Compose會通過解析容器件的依賴關係(link, 網絡容器 –net-from或數據容器 –volume-from)按先後順序啟動所定義的容器。
  • docker會用了?不來了解一下全自動構建部署嗎
    如果你的github倉庫有所變動,他會自動從你的github倉庫中拉取文件以及Dockerfile然後構建成相應的鏡像到倉庫中。$ git commit -m "push test docker auto"$ git push當我們推送完成後,docker hub中會有對飲過的標記
  • Kubernetes 要棄用docker了,我們該怎麼辦?
    對於K8s管理員仔細閱讀並開始考慮Docker替代方案是標題黨嗎不,這是真的發生了。Docker現在在Kubernetes中已棄用?kubelet中的Docker支持現已棄用,並將在以後的版本中刪除。一個厲害的黑客可能會使您的主機徹底報廢!事情肯定會變糟。這就是為什麼您也應該不斷更新Docker(或任何其他容器運行時)的原因之一,而不僅僅是容器化的應用程式。附錄2:gVisor的工作方式gVisor最初由Google員工創建的OCI運行時。
  • Docker系列教程02-操作Docker容器
    4)後臺運行容器對於剛剛所創建的容器,當用戶使用exit命令退出後,容器也會自動退出,如下圖所示的Exited狀態。添加 -d 參數實現容器後臺運行小知識點:如果不指定後臺運行容器,還有其他辦法退出而容器不關閉嗎?按Ctrl+P+Q即可實現正常退出不關閉容器。
  • 【Docker】系列教程02-操作Docker容器
    4、後臺運行容器對於剛剛所創建的容器,當用戶使用exit命令退出後,容器也會自動退出,如下圖所示的Exited狀態。添加 -d 參數實現容器後臺運行小知識點:如果不指定後臺運行容器,還有其他辦法退出而容器不關閉嗎?按Ctrl+P+Q即可實現正常退出不關閉容器。驗證如下:
  • Docker系列教程01-使用Docker鏡像
    docker pull 語法docker pull 語法通常情況下, 描述一個鏡像需要包括「名稱+標籤「信息。比如下載Ubuntu 18.04系統鏡像,命令如下:若不指定標籤,則默認會選擇latest標籤。測試如下:在這裡特別強調下,不要被latest的字面意思「最新的」所誤解了,它只是這個資源庫的擁有者約定這樣,沒有附加作用,更不會自動更新。
  • Kubernetes竟棄用Docker?
    還沒好好的感受,Kubernetes與Docker一起使用的時候,Kubernetes已經棄用Docker了。有時候,我們都要相信,沒有什麼會永垂不朽,即使是當年一起緊密使用的Kubernetes和Docker,也最終是分道揚鑣了。那麼Docker為什麼需要Kubernetes?
  • docker的/var/run/docker.sock參數
    歡迎訪問我的GitHub這裡分類和匯總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos關於/var/run/docker.sock參數在創建docker容器時,有時會用到/var/run/docker.sock這樣的數據卷參數,例如以下docker-compose.yml
  • Docker問答錄系列——Docker引擎相關問題(一)
    CentOS 容器中的進程會直接向 Ubuntu 宿主內核發送 syscall,而不會直接或間接的使用任何 Ubuntu 的 userland 的庫。這點和虛擬機有本質的不同,虛擬機是虛擬環境,在現有系統上虛擬一套物理設備,然後在虛擬環境內運行一個虛擬環境的作業系統內核,在內核之上再跑完整系統,並在裡面調用進程。
  • 如何開始docker - docker架構及創建容器
    docker架構傳統的虛擬機架構是 物理機 -> 宿主機作業系統 -> Hypervisor支持 -> 虛擬機作業系統 -> 應用程式docker架構是 物理機 -> 宿主機作業系統 -> docker引擎 ->
  • 雲計算核心技術Docker教程:Docker容器使用
    docker 客戶端非常簡單 ,我們可以直接輸入 docker 命令來查看到 Docker 客戶端的所有命令選項。可以通過命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。
  • Docker 容器資源管理,你真的學會了嗎?
    stats 命令默認是一個持續的動態流式輸出(每秒一次),給它傳遞 --no-stream 參數後,它就只輸出一次便會退出了。Name:容器的名稱,如果沒有手動使用 --name 參數指定,則 Docker 會隨機生成一個,運行過程中也可以通過命令修改。CPU %:容器正在使用的 CPU 資源的百分比,這裡面涉及了比較多細節,下面會詳細說。