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的鏡像分層結構所導致的,如下圖所示。
一個docker鏡像由多個可讀的鏡像層組成,然後運行的容器會在這個docker的鏡像上面多加一層可寫的容器層,任何的對文件的更改都只存在此容器層。因此任何對容器的操作均不會影響到鏡像。
4. 如何實現
至於容器如何獲取鏡像層文件而又不影響到是鏡像層的呢?docker是這樣實現的?
如果需要獲取某個文件,那麼容器曾會從上到下去下一層的鏡像層去獲取文件,如果該層文件不存在,那麼就會去下一鏡像層去尋找,直到最後一層。
對於用戶而言,用戶面向的是一個疊加後的文件系統。
而任何對於文件的操作都會記錄在容器層,例如說修改文件,容器層會把在鏡像層找到的文件拷貝到容器層然後進行修改,刪除文件則會在容器層內記錄刪除文件的記錄。
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"]