Docker 鏡像分層及dockerfile 編寫技巧

docker鏡像分層

分層介紹

Dockerfile中的每個指令都會創建一個新的鏡像層

鏡像層將被緩存和復用

當Dockerfile的指令修改瞭,復制的文件變化瞭,或者構建鏡像時指定的變量不同瞭,對應的鏡像層緩存就會失效

某一層的鏡像緩存失效之後,它之後的鏡像層緩存都會失效

鏡像層是不可變的,如果在某一層中添加一個文件,然後在下一層中刪除它,則鏡像中依然會包含該文件

Docker鏡像原理

  • Docker鏡像是由特殊的文件系統疊加而成
  • ·最底端是bootfs,並使用宿主機的bootfs
  • ·第二層是root文件系統rootfs,稱為base image
  • ·然後再往上可以疊加其他的鏡像文件
  • ·統一文件系統(Union File System)技術能夠將不同的層整合成一個文件系統,為這些層提供瞭 一個統一的視角,這樣就隱藏瞭多層的存在,在用戶的角度看來,隻存在一個文件系統。
  • ·一個鏡像可以放在另一個鏡像的上面。位於下面的鏡像稱為父鏡像,最底部的鏡像成為基礎鏡像。
  • ·當從一個鏡像啟動容器時,Docker會在最頂層加載一個讀寫文件系統作為容器。

1.base image:基礎鏡像
2.image:固化瞭一個標準運行環境,鏡像本身的功能-封裝一組功能性的文件,通過統一的方式,文件格式提供出來(隻讀)
3.container:容器層(讀寫)
4.docker-server 端
5.呈現給docker-client (視圖)

鏡像分層模型 

 dockerfile 編寫

dockerfile操作指令

序號 指令 含義
1 FROM 鏡像 指定新鏡像所基於的鏡像,第 條指必須為from指令,每創建一個鏡像就需要一條from指令
2 MAINTAINER 名字 說明新鏡像的維護人信息
3 RUN 命令 在所基於的鏡像上執行命令,並提交到新的鏡像中;docker內每執行一條命令都是run開頭
4 CMD["要運行的程序","參數1","參數2"] 指令啟動容器時要運行的命令或者腳本,Dockerfile隻能有一條CMD命令, 如果指定多條則隻能最後一條被執行
5 EXPOSE 端口號 指定新鏡像加載到Docker時要開啟的端口
6 ENV 環境變量 變量值 設置一個環境變量的值,會被後面的run使用
7 ADD 源文件、目錄 目標文件/目錄 具體識別壓縮格式並且自動解壓,將源文件復制到目標文件,源文件要與dockerfile位於相同目錄中,或者一個URL
8 COPY 源文件/目錄 目標文件/目錄 將本地主機上的文件/目錄復制到目標地點,源文件/目錄要與Dockerfile在相同的目錄中
9 VOLUME ["目錄"] 在容器中創建一個掛載點
10 USER 用戶名/UID 指定運行容器時的用戶
11 WORKDIR 路徑 為後續的RUN、CMD、ENTRYPOINT指定工作目錄
12 ONBUILD 命令 指定所生成的鏡像作為一個基礎鏡像時所要運行的命令
13 HEALTHCHECK 健康檢查

ADD和copy區別

              ①Dockerfile中的COPY指令和ADD指令都可以將主機上的資源復制或加入到容器鏡像中,都是在構建鏡像的過程中完成的
              ②copy隻能用於復制(節省資源)
              ③ADD復制的同時,如果復制的對象時壓縮包,ADD還可以解壓(消耗資源)
              ④COPY指令和ADD指令的唯一區別在於是否支持從遠程URL獲取資源。COPY指令隻能從執行docker build所在的主機上讀取資源並復制到鏡像中。而ADD指令還支持通過URL從遠程服務器讀取資源並復制到鏡像中
              ⑤滿足同等功能的情況下,推薦使用COPY指令。ADD指令更擅長讀取本地tar文件並解壓縮

CMD和entrypoint區別

   一般還是會用entrypoint的中括號形式作為docker 容器啟動以後的默認執行命令,裡面放的是不變的部分,可變部分比如命令參數可以使用cmd的形式提供默認版本,也就是run裡面沒有任何參數時使用的默認參數。如果我們想用默認參數,就直接run,否則想用其他參數,就run 裡面加參數。

嘗試編寫dockerfile文件 部署nginx


mkdir nginx
cd nginx/
vim Dockerfile 
 
FROM centos:7      #基於基礎鏡像
MAINTAINER nginx   #用戶信息
RUN yum -y update   #安裝依賴關系
RUN yum install -y pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx                     #創建用戶
ADD nginx-1.12.0.tar.gz /usr/local/src                    #將源文件復制到目標文件,源文件要與 
                                                            Dockerfile位於相同目錄中,或者是 
                                                             一個URL
 
VOLUME ["/usr/local/nginx/html"]                        #在容器中創建一個掛載點
WORKDIR /usr/local/src                                  #指定工作目錄
WORKDIR nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \--user=nginx \--group=nginx \--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80                                                   #暴露端口
RUN echo "demon off;" >>/usr/local/nginx/conf/nginx.conf
CMD nginx

docker運行nginx為什麼要使用 daemon off

docker運行nginx為什麼要使用 daemon off

到此這篇關於Docker 鏡像分層及dockerfile 編寫的文章就介紹到這瞭,更多相關Docker 鏡像分層內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: