1. 程式人生 > 實用技巧 >容器技術(三)base映象【5】

容器技術(三)base映象【5】

(二) base映象

(1) base映象含義

base 映象有兩層含義

  • 不依賴其他映象,從 scratch 構建。
  • 其他映象可以之為基礎進行擴充套件。

所以,能稱作 base 映象的通常都是各種 Linux 發行版的 Docker 映象,比如 Ubuntu, Debian, CentOS 等。

我們以 CentOS 為例考察 base 映象包含哪些內容。下載映象:

root@cuiyongchao:~# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
3c72a8ed6814: Pull complete 
Digest: sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
root@cuiyongchao:~# docker images centos
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              0d120b6ccaa8        2 months ago        215MB
root@cuiyongchao:~#

​ 一個 CentOS 才 200MB ?平時我們安裝一個 CentOS 至少都有幾個 GB,怎麼可能才 200MB !相信這是幾乎所有 Docker 初學者都會有的疑問,包括我自己。下面我們來解釋這個問題。

Linux 作業系統由核心空間和使用者空間組成。如下圖所示:

(2)rootfs

​ 核心空間是 kernel,Linux 剛啟動時會載入 bootfs 檔案系統,之後 bootfs 會被解除安裝掉。使用者空間的檔案系統是 rootfs,包含我們熟悉的 /dev, /proc, /bin 等目錄。

​ 對於 base 映象來說,底層直接用 Host 的 kernel,自己只需要提供 rootfs 就行了。而對於一個精簡的 OS,rootfs 可以很小,只需要包括最基本的命令、工具和程式庫就可以了。相比其他 Linux 發行版,CentOS 的 rootfs 已經算臃腫的了,alpine 還不到 10MB。我們平時安裝的 CentOS 除了 rootfs 還會選裝很多軟體、服務、圖形桌面等,需要好幾個 GB 就不足為奇了。

​ base 映象提供的是最小安裝的 Linux 發行版。下面是 CentOS 映象的 Dockerfile 的內容:

FROM scratch
ADD centos-7-docker.tar.xz /
CMD ["/bin/bash"]

​ 第二行 ADD 指令新增到映象的 tar 包就是 CentOS 7 的 rootfs。在製作映象時,這個 tar 包會自動解壓到 / 目錄下,生成 /dev, /porc, /bin 等目錄。注:可在 Docker Hub 的映象描述頁面中檢視 Dockerfile 。

(3)支援執行多種 Linux OS

​ 不同 Linux 發行版的區別主要就是 rootfs。比如 Ubuntu 14.04 使用 upstart 管理服務,apt 管理軟體包;而 CentOS 7 使用 systemd 和 yum。這些都是使用者空間上的區別,Linux kernel 差別不大。所以 Docker 可以同時支援多種 Linux 映象,模擬出多種作業系統環境。

上圖 Debian 和 BusyBox(一種嵌入式 Linux)上層提供各自的 rootfs,底層共用 Docker Host 的 kernel。

說明:

  • base 映象只是在使用者空間與發行版一致,kernel 版本與髮型版是不同的。

    例如 CentOS 7 使用 3.x.x 的 kernel,如果 Docker Host 是 Ubuntu 16.04(比如我們的實驗環境),那麼在 CentOS 容器中使用的實際是是 Host 4.x.x 的 kernel。

    root@cuiyongchao:~# uname -r
    4.15.0-121-generic ①
    root@cuiyongchao:~# docker run -it centos ②
    [root@5a0fcc31e885 /]# cat /etc/redhat-release 
    CentOS Linux release 8.2.2004 (Core) ③
    [root@5a0fcc31e885 /]# uname -r
    4.15.0-121-generic ④
    [root@5a0fcc31e885 /]#
    

    ① Host kernel 為 4.4.0-31

    ② 啟動並進入 CentOS 容器

    ③ 驗證容器是 CentOS 7

    ④ 容器的 kernel 版本與 Host 一致

  • 容器只能使用 Host 的 kernel,並且不能修改。

    所有容器都共用 host 的 kernel,在容器中沒辦法對 kernel 升級。如果容器對 kernel 版本有要求(比如應用只能在某個 kernel 版本下執行),則不建議用容器,這種場景虛擬機器可能更合適。