1. 程式人生 > >Docker 映象管理

Docker 映象管理

認識Docker映象

  建立映象時需要制定使用哪個映象。它會先從本地查詢有沒有這個映象,如果不存在,就去官方Docker Hub倉庫查詢並下載到本機然後基於該映象建立容器。

每個映象有一個唯一的ID,也可以使用映象的名字和版本號兩部分組合唯一表示。如果省略版本號,預設使用最新版本(latest)

  docker images #查到本機已有的所有映象

映象分層

  映象所佔的磁碟空間遠遠小於所有映象之和,原因是Docker映象採用分層機制,相同部分獨立成層,只需要儲存一份就可以了大大節省了映象空間。Docker

的映象通過聯合檔案系統,將各層疊加在一起,在使用者看來就像一個完整的檔案系統,感覺不到分層的存在。

  docker history #docker history <image_name> #查詢映象分了多少層,每一層具體做了什麼操作。

分層的映象有兩個特性:一是已有的分層只能讀不能修改,另外一個是上層映象的優先順序高於底層映象。

已有的分層不能修改,如果要修改,只能通過在映象的基礎上新增一個分層,儲存修改後的檔案,利用“上層映象的優先順序高於底層映象”的原則,新增分層的檔案會覆蓋原有映象。

從使用者視角,就會看到修改後的檔案內容,而原有的映象內容沒有變。

  容器時在映象的基礎上建立的,從檔案系統的角度來講,它是在分層映象的基礎上增加一個新的空白分層,這個新分層是可讀寫的。新建立的容器啟動後是可寫的。所有的寫

操作都會儲存在最上面的可讀寫層。

  docker commit #提交生成新映象

  映象A修改檔案a.txt,生成形象AA。步驟如下:

  首先,基於映象A建立一個新容器C.

  其次,在容器C中修改檔案a.txt的內容。

  最後,通過docker commit 命令提交生成新的映象AA。 但這種方式會讓映象的層越來越多,另外一種情況一旦基礎映象需要修改,基於他的上層應用映象很多,如果每一個

上層映象都通過這種容器方式生成新映象,那麼維護的工作量太大。

Dockerfile

      使用GUN的make工具能夠比較方便構建一個工程,整個工程的編譯只需要一個命令就可以完成編譯、連線以至於最後的執行。

Makefile檔案中描述了整個工程所有檔案的編

譯順序、編譯規則。Makefile有自己的書寫格式、關鍵字、函式。其中包括:工程中的哪些原始檔需要編譯以及如何編譯、需要建立哪些庫檔案、如何最後產生我們想要的可執

行檔案儘管看起來可能很複雜,但是為工程編寫makefile的好處是一旦提供一個正確的Makefile,就能夠使用一行命令來完成“自動化編譯”。編譯整個工程所要做的唯一的一件事

就是在shell提示符下輸入make命令。整個工程完全自動編譯,極大提高了效率。

  Dokcer 提供了和Makefile完全一樣的機制來管理映象,這就是Dokcerfile。它是Docker映象的描述檔案,通過Dockerfile做出來的,包含作業系統基礎檔案和軟體執行環境,

它使用分層的儲存方式。

  # base image,表示從centos這個基礎映象開始構建,centos是他的底層映象
  FROM centos

  # MAINTAINER,指定該進行的建立者
  MAINTAINER [email protected]

  # put nginx-1.12.2.tar.gz into /usr/local/src and unpack nginx
  ADD nginx-1.12.2.tar.gz /usr/local/src

  # running required command,執行shell命令,如果有多條命令可以用“&&”連結
  RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
  RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
  RUN useradd -M -s /sbin/nologin nginx

  # change dir to /usr/local/src/nginx-1.12.2
  WORKDIR /usr/local/src/nginx-1.12.2

  # execute command to compile nginx
  RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module

  --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module

  --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module

  --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install

  #設定環境變數

  ENV PATH /usr/local/nginx/sbin:$PATH

  #指定監聽的埠

  EXPOSE 80

  #這個關鍵字和以上所有的關鍵字是有區別的,上面的關鍵字都是在構建映象時執行,但這個關鍵字是預執行命令,在建立映象時不執行,要等到使用該映象時,容器啟動後才執行

  ENTRYPOINT ["nginx"]

  CMD ["-g","daemon off;"]

從例子我們看到Dockerfile的語法規則:每行都以一個關鍵字為首行,如果一行內容過長,它使用“\”把多行連線到一起。

docker build  -t  image_name #編譯Dokcerfile,通過“-t”選項給映象起一個名字。

有了新映象,就可以通過docker run命令建立和使用新容器了。

專案中的映象分層

  >>多個專案會共享基礎映象。

  >>每個映象加一個可寫層形成容器,多個容器組合在一起,對外提供某些特殊功能的服務。

  >>基於同一個映象增加一個可寫層,就可以為不同專案建立各自需要的容器。

對我們的啟發是:當我們製作自己的應用映象時,也儘量考慮使用相同的底層映象,這樣可以極大地降低後續的維護成本。