K8S棄用Docker了?Docker 不能用了?別逗了!

2020-12-17 騰訊網

Docker 大概沒想到,2020 年,它在技術圈內的兩次成為(輿論的)焦點,竟然都是因為信息差(說是「標題黨」也不為過)。

近幾年,Kubernetes 已經成為自有機房、雲上廣泛使用的容器編排方案,最廣泛的使用方式是 Kubernetes+Docker。從 DevOps 人員的角度,一面用 kubctl 命令、k8s API 來操作集群,一面在單機用 Docker 命令來管理鏡像、運行鏡像。

單獨用 Docker 的情況,在一些公司的場景裡面也是有的。一種場景是「只分不合」,把一臺機器用 Docker 做資源隔離,但是不需要將多容器「編排」。單獨用 Kubernetes,下層不是 Docker 的情況,並不算很多。

Kubernetes 和 Docker 的關係,簡單來說,有互補,也有競爭。在一般的認知中,Kubernetes 和 Docker 是互補關係:

Dockers屬於下層——容器引擎;

Kubernetes屬於上層——編排調度層。

Docker 源於 Linux Container,可以將一臺機器的資源分成 N 份容器,做到資源的隔離,並將可運行的程序定義為標準的 docker image;Kubernetes 則可以把不同機器的每份容器進行編排、調度,組成分布式系統。

2013 年

Docker 是在 2013 年的 PyCon 上首次正式對外公布的。它帶來了一種先進的軟體交付方式,即,通過容器鏡像進行軟體的交付。工程師們只需要簡單的 docker build 命令即可製作出自己的鏡像,並通過 docker push 將其發布至 DockerHub 上。通過簡單的 docker run命令即可快速的使用指定鏡像啟動自己的服務。

通過這種辦法,可以有效的解決軟體運行時環境差異帶來的問題,達到其 Build once, Run anywhere 的目標。

從此 Docker 也基本成為了容器的代名詞,並成為容器時代的引領者。

2014 年

2014 年 Google 推出 Kubernetes 用於解決大規模場景下 Docker 容器編排的問題。

這是一個邏輯選擇,在當時 Docker 是最流行也是唯一的運行時。Kubernetes 通過對 Docker 容器運行時的支持,迎來了大量的用戶。

同時,Google 及 Kubernetes 社區與 Docker 也在進行著密切的合作,在其官方博客上有如下內容:

We』ll continue to build out the feature set, while collaborating with the Docker community to incorporate the best ideas from Kubernetes into Docker.

An update on container support on Google Cloud Platform[1]

Kubernetes is an open source manager for Docker containers, based on Google’s years of experience using containers at Internet scale. Docker is delivering the full container stack that Kubernetes schedules into, and is looking to move critical capabilities upstream and align the Kubernetes framework with Libswarm.

Welcome Microsoft, RedHat, IBM, Docker and more to the Kubernetes community[2]

並在同一個月的 DockerCon 上發布演講,介紹了 Kubernetes 並受到了廣泛的關注。

此時 Docker Inc. 也發布了其容器編排工具, libswarm (也就是後來的 swarmkit) 。

2015 年

2015 年 OCI (Open Container Initiative)由 Docker 和其他容器行業領導者共同成立(它也是 Linux 基金會旗下項目)

OCI 主要包含兩個規範:

運行時規範(runtime-spec):容器運行時,如何運行指定的 文件系統上的包

容器鏡像規範(image-spec):如何創建一個 OCI 運行時可運行的文件系統上的包

Docker 把它自己的容器鏡像格式和 runtime ( 現在的 runc ) 都捐給了 OCI 作為初始工作。

2016 年

2016 年 6 月,Docker v1.12 發布,帶來了 Docker 在多主機多容器的編排解決方案,Docker Swarm 。 這裡也需要注意的是,Docker v1.12 的設計原則:

Simple Yet Powerful (簡單而強大)

Resilient(彈性)

Secure(安全)

Optional Features and Backward Compatibility(可選功能及向後兼容)

所以你可以通過配置自行選擇是否需要使用 Docker Swarm ,而無需擔心有什麼副作用。

2016 年 12 月, Kubernetes 發布 CRI (Container Runtime Interface) ,這當中一部分原因是由於 Kubernetes 嘗試支持另一個由 CoreOS 領導的容器運行時項目 rkt ,但是需要寫很多兼容的代碼之類的,為了避免後續兼容其他運行時帶來的維護工作,所以發布了統一的 CRI 接口,凡是支持 CRI 的運行時,皆可直接作為 Kubernetes 的底層運行時;

當然, Kubernetes 也是在 2016 年逐步取得那場容器編排戰爭的勝利的。

