【期末複習】Docker(4)

4-1.寫時複製(Copy on write)

  1. 容器的工作流程與寫時複製機制
    容器本身是一個基於內核的技術,在這上面會有一個最基礎的鏡像,下面會疊加很多層,比如這裏有加Apache,會生成一個鏡像,生成一個鏡像以後,我們纔會創建出這個容器也就是container,這個container是可以寫的。
    這個就是鏡像的分層:

    這個鏡像分層所有的分層生成以後,它都是隻讀的,這些文件都是不允許修改的,如果想修改怎麼去修改呢?你可以去上面累加。
    那麼再累加的加這就是容器和鏡像:
    生成容器以後,容器的這個層是可以進行讀和寫的,下面的這些層是不允許往裏面寫東西的,但是可以累加,就像累積木似的,一直加上去。

    最後就會生成這樣的畫面:
    容器是可寫的,鏡像是可讀的。如果有很多鏡像的話,比如本地主機有很多很多的鏡像,很多的鏡像有些層是可以共享的,可能,有些層他們之間是一樣的,一樣的話,這些層只會佔用一個空間,這樣比較節省空間。

    最終是這樣的情況:
    Container and layers

    可以同個一個鏡像,啓動很多個容器,這些容器它共用的都是這一個鏡像,它不像虛擬機似得,如果有一個虛擬機是500G,我又啓動了一個,它又會佔用500G,它的內存資源是非常消耗的,那麼容器是共有這一個鏡像,不會啓動很多很多的容器,非常的省資源,這是docker容器的特點。
    這些就是Copy on write這個機制來實現的,就是往上面里加就會生成一個,然後再往上面疊加這樣的情況。
  2. 寫時複製小結:
    –多個容器共享鏡像
    –啓動不用單獨複製鏡像
    –只修改可讀寫層
    –減少對空間的佔用和容器啓動時間

4-2.鏡像和容器的轉化

在這裏插入圖片描述

4-2.生成鏡像的方法

  1. docker commit命令
    commit命令可以將一個容器固化爲一個新的鏡像。當需要製作特定鏡像時,會進行修改容器的配置,如在容器中安裝特定工具等,通過commit命令可以將這些修改保存起來,使其不會因爲容器的停止而丟失。使用方法如下:
    docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    提交保存時,只能選用正在運行的容器(即可以通過docker ps查看到的容器)來製作新的鏡像。在製作特定鏡像時,直接使用commit命令只是一個臨時性的輔助命令,不推薦使用。官方建議用docker build命令結合Dockerfile創建和管理鏡像。
  2. 使用dockerfile:build指令
    dockerfile其實本質是也是啓動容器去commit,只是這些操作都是docker自動化去完成。

4-3.Dockerfile及相關命令——大題

基本結構
Dockerfile是一個文本格式的配置文件,用戶可以使用Dockerfile來快速創建自定義的鏡像。
Dockerfile由一行行命令語句組成,並且支持以#開頭的註釋行。
一般而言,Dockerfile主體內容分爲四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啓動時執行指令。
下面給出一個簡單的示例:

# 指明所基於的鏡像名稱爲centos
FROM centos
# 指定維護者的郵箱爲[email protected]
MAINTAINER [email protected]
# 將複製nginx-1.12.2.tar.gz路徑下的內容到容器中的/usr/local/src路徑下
ADD nginx-1.12.2.tar.gz /usr/local/src
# 運行指定命令
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

指令說明
Dockerfile中每一個指令就對應生成一個鏡像,即每個指令對應一個鏡像層。
Dockerfile的指令根據作用可以分爲兩種,構建指令和設置指令。構建指令用於構建image,其指定的操作不會在運行image的容器上執行;設置指令用於設置image的屬性,其指定的操作將在運行image的容器中執行。

分類指令說明
配置/構建指令ARG定義創建鏡像過程中使用的變量
FROM指定所創建鏡像的基礎鏡像
LABEL爲生成的鏡像添加元數據標籤信息
EXPOSE聲明鏡像內服務監聽的端口
MAINTAINER指定維護者信息
ENV指定環境變量
ENTRYPOINT指定鏡像的默認入口命令
VOLUME創建一個數據卷掛載點
USER指定運行容器時的用戶名或UID
WORKDIR配置工作目錄
ONBUILD創建子鏡像時指定自動執行的操作指令
STOPSIGNAL指定退出的信號值
HEALTHCHECK配置所啓動容器如何進行健康檢查
SHELL指定默認shell類型
操作/設置指令RUN運行指定命令
CMD啓動容器時指定默認執行的命令
ADD添加內容到鏡像
COPY複製內容到鏡像
  1. 配置/構建指令(配置鏡像信息)
    ① FROM
    格式爲FROM <image>或FROM <image>:tag
    任何Dockerfile中第一條指令必須是FROM指令,且在同一個Dockerfile中創建多個鏡像時,可以使用多個FROM指令。
    ② MAINTAINER
    格式爲MAINTAINER <user_name> <user_email>
    指定維護者信息
    ③ ENV
    格式爲:EVN <key> <value>
    用於指定環境變量,這些環境變量,後續可以被RUN指令使用,容器運行起來之後,也可以在容器中獲取這些環境變量。
    例如
    ENV word hello
    RUN echo $word

  2. 操作/設置指令(具體執行操作)
    ① RUN
    格式爲RUN <command>或 RUN [“executalbe”,“param1”,“param2”…]。注意後者指令會被解析爲JSON數組,因此必須用雙引號。前者默認在shell終端中運行命令,即/bin/sh -c;後者使用exec執行,不會啓動shell環境。
    指定其他終端類型可以通過第二種方式實現,例如RUN ["/bin/bash","-c","echo hello"]
    ② CMD
    CMD用於指定容器啓動時執行的命令。
    支持三種格式:
    CMD ["executable","param1","param2"]:使用exec執行,這是推薦的方式。
    CMD command param1 param2:在默認shell中執行,提供給需要交互的應用。
    CMD ["param1","param2"]:提供給ENTERYPOINT的默認參數。
    每個Dockerfile只能有一條CMD命令,多個CMD命令只執行最後一個。
    若容器啓動時指定了運行的命令,則會覆蓋掉CMD中指定的命令。
    ③ ADD
    添加內容到鏡像。
    格式:ADD <src> <dest>
    該命令將複製指定的<src>路徑下內容到容器中的<dest>路徑中。
    其中<src>可以是Dockerfile所在目錄下的一個相對路徑(文件或目錄),也可以是一個URL或一個tar文件,tar文件會自動解壓爲目錄。<dest>可以是鏡像內絕對路徑,或者相對於工作目錄(WORKDIR)的相對路徑。
    路徑支持正則格式。
    ④ COPY
    複製內容到鏡像。
    格式爲:COPY <src> <desc>
    複製本地主機的<src>>(爲Dockerfile所在目錄下的一個相對路徑,文件或目錄)下內容到鏡像中的<desc>。目標路徑不存在時,會自動創建。
    路徑同樣支持正則格式。
    COPY與ADD指令功能相似,當使用本地目錄爲源目錄時,推薦使用COPY。

4-4.端口映射

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章