【docker系列4】docker版本及內核兼容性選擇

這是本專欄的第一部分:Docker 入門,共 3 篇,幫助大家進入 Docker 的世界。上一篇,我帶大家瞭解了 Docker 入門的基礎知識,知道了如何運行和操作容器。下面我們一起進入第三篇的內容。

Docker 的版本歷程

快速迭代期

在第一篇,我們已經知道 Docker 是在 2013 年首次亮相,在 2014 年 6 月 9 日發佈了 1.0.0 版本;**直到 2017 年,Docker 的版本號都是 X.Y.Z 這樣的格式。**差不多每 2~3 個月會升一次 Y 的版本號,比如:1.3.0 是 2014 年 10 月發佈的,1.4.0 則是 2014 年 12 月發佈。

2017 年 2 月 8 日 Docker 發佈了 1.13.1 版本,這是 最後一個 以 X.Y.Z 格式命名的版本了。

在這個階段,Docker 在主流 Linux 發行版上的安裝包一般叫做 docker、docker-engine 或 docker.io,所以現在如果你需要安裝新版本 Docker 的話,如果你已經安裝了上述包中的任何一個,一般會建議你先刪除掉。

同年 Docker 宣佈將原 GitHub 上開源的 Docker 項目 更名爲 Moby,這次更名之後,產生了幾個重要的變化:

  • Moby 項目將作爲上游的開源開發項目
  • Docker CE 是基於 Moby 的免費發佈版本(也是現在大家最常用的)
  • Docker EE 是基於 Docker CE 的商業產品版本

現在對於我們而言,可能上游項目叫 Docker 或者叫 Moby 已經不會太在意了,但實際上這些改動帶來的影響是將原本統一的項目分拆成了很多不同的組件,之後再進行組織,這當然也會爲理解 Docker 代碼等帶來一定的複雜度。在本次專欄的最後一部分,我會與你分享 Docker 上游項目的組織方式,以及如何參與到 Docker 項目中去。

蓬勃發展期

到 2017 年時,Docker 已經面世 4 年左右的時間,這期間 Docker 迅速攀升成了新時代的技術趨勢。而 Docker 的主體功能也已經相對完善。隨着 Docker Inc. 有了企業級產品,這時候 Docker 的版本號命名規則也隨之發生了變化。

2017 年 3 月,Docker 發佈了 Docker CE 17.03.0-ce 和 Docker EE 17.03.0-ee-1。從此之後,Docker 開始了蓬勃發展期,
發佈週期改成了每月一次,同時版本命名也換成了 YY.MM. 的形式,當然也爲了考慮到社區用戶在實際使用中可能不會很頻繁的升級,所以提供過了兩種渠道:

  • 月度更新:這便是我剛纔所說的那種方式,每月更新,但是每月更新的這個版本只會在下個版本發佈之前得到安全更新和錯誤修正;在下個版本發佈後,便不再更新了。例如:17.04.0-ce 在 17.05.0-ce 發佈前都能得到安全更新和錯誤修正的支持,一旦 17.05.0-ce 發佈後,17.04.0-ce 就將結束生命週期,不再更新。
  • 季度更新:指的是每個季度的首個版本,在發佈之後,在 4 個月內都將收到安全更新和錯誤修正。例如:17.06.0-ce 在 17.09.0-ce 發佈之前,這 4 個月內都可以得到安全更新和錯誤修正,一旦 17.09.0-ce 發佈後,17.06.0-ce 就將結束生命週期,不再更新。

所以 在這個階段,我會建議你選擇季度更新的版本 ,因爲其能得到的支持時間最長,也不至於總是需要更新。

穩步提升期

之後時間線到了 2018 年,此時 Docker 由於之前幾年的蓬勃發展,容器化已成爲主流;加上 Docker 自身也日益成熟,成爲了功能完備的“容器平臺”, Docker 現在需要提供更加穩定可靠的版本

所以在 2018 年 6 月 Docker 公司宣佈,將 Docker 的發佈週期修改爲半年更新。Docker 18.06 CE 版本將會是最後一個有 4 個月維護週期的版本,下一個版本 Docker 18.09 CE 會有 7 個月的維護期。之後在 2019 年 7 月份發佈了 Docker 19.03,在這個版本正式發佈之前,經歷了 5 個 beta 版本、3 個 rc 版本,可以看到經過這次改變後,Docker 發佈新版本是非常慎重的。