2017 年

2017 年, Docker 將自身從 v1.11 起開始引入的容器運行時 containerd[3] 捐給了 CNCF[4]

2017 年,Docker 的網絡組件 libnetwork 增加了 CNI 的支持;同時通過使用 Docker 為 Docker Swarm 提供的 ipvs 相關的代碼[5],也在 Kubernetes 中實現了基於 IPvs 的 service 負載均衡。不過在 v1.18 中開始移除了相關的依賴。

同年 11 月,Kubernetes 中新增了 containerd 的支持[6]

cri-containerd

2018 年

2018 年, Kubernetes 的 containerd 集成,正式 GA[7]

containerd 1.0 cri-containerd

containerd 1.1 cri-containerd

2019 年

2019 年,上文中提到的另一個容器運行時項目 rkt 被 CNCF 歸檔,終止使命了;2019 年 Mirantis 收購 Docker 的企業服務。

2020 年

時間回到今年,Docker 主要被誤會的兩件事:

Docker Inc. 修改 DockerHub 的定價和 TOS 。國內爭論較多的主要是關於合規性的問題(但是被標題黨帶歪了,免不了恐慌);

Kubernetes 宣布開始進入廢棄 dockershim 支持的倒計時,被人誤以為 Docker 不能再用了;

一切都如此悄悄地開始。作為廣受歡迎的容器集群管理工具,在即將發行的Kubernetes 1.20版本說明文件中,Kubernetes(k8s)宣布:"kubelet放棄對Docker的支持,並會在將來的版本中移除。"

是的,實現了對Docker兼容支持其kubelet容器運行時Container Runtime Interface(CRI)標準的dockershim中間件將很快成為歷史。所以呢?這沒什麼大不了的。

谷歌雲開發人員助理及著名的Kubernetes導師凱爾西·海託華(Kelsey Hightower)在推特上說:"Docker不等於容器。Docker可以構建容器映像,Docker可以從容器倉庫中push和pull,Docker是容器運行時其中一員,Docker可以創建容器進程,但Linux仍然是老大。"

正如著名的"不必恐慌:Kubernetes和Docker"博客文章中所解釋的那樣,Kubernetes只是在v1.20版本後不推薦將Docker作為容器運行時使用。人們仍然可以使用Docker構建容器,繼續在倉庫中進行push和pull操作等。實際上是因為Docker並不符合Kubernetes的容器運行時接口標準(CRI)而不被推薦使用,Docker生成的鏡像依然可以一如既往地在集群中工作。

簡而言之,這就是我們想說的,這沒什麼大不了的,不必恐慌。

就像Dockershim Deprecation FAQ所說:"在1.20中唯一改變的是,如果使用Docker作為容器運行時,則在kubelet啟動時會列印一條警告信息。"

Dockershim中間件會一直保留到2021年末,直到發布Kubernetes 1.23版本為止。Kubernetes團隊將與所有人緊密合作,直到所有人都準備好了相關變更,才會將dockershim放飛牧場。

總結

本文主要介紹了 Docker 和 Kubernetes 的發展歷程,也解釋了本次 Kubernetes 僅僅是放棄其對 dockershim 組件的支持。未來更推薦的 Kubernetes 運行時是 兼容 CRI 的 containerd 之類的底層運行時。

Mirantis 公司將會和 Docker 共同維護 dockershim 並作為開源組件提供。

Docker 仍然是一款最佳的本地開發測試和部署的工具。

