DockerFile解析

是什麼

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

  • 構建三步驟
  1. 編寫Dockerfile文件
  2. docker build
  3. docker run
    在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

  • 因爲上面的dockerhub搜索容器鏡像速度太慢了,這裏使用github上查找dockerfile,
    https://github.com/docker-library,在這裏直接搜索鏡像名稱便可
    在這裏插入圖片描述
    有的鏡像沒有時直接在github搜就有了

在這裏插入圖片描述

DockerFile構建過程解析

Dockerfile內容基礎知識

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

Docker執行Dockerfile的大體流程

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

小總結

從應用軟件的角度來看,Dockerfile、Docker鏡像與Docker容器分別表明軟件的三個不一樣階段,linux

  • Dockerfile是軟件的原材料
  • Docker鏡像是軟件的交付品
  • Docker容器則能夠認爲是軟件的運行態。

Dockerfile面向開發,Docker鏡像成爲交付標準,Docker容器則涉及部署與運維,三者缺一不可,協力充當Docker體系的基石。
在這裏插入圖片描述git

  1. Dockerfile,須要定義一個Dockerfile,Dockerfile定義了進程須要的一切東西。Dockerfile涉及的內容包括執行代碼或者是文件、環境變量、依賴包、運行時環境、動態連接庫、操做系統的發行版、服務進程和內核進程(當應用進程須要和系統服務和內核進程打交道,這時須要考慮如何設計namespace的權限控制)等等;
  2. Docker鏡像,在用Dockerfile定義一個文件以後,docker build時會產生一個Docker鏡像,當運行 Docker鏡像時,會真正開始提供服務;
  3. Docker容器,容器是直接提供服務的。

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

  • FROM:基礎鏡像,當前新鏡像是基於哪一個鏡像的
  • MAINTAINER:鏡像維護者的姓名和郵箱地址
  • RUN:容器構建時須要運行的命令
  • EXPOSE:當前容器對外暴露出的端口
  • WORKDIR:指定在建立容器後,終端默認登錄的進來工做目錄,一個落腳點
  • ENV:用來在構建鏡像過程當中設置環境變量
    ENV MY_PATH /usr/mytest
  1. 這個環境變量能夠在後續的任何RUN指令中使用,這就如同在命令前面指定了環境變量前綴同樣;
    也能夠在其它指令中直接使用這些環境變量,

好比:WORKDIR $MY_PATHgithub

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

ENTRYPOINT :
3. 指定一個容器啓動時要運行的命令
4. ENTRYPOINT 的目的和 CMD 同樣,都是在指定容器啓動程序及參數web

  • ONBUILD:當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承後父鏡像的onbuild被觸發
    在這裏插入圖片描述
    在這裏插入圖片描述

小總結

在這裏插入圖片描述

案例

Base鏡像(scratch)

Docker Hub 中 99% 的鏡像都是經過在 base 鏡像中安裝和配置須要的軟件構建出來的
在這裏插入圖片描述docker

  • docker rm -f $(docker ps -q),查詢當前正在運行容器的ID而且刪除,相似於批量刪除。
    在這裏插入圖片描述

自定義鏡像mycentos

  1. 將jdk和tomcat安裝的壓縮包拷貝進上一步目錄
  • Hub默認CentOS鏡像什麼狀況
    在這裏插入圖片描述
    在這裏插入圖片描述
    原始的centos(從阿里雲上pull下來的centos)不支持上面兩個命令
自定義mycentos目的使咱們本身的鏡像具有以下:
         登錄後的默認路徑
         vim編輯器
         查看網絡配置ifconfig支持
  • 準備編寫DockerFile文件
    在這裏插入圖片描述
    我這裏就在根目錄下的mydocker文件夾下新建一個Dockerfile2文件
    在這裏插入圖片描述apache

  • myCentOS內容DockerFile
    在這裏插入圖片描述
    Dockerfile2文件寫入的內容,郵箱改爲本身的,ENV用於設置環境變量,WORKDIR就是登陸的默認路徑,echo是構建成功輸出打印的內容。vim

FROM centos
MAINTAINER xdr630<xdr630@126.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. 構建
docker build -t 新鏡像名字:TAG .

會看到 docker build 命令最後有一個 . 「. 」表示當前目錄
在這裏插入圖片描述centos

docker build -f /mydocker/Dockerfile2 -t mycentos:1.3 .

在這裏插入圖片描述
docker images 查看下:
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述

  1. 運行
docker run -it 新鏡像名字:TAG

能夠看到,咱們本身的新鏡像已經支持vim/ifconfig命令,擴展成功了。
在這裏插入圖片描述
默認登陸的路徑改變了,也可使用vim了和ifconfig命令了
在這裏插入圖片描述

  1. 列出鏡像的變動歷史
docker history 鏡像名

docker images 鏡像名,這樣也能夠模糊查詢不一樣版本的mycentos
在這裏插入圖片描述
在這裏插入圖片描述

CMD/ENTRYPOINT 鏡像案例

  • 都是指定一個容器啓動時要運行的命令
  • CMD
  1. Dockerfile 中能夠有多個 CMD 指令,但只有最後一個生效,CMD 會被 docker run 以後的參數替換
  2. Case
    tomcat的講解演示
    在這裏插入圖片描述
docker run -it -p 8888:8080 tomcat ls -l

上面的 ls -l 就會把CMD前面的一行給覆蓋掉,至關於執行了 ls -l /usr/local/tomcat
在這裏插入圖片描述
這個時候tomcat也沒有啓動:
在這裏插入圖片描述

  • ENTRYPOINT ,而這個命令不會被後面的命令覆蓋掉,會被最加
  1. docker run 以後的參數會被當作參數傳遞給 ENTRYPOINT,以後造成新的命令組合
  2. Case
    在這裏插入圖片描述
  • 製做CMD版能夠查詢IP信息的容器
  • crul命令解釋:

curl命令能夠用來執行下載、發送各類HTTP請求,指定HTTP頭部等操做。
若是系統沒有curl可使用yum install curl安裝,也能夠下載安裝。
curl是將下載文件輸出到stdout

使用命令:curl http://www.baidu.com
執行後,www.baidu.com的html就會顯示在屏幕上了
在這裏插入圖片描述

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

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

這是最簡單的使用方法。用這個命令得到了http://curl.haxx.se指向的頁面,一樣,若是這裏的URL指向的是一個文件或者一幅圖均可以直接下載到本地。若是下載的是HTML文檔,那麼缺省的將只顯示文件頭部,即HTML文檔的header。要所有顯示,請加參數 -i

  • 問題:若是咱們但願顯示 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信息的容器
FROM centos
RUN yum install -y curl
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]

在這裏插入圖片描述
在這裏插入圖片描述

自定義鏡像Tomcat9

  1. mkdir -p /zzyyuse/mydockerfile/tomcat9
  2. 在上述目錄下touch c.txt
  3. 將jdk和tomcat安裝的壓縮包拷貝進上一步目錄
    1. apache-tomcat-9.0.8.tar.gz
      在這裏插入圖片描述
    2. jdk-8u171-linux-x64.tar.gz
      在這裏插入圖片描述
  4. 在/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/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
  • 目錄內容
    在這裏插入圖片描述
  1. 構建
    在這裏插入圖片描述
    構建完成
    在這裏插入圖片描述
  2. 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參數便可

  1. 驗證
    在這裏插入圖片描述
  2. 結合前述的容器卷將測試的web服務test發佈
  • 整體概述
    在這裏插入圖片描述
  • web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://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>
  • 測試
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述

小總結

在這裏插入圖片描述

相關文章
相關標籤/搜索