上一節咱們介紹了最小的 Docker 鏡像,本節討論 base 鏡像。docker
base 鏡像有兩層含義:centos
不依賴其餘鏡像,從 scratch 構建。工具
其餘鏡像能夠之爲基礎進行擴展。操作系統
因此,能稱做 base 鏡像的一般都是各類 Linux 發行版的 Docker 鏡像,好比 Ubuntu, Debian, CentOS 等。虛擬機
咱們以 CentOS 爲例考察 base 鏡像包含哪些內容。
下載鏡像:
docker pull centos容器
查看鏡像信息:基礎
鏡像大小不到 200MB。擴展
等一下!
一個 CentOS 才 200MB ?
平時咱們安裝一個 CentOS 至少都有幾個 GB,怎麼可能才 200MB !軟件
相信這是幾乎全部 Docker 初學者都會有的疑問,包括我本身。下面咱們來解釋這個問題。file
Linux 操做系統由內核空間和用戶空間組成。以下圖所示:
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 的內容:
第二行 ADD 指令添加到鏡像的 tar 包就是 CentOS 7 的 rootfs。在製做鏡像時,這個 tar 包會自動解壓到 / 目錄下,生成 /dev, /porc, /bin 等目錄。
注:可在 Docker Hub 的鏡像描述頁面中查看 Dockerfile 。
支持運行多種 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。
① Host kernel 爲 4.4.0-31
② 啓動並進入 CentOS 容器
③ 驗證容器是 CentOS 7
④ 容器的 kernel 版本與 Host 一致
容器只能使用 Host 的 kernel,而且不能修改。
全部容器都共用 host 的 kernel,在容器中沒辦法對 kernel 升級。若是容器對 kernel 版本有要求(好比應用只能在某個 kernel 版本下運行),則不建議用容器,這種場景虛擬機可能更合適。
下一節咱們討論鏡像的分層結構。