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,就能夠使用一行命令來完成“自動化編譯”。編譯整個工程所要做的唯一的一件事
就是在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命令建立和使用新容器了。
專案中的映象分層
>>多個專案會共享基礎映象。
>>每個映象加一個可寫層形成容器,多個容器組合在一起,對外提供某些特殊功能的服務。
>>基於同一個映象增加一個可寫層,就可以為不同專案建立各自需要的容器。
對我們的啟發是:當我們製作自己的應用映象時,也儘量考慮使用相同的底層映象,這樣可以極大地降低後續的維護成本。