1. 程式人生 > 其它 >|NO.Z.00009|——————————|CloudVirtualiZation|——|Cloud&Docker映象.V01|-------------------------------------|DockerFile語法|

|NO.Z.00009|——————————|CloudVirtualiZation|——|Cloud&Docker映象.V01|-------------------------------------|DockerFile語法|



[CloudVirtualiZation:Cloud&Docker映象.V01]                                              [Applications.CloudVirtualiZation] [|docker|docker映象|倉庫管理|映象特性|dockerfile|docker倉庫構建|Harbor企業級私有倉庫]








一、docker映象管理
### --- 映象特性:

~~~     容器在建立時需要指定映象,每個映象都由唯一的表示Image ID,
~~~     和容器的container ID 一樣,預設是128位,可以使用前16位縮略形式,
~~~     也可以使用映象名與版本號兩部分組合唯一標識,
~~~     如果是省略版本號,預設使最新版本標籤(latest)
### --- 映象的分層:

~~~     docker的映象通過聯合檔案系統(union filesystem)將各層檔案系統疊加在一起
~~~     bootfs:用於系統引導的檔案系統,包括BootLoader 和 kernel,
~~~     容器啟動完成會被解除安裝以節省記憶體資源
~~~     roofs:位於bootfs之上,表現為docker容器的根檔案系統
~~~     傳統模式中,系統啟動時,核心掛載rootfs時會首先將其掛載為“只讀”模式,
~~~     完整性自檢完成後將其掛載為讀寫模式
~~~     docker中rootfs由核心掛載為“只讀”模式,而後通過UFS技術掛載一個“可寫”層
### --- 注:

~~~     1> Image ID=映象名稱+版本號(唯一標識):若無版本號:預設latest
~~~     2> 映象通過聯合檔案系統疊加在一起
~~~     3> bootfs:類似於我們傳統作業系統,正常引導正常解除安裝
~~~     4> rootfs:在傳統作業系統中由只讀改為讀寫,在docker中掛載為只讀模式,通過UFS(聯合檔案系統) 中掛載為可寫層,有隻讀改為讀寫。
~~~     5> 已有的分層只讀不能修改,上層映象優先順序大於底層映象。
二、dockerfile:映象的誕生:
### --- 容器>映象:docker commit CID XX.XX.XX

~~~     #重點:工作在前臺的守護程序至少一個
### --- DockerFIle:Dockfile是一種被docker程式解釋的指令碼,
~~~     #注:最多不超過128層;若寫入的命令超過128層,可以把相同的命令通過OS/OS結合在一起

~~~     dockerfile由一條一條的指令組成,每條指令對應linux下面的一條命令,
~~~     docker程式將這些dockerfile指令翻譯為真正的linux命令,
~~~     dockerfile有自己的書寫格式和支援的命令。
~~~     docker程式解決這些命令間的依賴關係,類似於Makefile,
~~~     docker程式將讀取dockerfile,
~~~     根據指令生成定製的image(是建立docker映象的語法;根據語法建立docker映象)
~~~     生成命令:docker  build -t yangqi/jdk-tomcat
~~~     匯出:docker save -o xx.xx.xx     xx.xx.xx.tar
~~~     匯入:docker load -i xx.xx.xx.tar

三、Dockerfile語法:(yuanjian)
### --- FROM(指定基礎image):
~~~     構建指令,必須指定且需要在Dockerfile其他指令的前面,
~~~     後續的指令都依賴與該指令指定的image。
~~~     FROM指令指定的基礎image可以是官方遠端倉庫中的,也可以於本地倉庫。
~~~     # 注:
~~~     基礎映象,基礎的東西結合,dockerfile中必須有from,且from有且只有一個;
~~~     有多個會報錯

example:
    FROM centos:7.2
    FROM centos
### --- MAINTAINER(用來指定映象建立者資訊):
~~~     構建指令,用於將image的製作者相關的資訊寫入到image中。
~~~     當我們對該image執行docker inspect命令時,輸出中有相應的欄位記錄該資訊。

example:MAINTAINER
    MAINTAINER yanqi“[email protected]
### --- RUN(安裝軟體用):
~~~     構建指令,RUN可以執行任何被基礎image支援的命令。
~~~     如基礎image選擇了Centos,那麼軟體管理部分職能使用Centos的包管理命令
~~~     # 注:
~~~     dockerfile中執行命令時必須要加run,單條命令時不可執行的。

example:
    RUN cd/tmp && curl -L 'https://archive.apache.org/dist/tomcat/tomcat-7/v7.0/bin/apache-tomcat-7.0.8.tar.gz'|tar -xz
    RUN["/bin/bash"."-c","echo hello"]
