# Dockerfile ## 先用一個例子講解,再帶入觀念! 在文件夾內寫入功能 example: ``` #volumn test FROM centos VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"] CMD echo "fuck you" CMD /bin/bash ``` 建立新鏡像(在家目錄輸入下面指令,不要在根目錄,但我不知道為什麼) example: ``` docker build -f /dockerfile/dockerfile1 -t mycentos . (-f:指名位置在哪;-t:命名空間) ``` Docker file 容器數據卷 Docker 可以通過鏡像生成容器,然後在容器之間建立與宿主機的連結,亦可在已經建立的容器上建立承襲該容器的新容器。 舉例而言,依照上述生成的容器A中,已有兩資料夾dataVolumeContainer1和dataVolumeContainer2可和宿主機實現掛載,此時可以再從容器A以承襲的方式生成容器B,此時容器B中的配置與容器A完全相同,其亦有兩個資料夾dataVolumeContainer1和dataVolumeContainer2可和宿主機實現掛載 * 注意此時該資料夾連接容器A、容器B與宿主機。 * 此時刪除容器A,容器B仍然持續運作,因為容器之間配置信息的傳遞,數據卷生命週期一直持續到沒有容器使用它為止。 寫法 ``` docker run -it --name [容器二名稱] --volumn-from [容器一名稱] [鏡像名稱] ``` 容器二是承襲容器一而產生的容器。 ## 所以到底什麼是Dockerfile?????? 從前面,我們發現一開始要手動編寫一個dockerfile文件(有點類似打code)(要記得符合file的規範),然後以docker build執行,會獲得一個自定義的鏡像。 --- #### Dockerfile是用來構建Docker鏡像構建文件,由一系列的命令與參數構成的腳本。 1. 每條保留字指令都必須為大寫字母且後面要跟隨至少一個參數。 2. 指令需從上到下,順序執行。 3. #表示註釋。 4. 每條指令都會創建一的新的鏡像層,並對鏡像進行提交。 --- #### Dockerfile執行大致流程 1. docker從基礎鏡像運行一個容器 2. 執行一條指令並對容器做出修改 3. 執行類似docker connit的操作庭交一個新的鏡像層 4. docker再基於剛提交的鏡像運行一個新容器 5. 執行dockerfile中的下一條指令直到所有指令都執行完成 --- #### Dockerfile、鏡像與容器關係 1. Dockerfile是軟件的原材料 2. Docker鏡像是軟件的交付品 3. Docker容器則可以認為是軟件的運型態 * Dockerfile面向開發,Docker鏡像成為交付標準,Docker容器則涉及部署與運維,三者為Docker體系的基石,缺一不可。 --- #### Dockerfile指令 1. RUN:執行一個具體命令。 2. EXPOSE:容器對外暴露的窗口 3. WORKDIR:指定創建容器後,終端默認進入的工作目錄,沒有的話則會默認再根目錄(如centos的鏡像沒有設WORKDIR,所以執行容器會先到其根目錄) 4. ENV:設置建構鏡像過程中的環境變量 5. ADD:複製+解壓縮 6. COPY:複製 >語法:COPY/ADD [要複製的檔案名稱] [要複製的容器位置] > example: COPY a.txt /usr/local/b.txt) > b.txt可以不打,如果只有路徑,指令會自動複製原名稱,即a.txt 7. VOLUME:容器數據卷,用於數據保存與持久化工作 8. CMD:指定一個容器要運行的命令 9. ENTERPOINT:指定一個容器要運行的命令 10. ONBUILD:當建構一個被繼承的Dockerfle時運行命令,父鏡像在被子鏡像繼承後,父鏡像在被子繼承後父鏡像的onbuild被觸發。 * CMD和ENTERPOINT區別:ENTERPOINT的目的和CMD一樣,都是在指定容器啟動程序及參數,但多個CMD指令僅有最後一個生效,且CMD命令會被docker run之後的參數替換。 --- ### Dockerfile實作 #### 製作一個有vim指令及config指令的centos ``` FROM centos MAINTAINER af<xt21109142@gmail.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "success----------ok" CMD /bin/bash ``` 1. 承襲自原centos 2. 自訂鏡像的作者名稱 3. 環境配置 MYPATH = /usr/local ###### tags: `docker`