Docker 鏡像管理

認識Docker鏡像nginx

  建立鏡像時須要制定使用哪一個鏡像。它會先從本地查找有沒有這個鏡像,若是不存在,就去官方Docker Hub倉庫查找並下載到本機而後基於該鏡像建立容器。c++

每一個鏡像有一個惟一的ID,也可使用鏡像的名字和版本號兩部分組合惟一表示。若是省略版本號,默認使用最新版本(latest)docker

  docker images #查到本機已有的全部鏡像shell

鏡像分層json

  鏡像所佔的磁盤空間遠遠小於全部鏡像之和,緣由是Docker鏡像採用分層機制,相同部分獨立成層,只須要存儲一份就能夠了大大節省了鏡像空間。Dockercentos

的鏡像經過聯合文件系統,將各層疊加在一塊兒,在用戶看來就像一個完整的文件系統,感受不到分層的存在。dom

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

分層的鏡像有兩個特性:一是已有的分層只能讀不能修改,另一個是上層鏡像的優先級高於底層鏡像。工具

已有的分層不能修改,若是要修改,只能經過在鏡像的基礎上新增一個分層,存儲修改後的文件,利用「上層鏡像的優先級高於底層鏡像」的原則,新增分層的文件會覆蓋原有鏡像。ui

從用戶視角,就會看到修改後的文件內容,而原有的鏡像內容沒有變。

  容器時在鏡像的基礎上建立的,從文件系統的角度來說,它是在分層鏡像的基礎上增長一個新的空白分層,這個新分層是可讀寫的。新建立的容器啓動後是可寫的。全部的寫

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

  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 json_hc@163.com

  # 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命令建立和使用新容器了。

項目中的鏡像分層

  >>多個項目會共享基礎鏡像。

  >>每一個鏡像加一個可寫層造成容器,多個容器組合在一塊兒,對外提供某些特殊功能的服務。

  >>基於同一個鏡像增長一個可寫層,就能夠爲不一樣項目建立各自須要的容器。

對咱們的啓發是:當咱們製做本身的應用鏡像時,也儘可能考慮使用相同的底層鏡像,這樣能夠極大地下降後續的維護成本。

相關文章
相關標籤/搜索