### --- CMD(設定container啟動時執行的操作):
~~~     設定指令,用於container啟動時指定的操作,該操作可以是執行自定義指令碼,
~~~     也可以是執行系統命令,該指令職能在檔案中存在一次,如果有多個,則只執行最後一條。
~~~     # 注:
~~~     映象轉換成映象或者容器,該命令只能在指令碼中只能存在一次,若有多個只能執行最後一個,

example:
    CMD echo “Hello,World!”
### --- ENTRYPOINT(設定container啟動時執行的操作):
~~~     設定指令,指定容器啟動時執行的命令,可以多次設定,但是隻有最後一個有效。

example:
    ENTRYPOINT ls -l
~~~     該指令的使用分為兩種情況,一種是獨自使用,另一種和CMD指令配合使用。
~~~     當獨自使用時,如果你還使用了CMD命令且CMD是 一個完整的可執行命令,
~~~     那麼CMD指令和ENTRYPOINT會互相覆蓋只有最後一個CMD或者ENTRYPOINT有效。
~~~     CMD指令將不會被執行,只有ENTRYPOINT指令被執行。
    CMD echo “Hello,World!”
    ENTRYPOINT ls -l

~~~     另一種用法和CMD指令配置使用來指定ENTRYPOINT的預設引數,
~~~     這時CMD指令不是一個完整的可執行命令,僅僅是引數部分,
~~~     ENTRYPOINT指令職能使用JSON方式指定執行命令,而不能指定引數
    FROM ubuntu
    CMD["-1"]
    ENTRYPOINT["/usr/bin/ls"]
### --- USER(設定container容器的使用者):
~~~     設定指令,設定窮容器的使用者,預設是root使用者

example:
    USER daemon = ENTRYPOINT["memcached","-u","daemon"]
### --- EXPOSE(指定容器需要對映到宿主機器的埠);
~~~     設定指令,該指令會將容器中的埠對映成宿主機器中的某個埠,當你需要訪問容器的時候,
~~~     可以不是用容器的IP地址而是使用宿主機器的IP地址加對映後的埠,
~~~     要完成整個操作需要兩個步驟,首先是dokerfile使用EXPOSE設定的埠,
~~~     這樣EXPOSE設定的埠號會被隨機對映成宿主機器中的一個埠號。
~~~     也可以指定需要對映到宿主機器的那個埠,
~~~     這時要確保宿主機器上的埠號沒有被使用,EXPOSE指令可以一次設定多個埠號,
~~~     相應的娙容器的時候,可以配套的多次使用-p選項。
~~~     # 注:
~~~     只起到了一個顯示作用,顯示埠號,若是不加不會顯示,後期通過-p可以指定。

example:
    # 對映一個埠
    EXPOSE 22
    # 相應的執行容器使用的命令
    docker run -p port1 image
   
    # 對映多個埠
    EXPOSE port1 port2 port3
    # 相應的執行容器使用的命令
    docker run -p port2 -p port3 image
    # 還可以指定需要對映到宿主機器上的某個埠號。
    docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image
### --- ENV(用於設定環境變數):構建指令,在image中設定一個環境變數
~~~     設定了後,後續的RUN命令都可以使用。container啟動後,
~~~     可以通過docker inspect檢視這個環境變數,也可以通過docker run --env key=value
~~~     時設定或修改環境變數。假如你安裝了JAVA程式,需要設定JAVA_HOME,
~~~     那麼可以在Dockerfile中這樣寫:

    example:
      ENV JAVA_HOME/path/to/java/dirent
### --- ADD(從src複製檔案到container的destination路徑)
      example:
        ADD<src><dest>
            <src>是相對被構建的源目錄的相對路徑,可以是檔案或者是目錄的路徑。也可以是一個遠端的檔案url:
            <dest>是container中的絕對路徑
### --- COPY(從src複製檔案到container的destination路徑)
~~~     # 注:
~~~     copy不支援URL,

        example:
            COPY<src><dest>
### --- VOLUME(指定掛載點):
~~~     設定指令,使容器中的一個目錄具有持久化儲存資料的功能,該目錄可以被容器本身使用,
~~~     也可以共享給其他容器使用。我們知道容器使用的是AUFS,這種檔案系統不能持久化資料,
~~~     當容器關閉後,所有的更改都會丟失,當容器中的應用有持久化資料的需要時可以在Dockerfile中使用該指令。

      example:
        FROM base
        VOLUME["/tmp?data"]
### --- WORKDIR(切換目錄):
~~~     設定指令,可以多次切換(相當於cd)命令,對RUN,CMD,ENTRYPOINT生效。

      example:
        WORKEDR/pl WORKEIR p2 RUN vim a.txt
### --- ONBUILD(在子映象中執行):ONBUILD指定的命令在構建映象時並不執行,
~~~     而是在它的子映象中執行。

      example:
        ONBUILD ADD ./APP/src
        ONBUILD RUN /usr/local/bin/python-build --dir/app/src  








===============================END===============================


Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart                                                                                                                                                    ——W.S.Landor



來自為知筆記(Wiz)