base鏡像有兩層含義:nginx
因此,base鏡像通常都是各類Linux發行版本的Docker鏡像,好比:Ubuntu,Debian或者CentOS等。docker
base鏡像提供的都是最小安裝的Linux發行版本。
咱們大部分鏡像都將是基於base鏡像構建的。因此,一般使用的是官方發佈的base鏡像。能夠在docker hub裏找到。好比centos:https://hub.docker.com/_/centos
咱們能夠本身構建docker base鏡像,也能夠直接使用已有的base鏡像。好比centos。咱們能夠直接從docker hub上拉取。
拉取ubuntu
docker pull centos
查看centos
docker images centos REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 1e1148e4cc2c 2 months ago 202MB
能夠看到最新的centos鏡像只有200mb,是否是以爲過小了?這是由於docker鏡像在運行的時候直接使用docker宿主機器的kernel。安全
Linux操做系統由用戶空間和內核空間構成。
內核空間是kernel,用戶空間是rootfs,不一樣發行版的區別主要是rootfs。好比Ubuntu 14.04使用 upstart 管理服務,apt 管理軟件包;而 CentOS 7 使用 systemd 和 yum。這些都是用戶空間的不一樣,Kernel差異不大。負載均衡
因此Docker能夠同時支持多種 Linux 鏡像,模擬出不一樣的操做系統環境。性能
base鏡像只是用戶空間和發行版本一致,內核空間使用的是Docker宿主機器的Kernel。測試
上文裏展現瞭如何下載一個base鏡像。咱們一般是基於這份base鏡像來構建咱們本身的鏡像。好比,在centos裏添加一個nginx負載均衡。首先,得須要瞭解鏡像的結構是什麼。優化
官方文檔: https://docs.docker.com/stora...spa
啓動鏡像時,一個新的可寫層會加載到鏡像的頂層。這一層一般稱爲"容器層",之下是"鏡像層"。
容器層能夠讀寫,容器全部發生文件變動寫都發生在這一層。鏡像層只容許讀取,read-only。
Docker經過一個修改時複製策略來保證base鏡像的安全性,以及更高的性能和空間利用率。
從最上層的鏡像層開始往下找,找到後讀取到內存中,若已經在內存中,能夠直接使用。換句話說,運行在同一臺機器上的Docker容器共享運行時相同的文件。
從上往下查找,找到後複製到容器層,對於容器來講,能夠看到的是容器層的這個文件,看不到鏡像層裏的文件,而後直接修改容器層的文件。
從上往下查找,找到後在容器中記錄刪除,並非真正的刪除,而是軟刪除。這致使鏡像體積只會增長,不會減小。
直接在最上層的容器可寫層增長,不會影響鏡像層。
基礎鏡像選擇時,選擇合適的較小的鏡像,經常使用的 Linux 系統鏡像通常有 Ubuntu、CentOs、Alpine···等
在Dockerfile中,每條指令都會建立一個鏡像層,從而增長鏡像的大小。當前層的修改不會影響上一層。
具體實例以下:
自定義Dockerfile:
FROM ubuntu:14.04 #基礎源鏡像 MAINTAINER xiongkun #描述鏡像的建立者,名稱和郵箱 WORKDIR /home RUN dd if=/dev/zero of=50M.file bs=1M count=50 #建立大小爲50M的測試文件 RUN rm -rf 50M.file #刪除該文件
優化後的Dockerfile:
FROM ubuntu:14.04 #基礎源鏡像 MAINTAINER xiongkun #描述鏡像的建立者,名稱和郵箱 WORKDIR /home RUN dd if=/dev/zero of=50M.file bs=1M count=50 && rm -rf 50M.file #建立文件,同時在該層刪除該文件