一、是什麼
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
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 這參數,咱們就必須從新完整的輸入這個命令:
製做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發佈