1. 程式人生 > 其它 >尚矽谷Docker筆記(6)-- DockerFile解析

尚矽谷Docker筆記(6)-- DockerFile解析

一、是什麼

1、Dockerfile是用來構建Docker映象的構建檔案,是由一系列命令和引數構成的指令碼

2、構建三步驟

編寫Dockerfile檔案

docker build

docker run

3、檔案什麼樣???

熟悉的Centos為例

二、DockerFile構建過程解析

1、Dockerfile內容基礎知識

1、每條保留字指令都必須為大寫字母且後面要跟隨至少一個引數
2、 指令按照從.上到下,順序執行
3、#表示註釋
4、每條指令都會建立一個新的映象層,並對映象進行提交

2、Docker執行Dockerfile的大致流程

1、 docker 從基礎映象執行一個容器
2、執行一條指令並對容器作出修改
3、執行類似docker commit的操作提交一個新的映象層
4、docker再基 於剛提交的映象執行一個新容器
5、執行dockerfile中的 下一條指令直到所有指令都執行完成

小總結

從應用軟體的角度來看,Dockerfile、Docker映象與Docker容器分別代表軟體的三個不同階段,

  • Dockerfile是軟體的原材料
  • Docker映象是軟體的交付品
  • Docker容器則可以認為是軟體的執行態。
    Dockerfile面向開發,Docker映象成為交付標準,Docker容器則涉及部署與運維,三者缺一不可,合力充當Docker體系的基石。

1 Dockerfile,需要定義一個Dockerfile,Dockerfile定義了程序需要的一切東西。Dockerfile涉及的內容包括執行程式碼或者是檔案、環境變數、依賴包、執行時環境、動態連結庫、作業系統的發行版、服務程序和核心程序(當應用程序需要和系統服務和核心程序打交道,這時需要考慮如何設計namespace的許可權控制)等等;

2 Docker映象,在用Dockerfile定義一個檔案之後,docker build時會產生一個Docker映象,當執行 Docker映象時,會真正開始提供服務;

3 Docker容器,容器是直接提供服務的。

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



小總結

四、案例

1、Base 映象(scratch)

Docker Hub中 99%的映象都是通過在base映象中安裝和配置需要的軟體構建出來的

2、自定義映象mycentos

1、編寫

Hub預設Centos映象是什麼情況

準備編寫DockerFile檔案

myCentOS內容DockerFile

FROM centos
MAINTAINER zzyy<[email protected]>
 
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

2、構建

docker build -t 新映象名字:TAG .

3、執行

docker run -it 新映象名字:TAG

4、列出映象的變更歷史

docker history 映象名

3、CMD/ENTRYPOINT 映象案例

①、都是指定一個容器啟動時要執行的命令

②、CMD

​ Dockerfile中可以有多個CMD指令,但只有最後一個生效,CMD會被dockerrun之後的引數替換

​ Case

​ tomcat的講解演示 docker run -it -p 8080:8080 tomcat ls -l

③、ENTRYPOINT

​ docker run 之後的引數會被當做引數傳遞給 ENTRYPOINT 之後形成新的命令組合

​ Case

製作CMD版可以查詢IP資訊的容器

curl的命令解釋

curl命令可以用來執行下載、傳送各種HTTP請求,指定HTTP頭部等操作。

如果系統沒有curl可以使用yum install curl安裝,也可以下載安裝。
curl是將下載檔案輸出到stdout
使用命令: curl http://www .baidu.com
執行後,www.baidu.com的html就會顯示在螢幕上了

這是最簡單的使用方法。用這個命令獲得了htp://curl.haxx.se指向的頁面,同樣,如果這裡的URL指向的是–個檔案或者一幅圖都可以直接下載到本地。如果下載的是HTML文件,那麼預設的將只顯示檔案頭部,即HTML文件的header。要全部顯示,請加引數-i

WHY

我們可以看到可執行檔案找不到的報錯,executable file not found。
之前我們說過,跟在映象名後面的是command,執行時會替換CMD的預設值。
因此這裡的-i替換了原來的CMD,而不是新增在原來的curl -s htp://ip.cn後面。而-i 根本不是命令,所以自然找不到。
那麼如果我們希望加入-i這引數,我們就必須重新完整的輸入這個命令:
$ docker run myip curl -s http://ip.cn -i

4、自定義映象Tomcat

1、mkdir -p /zzyy/mydockerfile/tomcat9
2、在上述目錄下 touch c.txt
3、將jdk和tomcat安裝的壓縮包拷貝進上一步目錄

apache-tomcat-9.0.8.tar.gz

jdk-8u171-linux-x64.tar.gz

4、在zzyyuse/mydockerfile/tomcat9目錄下新建Dockerfile檔案
FROM         centos
MAINTAINER    zzyy<[email protected]>
#把宿主機當前上下文的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/local
WORKDIR $MYPATH
#配置java與tomcat環境變數
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV 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.out

目錄內容

5、構建


構建完成

6、run
docker run -d -p 9080:8080 --name myt9 -v /zzyyuse/mydockerfile/tomcat9/test:/usr/local/apache-tomcat-9.0.8/webapps/test -v /zzyyuse/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs --privileged=true zzyytomcat9


備註

Docker掛載主機目錄Docker訪問出現cannot open directory .: Permission denied
解決辦法:在掛載目錄後多加一個–privileged=true引數即可

7、驗證
8、綜合前述容器卷測試的web服務test釋出

總體概述

web.xml

<?xml version="1 .0" encoding="UTF-8"?>
<web-app xmIns:xsi="http://www.w3.org/2001/XML Schema-instance"
xmIns="http://java sun.com/xm/ns/javaee"
xsi:schemaL ocation="http://java. sun.com/xml/ns/javaee htp:/:/java. sun.com/xml/ns/javaee/web-app_ 2_ _5.xsd"
id="WebApp_ ID" version="2.5">
<display-name>test</display-name>

</web-app>

a.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
  </head>
  <body>
    -----------welcome------------
    <%="i am in docker tomcat self "%>
    <br>
    <br>
    <% System.out.println("=============docker tomcat self");%>
  </body>
</html>

測試

五、小總結

艾歐尼亞,昂揚不滅,為了更美好的明天而戰(#^.^#)