相關焦點

  • Kind + Docker 一鍵部署K8s集群
    所以業界也除了一些簡易版的K8s集群環境,比如K3S(5 less than k8s),本文蟲蟲給大家介紹也是這樣一個項目Kind,一鍵部署的單機K8S環境,可以用於學習、本地開發和CI環境。另外kind操作依賴docker,需要先安裝docker。
  • 「走進k8s」Docker 簡介和安裝(一)
    關於docker這塊從0開始已經寫了4個系列了,但是針對k8s還是有點怵,因為k8s確實比較麻煩裡面的東西比較複雜,而且針對k8s想走的更遠還是需要實踐
  • Kubernetes決定棄用Docker,到底會影響到誰?
    從 DevOps 人員的角度,一面用 kubctl 命令、k8s API 來操作集群,一面在單機用 Docker 命令來管理鏡像、運行鏡像。單獨用 Docker 的情況,在一些公司的場景裡面也是有的。一種場景是「只分不合」,把一臺機器用 Docker 做資源隔離,但是不需要將多容器「編排」。
  • 雲計算核心技術Docker教程:docker Stack介紹
    Docker在進行多服務部署和管理時通常會使用Docker Stack來解決大規模部署管理問題,Docker引擎在1.12 版本集成了Docker Swarm, 內置新的容器編排工具docker stack,通過提供期望狀態、滾動升級、簡單易用、擴縮容、健康檢查等特性簡化了應用的管理
  • Kubernetes 將棄用 Docker
    近日,Kubernetes 官方發布公告,宣布自 v1.20 起放棄對 Docker 的支持,屆時用戶將收到 Docker 棄用警告
  • 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 會被 Podman 取代嗎?
    Kubernetes 團隊近日宣布將在最新版本中棄用 Docker 支持的功能,後續版本會陸續刪除這些功能。Kubernetes 宣布棄用 Docker近日 Kubernetes 宣布棄用 Docker。
  • 雲計算核心技術Docker教程:Docker Compose的pull和push命令詳解
    Docker-Compose pull命令可以拉取docker-compose.yml或者docker-stack.yml文件中定義的服務關聯的鏡像,Docker-Compose push命令可以將服務鏡像推送到registry/repository中。
  • docker-4:mac使用docker部署開發用rocketmq
    目錄:(1).mac本地docker化rocketmq(2).mac本地docker化rocketmq-console(3).測試(1).mac本地docker化rocketmq現在官方rocketmq-docker:git clone https://github.com/apache/rocketmq-docker
  • docker的/var/run/docker.sock參數
    向Docker Daemon發送請求為了驗證Docker Daemon可以通過/var/run/docker.sock接收請求,我們用curl命令來驗證,測試環境如下:作業系統:CentOS Linux release 7.6.1810接下來開始動手驗證:執行docker image
  • Docker 的第二次死亡
    運維工程師一方面用 Kubernetes 中的 kubctl 命令、k8s API 來操作集群,一方面在單機用 docker 命令來管理鏡像、運行鏡像。技術專家楊明越給 InfoQ 總結道:「單獨用 Kubernetes,下層不是 Docker 的情況,並不算很多」。
  • Docker系列教程02-操作Docker容器
    [root@qll251 ~]# docker run -it ubuntu /bin/bashroot@8b18b6758bb6:/#docker run相當於執行了兩個步驟:將鏡像放入容器中(docker create),然後啟動容器(docker start)。
  • 【Docker】系列教程02-操作Docker容器
    ~]# docker run -it ubuntu /bin/bashroot@8b18b6758bb6:/#docker run相當於執行了兩個步驟:將鏡像放入容器中(docker create),然後啟動容器(docker start)。
  • 教你一次性成功安裝K8S集群(基於一主兩從模式)
    別問我為哈這樣學,只是我覺得對我個人來說,這樣學能讓我更好的理解整套雲原生體系。這不,這次,我總結了如何一次性成功安裝K8S集群的方法。我們今天先來說說如何基於一主兩從模式搭建K8S集群。後面,我們再上如何完全無坑搭建K8S高可用集群的方案。
  • docker 門外初體驗——docker 安裝(一)
    二、安裝三、驗證四、總結前言重寫對docker的學習記錄,最主要的原因之一,花了大量的時間進行學習,形成一個從0至1的認識,但是工作中卻沒見有實際應用,導致所學的知識存活率很低,也為了豐富自身的技術體系一、docker是什麼?Docker 是一個開源的應用容器引擎。
  • Docker集群管理之Docker Compose
    Docker Compose是由python語言實現的,它通過調用docker-py庫(可參考https://github.com/docker/docker-py)與docker engine通信實現構建docker鏡像,啟動停止docker容器等。
  • 雲計算核心技術Docker教程:Docker鏡像使用
    當運行容器時,使用的鏡像如果在本地中不存在,docker 就會自動從 docker 鏡像倉庫中下載,默認是從 Docker Hub 公共鏡像源下載。我們可以使用 docker images 來列出本地主機上的鏡像。
  • Docker問答錄系列——Docker引擎相關問題(一)
    參考:https://www.docker.com/what-docker視頻筆記: Windows Server 和 Docker - John StarksDocker 資料好少啊?網上的命令怎麼不能用?
  • 如何開始docker - docker架構及創建容器
    安裝docker很簡單,啟動服務以後要怎麼開始使用呢?docker架構傳統的虛擬機架構是 物理機 -> 宿主機作業系統 -> Hypervisor支持 -> 虛擬機作業系統 -> 應用程式docker架構是 物理機 -> 宿主機作業系統 -> docker引擎 ->
  • Docker系列教程01-使用Docker鏡像
    docker search 語法docker search 語法例如,搜索mysql相關的鏡像,命令如下:docker pull 語法docker pull 語法通常情況下, 描述一個鏡像需要包括「名稱+標籤「信息。