4-1.寫時複製(Copy on write)
- 容器的工作流程與寫時複製機制
容器本身是一個基於內核的技術,在這上面會有一個最基礎的鏡像,下面會疊加很多層,比如這裏有加Apache,會生成一個鏡像,生成一個鏡像以後,我們纔會創建出這個容器也就是container,這個container是可以寫的。
這個就是鏡像的分層:
這個鏡像分層所有的分層生成以後,它都是隻讀的,這些文件都是不允許修改的,如果想修改怎麼去修改呢?你可以去上面累加。
那麼再累加的加這就是容器和鏡像:
生成容器以後,容器的這個層是可以進行讀和寫的,下面的這些層是不允許往裏面寫東西的,但是可以累加,就像累積木似的,一直加上去。
最後就會生成這樣的畫面:
容器是可寫的,鏡像是可讀的。如果有很多鏡像的話,比如本地主機有很多很多的鏡像,很多的鏡像有些層是可以共享的,可能,有些層他們之間是一樣的,一樣的話,這些層只會佔用一個空間,這樣比較節省空間。
最終是這樣的情況:
Container and layers
可以同個一個鏡像,啓動很多個容器,這些容器它共用的都是這一個鏡像,它不像虛擬機似得,如果有一個虛擬機是500G,我又啓動了一個,它又會佔用500G,它的內存資源是非常消耗的,那麼容器是共有這一個鏡像,不會啓動很多很多的容器,非常的省資源,這是docker容器的特點。
這些就是Copy on write這個機制來實現的,就是往上面里加就會生成一個,然後再往上面疊加這樣的情況。
- 寫時複製小結:
–多個容器共享鏡像
–啓動不用單獨複製鏡像
–只修改可讀寫層
–減少對空間的佔用和容器啓動時間
4-2.鏡像和容器的轉化
4-2.生成鏡像的方法
- docker commit命令
commit命令可以將一個容器固化爲一個新的鏡像。當需要製作特定鏡像時,會進行修改容器的配置,如在容器中安裝特定工具等,通過commit命令可以將這些修改保存起來,使其不會因爲容器的停止而丟失。使用方法如下:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
提交保存時,只能選用正在運行的容器(即可以通過docker ps查看到的容器)來製作新的鏡像。在製作特定鏡像時,直接使用commit命令只是一個臨時性的輔助命令,不推薦使用。官方建議用docker build命令結合Dockerfile創建和管理鏡像。 - 使用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 | 複製內容到鏡像 |
-
配置/構建指令(配置鏡像信息)
① 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
-
操作/設置指令(具體執行操作)
① 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。