docker-6-DockerFile解析

 

一、是什麼

Dockerfile是用來構建Docker鏡像的構建文件,是由一系列命令和參數構成的腳本。java

構建三步驟:
一、編寫Dockerfile文件
二、docker build
三、docker run
 
文件什麼樣???
以咱們熟悉的CentOS爲例

 

二、DockerFile構建過程解析 

2.一、Dockerfile內容基礎知識
1:每條保留字指令都必須爲大寫字母且後面要跟隨至少一個參數
2:指令按照從上到下,順序執行
3:#表示註釋
4:每條指令都會建立一個新的鏡像層,並對鏡像進行提交

 

2.二、Docker執行Dockerfile的大體流程
(1)docker從基礎鏡像運行一個容器
(2)執行一條指令並對容器做出修改
(3)執行相似docker commit的操做提交一個新的鏡像層
(4)docker再基於剛提交的鏡像運行一個新容器
(5)執行dockerfile中的下一條指令直到全部指令都執行完成

 

 

2.三、小總結
從應用軟件的角度來看,Dockerfile、Docker鏡像與Docker容器分別表明軟件的三個不一樣階段,
*  Dockerfile是軟件的原材料
*  Docker鏡像是軟件的交付品
*  Docker容器則能夠認爲是軟件的運行態。
 
Dockerfile面向開發,Docker鏡像成爲交付標準,Docker容器則涉及部署與運維,三者缺一不可,協力充當Docker體系的基石。
一、 Dockerfile,須要定義一個Dockerfile,Dockerfile定義了進程須要的一切東西。
Dockerfile涉及的內容包括執行代碼或者是文件、環境變量、依賴包、運行時環境、動態連接庫、操做系統的發行版、
服務進程和內核進程(當應用進程須要和系統服務和內核進程打交道,這時須要考慮如何設計namespace的權限控制)等等;
2 、Docker鏡像,在用Dockerfile定義一個文件以後,docker build時會產生一個Docker鏡像,當運行 Docker鏡像時,會真正開始提供服務;
三、 Docker容器,容器是直接提供服務的。

 

 

 三、DockerFile體系結構(保留字指令)linux

 

3.一、FROM
基礎鏡像,當前新鏡像是基於哪一個鏡像的
 
3.二、MAINTAINER
鏡像維護者的姓名和郵箱地址
 
3.三、RUN
容器構建時須要運行的命令
 
3.四、EXPOSE
當前容器對外暴露出的端口
 
3.五、WORKDIR
指定在建立容器後,終端默認登錄的進來工做目錄,一個落腳點
 
3.六、ENV
用來在構建鏡像過程當中設置環境變量

 

3.七、ADD
將宿主機目錄下的文件拷貝進鏡像且ADD命令會自動處理URL和解壓tar壓縮包
 
3.八、COPY
相似ADD,拷貝文件和目錄到鏡像中。
將從構建上下文目錄中 <源路徑> 的文件/目錄複製到新的一層的鏡像內的 <目標路徑> 位置
COPY src dest
COPY ["src", "dest"]
 
3.九、VOLUME
容器數據卷,用於數據保存和持久化工做
 
3.十、CMD
指定一個容器啓動時要運行的命令
Dockerfile 中能夠有多個 CMD 指令, 但只有最後一個生效,CMD 會被 docker run 以後的參數替換

 

3.十一、ENTRYPOINT
指定一個容器啓動時要運行的命令
ENTRYPOINT 的目的和 CMD 同樣,都是在指定容器啓動程序及參數
 
3.十二、ONBUILD
當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承後父鏡像的onbuild被觸發
 
 
小總結

 

 

 

四、案例

4.一、Base鏡像(scratch)
Docker Hub 中 99% 的鏡像都是經過在 base 鏡像中安裝和配置須要的軟件構建出來的
 
4.二、自定義鏡像mycentos
4.2.一、編寫
Hub默認CentOS鏡像什麼狀況
         自定義mycentos目的使咱們本身的鏡像具有以下:
         登錄後的默認路徑
         vim編輯器
         查看網絡配置ifconfig支持

準備編寫DockerFile文件web

 

myCentOS內容DockerFile2
        FROM centosMAINTAINER zzyy< zzyy167@126.com>
        ENV MYPATH /usr/localWORKDIR $MYPATH
        RUN yum -y install vimRUN yum -y install net-tools
        EXPOSE 80
        CMD echo $MYPATHCMD echo "success--------------ok"CMD /bin/bash 
4.2.二、構建
docker build -t 新鏡像名字 :TAG .

 

安裝成功以後:docker

 

4.2.三、運行
docker run -it 新鏡像名字:TAG
能夠看到,咱們本身的新鏡像已經支持vim/ifconfig命令,擴展成功了。

 

 
4.2.四、列出鏡像的變動歷史
docker history 鏡像名

 