所以在 2018 年 6 月 Docker 公司宣佈,將 Docker 的發佈週期修改爲半年更新。Docker 18.06 CE 版本將會是最後一個有 4 個月維護週期的版本,下一個版本 Docker 18.09 CE 會有 7 個月的維護期。之後在 2019 年 7 月份發佈了 Docker 19.03,在這個版本正式發佈之前,經歷了 5 個 beta 版本、3 個 rc 版本,可以看到經過這次改變後,Docker 發佈新版本是非常慎重的。

你可能會有幾個困惑:

1. 爲什麼版本號是 19.03 而它卻在 7 月發佈?

這是因爲 Docker 使用 YY.MM 的版本格式,主要是爲了說明節奏,保證一般可用的“期望日期”,但並不會爲了該日期而提前發佈一個不可靠或者功能不完備的版本。

另外,新版本發佈時,會盡可能將所有的依賴更新到最新的穩定版本,以保證在 Docker 的下一個版本發佈之前,用戶所用的 Docker 版本中不包含太落後的代碼包。

2. 爲什麼 18.09 版本發佈日期是 2018 年 11 月,但是直到 2019 年 8 月它仍然在更新小版本?

因爲 Docker 的最新版本 19.03 是 2019 年 7 月發佈的,Docker 通常會保持前一個版本與新版本的維護週期之間重合一個月左右,以便給用戶足夠多的時間來進行升級,以及可用於迴歸測試,讓用戶知道不會因爲升級到下一個版本而造成什麼嚴重問題。

小結

上面我們介紹了 Docker 版本的發展歷程,如果你現在需要新安裝 Docker 或是想要對現有 Docker 版本進行升級,我會強烈推薦你選擇 Docker 19.03(截至當前最新的穩定版本)。

主要原因如下:

  • 它是 2019 年 7 月份發佈的,離社區結束維護週期還有很長時間。在此期間你遇到的各種問題均可反饋至社區,並會得到社區的幫助。
  • 19.03 包含了更多特性,這些特性的介紹不是本篇的重點,我們在後續內容中會涉及並討論。

內核兼容性

如果你是剛接觸 Docker,並且要在一臺自己可自由選擇內核版本或系統版本的機器上安裝 Docker,那你可以選擇跳過本篇剩餘的內容,直接看我這裏給出的建議(剩餘內容中會涉及一些 Docker 版本與內核相關的知識,現在跳過並不影響後續內容):

儘可能地使用最新的穩定版內核和操作系統,以及安裝最新且穩定的 Docker 版本。

這個建議中包含了兩個信息:

  • 選擇最新且穩定的 Docker 版本,關於版本的問題前面已進行了說明,此處不再贅述;
  • 使用最新的穩定版內核和操作系統。
注:這部分的討論只涉及 Docker CE 與 Linux 系統,不討論 Docker Desktop for Mac 或 Docker Desktop for Windows。

概覽

這裏以我們平時最常接觸的 x86_64/amd64 的架構爲例。

Docker 默認提供了 CentOS、Debian、Fedora、Ubuntu 等四種 Linux 發行版上的官方安裝源,如果你是在這四種發行版上安裝 Docker 我推薦你直接使用官方源,並利用系統上自帶的包管理器進行安裝,或者如同第二篇介紹的,直接使用 https://get.docker.com/ 提供的腳本進行安裝。

官方文檔中簡要的寫了一些安裝 Docker 的必須項:

  • 64 位操作系統
  • 3.10 以上的內核
  • iptables、Git、xz 或者掛載正確的 Cgroupfs

但寫的其實很模糊,我們先看看內核相關的信息。

內核

爲什麼會選擇 3.10 版本版本的內核呢?總的來說是因爲 3.10 中包含了 Docker 所需的大多數特性,而且 3.10 是一個 LTS 版本,這裏先不具體展開了,我們還是聚焦於內核兼容性的問題上。

Linux 3.10 版本是在 2013 年 6 月底發佈的,我們來看看上述幾個 Linux 發行版何時開始使用該內核版本的:

發行版 版本 發佈日期 內核版本
CentOS 7.0-1406 2014 年 7 月 3.10.0-123
Debian 8.0 2014 年 7 月 3.10.0-123
Fedora 20 2013 年 12 月 3.11
Ubuntu 13.10 2013 年 10 月 Linux 3.11

可以看到,不同的發行版會選擇不同版本的內核。我們來看看現在這些發行版所用的內核版本:

發行版 版本 發佈日期 內核版本
CentOS 7.7-1908 2019 年 9 月 3.10.0-1062
CentOS 8.0-1905 2019 年 9 月 4.18.0-80
Debian 10.0 2019 年 7 月 Linux 4.19
Fedora 30 2019 年 4 月 Linux 5.0
Ubuntu 19.04 2019 年 4 月 Linux 5.0

可以看到內核版本更新最慢的是 CentOS,而一個很值得注意的點是,Linux 3.10 截至 Linux 3.10.108 就已經 EOL(End Of Life)了,CentOS 使用的內核其實移植了很多高版本 Linux 中的特性

其實 Docker 和內核兼容性問題是一個很大的話題,參考上面提供的表格,Debian、Fedora、Ubuntu 等發行版的內核更新都相對及時,只要你不選擇太過時或者太舊的版本,Docker 在發佈之前,都會在這幾個發行版的最新版上經過大量測試,若有問題也會盡早修復的。

我們來單獨說下 CentOS。如果你使用 CentOS,請務必選擇 CentOS 7.6 及以上版本,或是將內核升級到 3.10.0-957 及更高版本,爲什麼會有這個建議呢?

我們舉個實際的例子:Docker 的存儲驅動,在早先版本中其實對於 CentOS 系統上一直是默認使用 Devicemapper 的存儲驅動,但最近的 Docker 版本中已經將 Devicemapper 標記爲了廢棄。所以我們推薦選擇 Overlay2 存儲驅動,關於這個存儲驅動,在之後的存儲篇我們會詳細介紹。

Docker 的 Overlay2 存儲驅動需要內核的 Multiple lower layers 支持,而 OverlayFS 是在 Linux 3.18 時合併進入內核的,但在 Linux 3.19 版本時才添加了 Multiple lower layers 的支持。

Linux 3.19 恰好是 3.x 系列的最後一個版本,兩個月後 4.0 便發佈了,通常情況下,人們會更推薦採用 4.0。所以官方文檔上對於使用 Overlay2 存儲驅動的建議是使用 Linux 4.0 及更高版本的內核。

而 CentOS 的內核中存在大量的反向移植,Mmultiple lower layers 的特性也被移植到了 CentOS 7.4 的內核之上。所以如果你只是考慮使用 Overlay2 作爲存儲驅動的話,則至少需要選擇 CentOS 7.4 內核版本爲 3.10.0-693 或者更新版本的內核。

備註:CentOS 7.x 與 8.x 區別較多,所以單獨將 CentOS 的 7 和 8 版本列了出來。

總結

通過本篇,我們介紹了 Docker 版本及內核兼容性相關的內容。Docker 在現階段使用 YY.MM 形式的版本號,一年發佈兩次版本,通常具有 7 個月左右的維護週期。如果在進行 Docker 版本的選擇,我推薦你選擇最新的穩定版。

關於內核方面,其實是一個很大的話題,這裏只是簡單的介紹了一下。而且考慮內核兼容性時不僅需要考慮 Docker 自身相關的兼容性,還需要考慮 Docker 依賴的相關底層組件與內核的兼容性問題。

比如,Docker 底層的容器運行時 RunC。2019 年 2 月,有一個關於 RunC 的提權漏洞 CVE-2019-5736,由於是一個緊急的安全漏洞,所以 RunC 的維護者進行了快速修復,而當時的修復方式是增加了兩個系統調用 memfd_create(2) 和 fcntl(2)。而這兩個的系統調用是在 Linux 3.17 時被加入內核中的。

造成的影響就是凡是內核不支持這兩個系統調用的,均無法正常運行。但也有部分例外,比如 CentOS 的 3.10.0-514 內核反向移植了此特性。

不過上述提到的修正,在後來的版本中修改了實現方式,所以兼容性也得到了改善。關於這些底層組件,我在後續的架構篇中也都會有介紹。

所以如果你對內核方面感興趣,可以多進行此方面的研究和積累,但如果對這些內容不甚瞭解或者沒什麼興趣,那我推薦你儘可能地選擇最新的穩定版內核和系統,可以免除很多因爲內核兼容性方面造成的異常。

另外: Docker 也提供了一個腳本用於檢查系統的配置,如果不確定自己當前系統的配置是否正確,可先運行此腳本進行檢查。

相關內容:

A new upstream project to break up Docker into independent components

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章