舊瓶也能裝新酒 Ubuntu 14.04 硬裝 Docker 實戰

在 2020 的年頭,因為某些因素,必須評估把陳年的 Ubuntu 14.04 撿起來裝 Docker 的方案,在 2020 年幹這事,當然不是 apt install docker.io 這麼簡單,否則這篇文章就不會出現了。

Which Docker?

在 Ubuntu 原始的套件庫內就有 Docker,也就是前面提到的 docker.io ,不論是 Ubuntu 14.04 或現在的 18.04 甚至是未來的 20.04,都一律不建議使用這個套件來安裝 Docker,因為這些 Ubuntu 自帶的 docker.io 並非由 Docker Inc. 官方維護,因此更新永遠慢一步甚至很多步。更新慢會有什麼樣的問題?答案是不安全,讓我們看看 Docker 的漏洞清單,可以想像一下如果裝了幾乎不更新的 docker.io 我們的系統會暴露在多大的安全風險中。

因此,在 OS 必須是 Ubuntu 14.04 的先決條件下,我們還是要盡可能的降低系統的安全風險,所以必須使用 Docker 官方的最新套件來安裝 Docker。

就像寒戰電影中保安局局長陸先生所言:

非常時期 用非常的方法

非常時期 用非常的方法(可是還是不能打民眾)
版權:華映娛樂股份有限公司

安裝 Docker

先裝一些基礎套件:

> sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

下載並把 Docker GPG 金鑰加入系統:

> curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

正式的把 Docker 官方套件庫加入系統:

> sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

更新 APT 庫:

> sudo apt update

安裝 Docker:

> sudo apt install docker-ce

按照上面的步驟把 Docker 裝完後,如果嘗試操作 image 甚至建立容器,乍看之下會覺得都是正常的,但是一旦想要進入容器內就會噴錯:

> sudo docker start --interactive 62ba

docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:301: running exec setns process for init caused \"exit status 23\"": unknown

得到上面這堆不知所云的錯誤訊息。

必須更新 Linux 核心才能夠正常使用。

安裝新版 Linux 核心

在動手硬幹前先了解一下為何必須這麼做。

為了解決 CVE-2019-5736 這個漏洞,Docker 對 Linux 核心的版本需求為 3.17 以上版本,不幸的 Ubuntu 14.04 的 Linux 核心最高只有到 3.13,幸虧透過 Ubuntu 的 LTS Enablement Stacks 機制,能夠讓我們在 Ubuntu 14.04 上有辦法安裝 16.06 的 Linux 4.4 核心。

安裝新版 Linux 核心:

$ sudo apt-get install --install-recommends linux-generic-lts-xenial

裝完之後要重開機一下:

$ sudo reboot now

重開機後,系統應該就會是 4.4 版的核心了。

再次嘗試進入容器內,應該就會是成功的了。

後話

儘管技術上可行也測試 OK,不過這樣的解法最後並沒有應用到正式運作的機台上,開玩笑怎麼可能拿正式版的機台來換核心,當然要先研究不傷身體再講求療效啊!

第一先研究不傷身體

第一先研究不傷身體
版權:五洲製藥