[root@MrChengs 桌面]# docker history 774a8af7e1a5
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
774a8af7e1a5        5 hours ago         /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin/b   0 B                 
49f67d3823f9        5 hours ago         /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo \   0 B                 
6da0097c48b1        5 hours ago         /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo $   0 B                 
68582740acb5        5 hours ago         /bin/sh -c #(nop) EXPOSE 80/tcp                 0 B                 
d382b224d129        5 hours ago         /bin/sh -c yum -y install net-tools             24.17 MB            
d4506485018a        5 hours ago         /bin/sh -c yum -y install vim                   125.7 MB            
e3f551ceea22        5 hours ago         /bin/sh -c #(nop) WORKDIR /usr/local            0 B                 
703b1f226717        5 hours ago         /bin/sh -c #(nop) ENV MYPATH=/usr/local         0 B                 
5650d63ecf94        5 hours ago         /bin/sh -c #(nop) MAINTAINER ccrr<1287221322@   0 B                 
ab9a80ab07d0        4 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B                 
f016d310caa9        4 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema.sch   0 B                 
e4b082fc6cdb        4 weeks ago         /bin/sh -c #(nop) ADD file:6f877549795f4798a3   201.8 MB  

 順着加載倒着執行!!! apache

 

 

4.三、CMD/ENTRYPOINT 鏡像案例
4.3.一、都是指定一個容器啓動時要運行的命令
4.3.二、CMD
Dockerfile 中能夠有多個 CMD 指令, 但只有最後一個生效,CMD 會被 docker run 以後的參數替換
Case:tomcat的講解演示-----docker run -it -p 8888:8080 tomcat ls -l

 

docker run -it -p 7777:8080 tomcat ls -l
說明只是最後一行命令生效根據:DockersFile文件配置
並無啓動tomcat

 

4.3.三、ENTRYPOINT
docker run 以後的參數會被當作參數傳遞給 ENTRYPOINT,以後造成新的命令組合
命令會被追加
 
Case:
製做CMD版能夠查詢IP信息的容器:
FROM centos
RUN yum install -y curl
CMD [ "curl", "-s", "http://ip.cn" ]

 

crul命令解釋: vim

 

 

 

 

 

問題:若是咱們但願顯示 HTTP 頭信息,就須要加上 -i 參數
WHY:
    咱們能夠看到可執行文件找不到的報錯,executable file not found。
    以前咱們說過, 跟在鏡像名後面的是 command,運行時會替換 CMD 的默認值。
    所以這裏的 -i 替換了原來的 CMD,而不是添加在原來的 curl -s http://ip.cn 後面。而 -i 根本不是命令,
    因此天然找不到。
    那麼若是咱們但願加入 -i 這參數,咱們就必須從新完整的輸入這個命令:
    $ docker run myip curl -s http://ip.cn -i

 

製做ENTROYPOINT版查詢IP信息的容器:centos

FROM centos
RUN yum install -y curl
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]

 

 

 

 ONBUILD:tomcat

 

 

 

自定義鏡像Tomcat9
一、mkdir -p /ccrr/mydockerfile/tomcat9
 
二、在上述目錄下touch c.txt

 

 
三、將jdk和tomcat安裝的壓縮包拷貝進上一步目錄

 

apache-tomcat-9.0.8.tar.gz
jdk-8u171-linux-x64.tar.gz

 

四、在/zzyyuse/mydockerfile/tomcat9目錄下新建Dockerfile文件
目錄內容
FROM centos
MAINTAINER zzyy<zzyybs@126.com>
#把宿主機當前上下文的c.txt拷貝到容器/usr/local/路徑下
COPY c.txt /usr/local/cincontainer.txt
#把java與tomcat添加到容器中
ADD  jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/
#安裝vim編輯器
RUN yum -y install vim
#設置工做訪問時候的WORKDIR路徑,登陸落腳點
ENV MYPATH  /usr/localWORKDIR $MYPATH
#配置java與tomcat環境變量
ENV JAVA_HOME  /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV  
CATALINA_HOME /usr/local/apache-tomcat-9.0.8ENV CATALINA_BASE  /usr/local/apache-tomcat-9.0.8ENV PATH  $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin#容器運行時監聽的端口EXPOSE  8080#啓動時運行tomcat# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ]# CMD  ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"]CMD  /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F  /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.ou
五、構建
 
六、run
Docker掛載主機目錄Docker訪問出現cannot open directory .: Permission denied
解決辦法:在掛載目錄後多加一個--privileged=true參數便可
 
七、驗證
 
八、結合前述的容器卷將測試的web服務test發佈
相關文章
相關標籤/搜索