177. docker鏡像的分層與優化

1. docker的鏡像分層

相當於kvm 鏈接克隆,寫時複製的特性
docker裏的鏡像絕大部分都是在別的鏡像的基礎上去進行創建的,也就是使用鏡像的分層結構。

2. 實驗

比如說使用dockerfile去創建一個最簡單的hello鏡像。創建好對應的dockerfile之後去進行創建:

FROM alpine:latest
MAINTAINER sbb
CMD echo "hello world"

執行了上面的命令我們可以看到存在着兩個鏡像,其中hello_world是我剛剛創建好的鏡像。

$ docker imgaes
alpine
hello_world

3. docker分層

那麼爲什麼會有兩個鏡像呢?這是由於docker的鏡像分層結構所導致的,如下圖所示。
img

一個docker鏡像由多個可讀的鏡像層組成,然後運行的容器會在這個docker的鏡像上面多加一層可寫的容器層,任何的對文件的更改都只存在此容器層。因此任何對容器的操作均不會影響到鏡像。

4. 如何實現

至於容器如何獲取鏡像層文件而又不影響到是鏡像層的呢?docker是這樣實現的?
如果需要獲取某個文件,那麼容器曾會從上到下去下一層的鏡像層去獲取文件,如果該層文件不存在,那麼就會去下一鏡像層去尋找,直到最後一層。
對於用戶而言,用戶面向的是一個疊加後的文件系統。

img

而任何對於文件的操作都會記錄在容器層,例如說修改文件,容器層會把在鏡像層找到的文件拷貝到容器層然後進行修改,刪除文件則會在容器層內記錄刪除文件的記錄。

5. 綜述

鏡像分層的好處

1. 基本上每個軟件都是基於某個鏡像去運行的,因此一旦某個底層環境出了問題,就不需要去修改全部基於該鏡像的軟件的鏡像,只需要修改底層環境的鏡像。
2. 這個好處也是最大好處,就是可以共享資源,其他相同環境的軟件鏡像都共同去享用同一個環境鏡像,而不需要每個軟件鏡像要去創建一個底層環境。
3. 可以複用,節省磁盤空間,相同的內容只需加載一份到內存。 修改dockerfile之後,再次構建速度快

6. dockerfile優化

dockerfile 優化:

1:儘可能選擇體積小linux發行版,alpine

2:儘可能合併RUN指令,清理無用的文件(yum緩存,源碼包)

3:修改dockerfile時,把需要變更的內容儘可能放在dockerfile結尾

4:使用.dockerignore,減少不必要的文件ADD . /html

例如:
[root@docker01 nginx]# cat dockerfile 
FROM centos:6.9
RUN  rm -rf /etc/yum.repos.d/* && \
	curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo && \
	curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo && \
	yum install nginx -y
WORKDIR /usr/share/nginx/html
ADD xiaoniao.tar.gz .
ADD init.sh /init.sh
EXPOSE 80
VOLUME /usr/share/nginx/html
CMD ["/bin/bash","/init.sh"]


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