docker 入門到實戰(六)dockerFile解析

本篇來自於尚硅谷周陽老師 https://www.bilibili.com/vide...
上一篇: docker 入門到實戰(五)docker容器數據卷

六:dockerFile解析

下載3.png

6.1 dockerFile是什麼

Dockerfile是一個包含用於組合映像的命令的文本文檔。可使用在命令行中調用任何命令。 Docker經過讀取Dockerfile中的指令自動生成映像。html

6.1.1 cenos7 Dockerfile文件

image.png

FROM scratch
ADD centos-7-x86\_64-docker.tar.xz /
LABEL org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20191001"
CMD \["/bin/bash"\]

6.1.2 構建步驟

  1. 編寫Dockerfile文件
  2. docker build
  3. docker run

6.2 dockerFile構建過程解析

6.2.1 Dockerfile內容基礎知識
  1. 每條保留字指令都必須爲大寫字母且後面要跟隨至少一個參數
  2. 指令按照從上到下,順序執行
  3. #表示註釋
  4. 每條指令都會建立一個新的鏡像層,並對鏡像進行提交
6.2.2 Docker執行Dockerfile的大體流程
  1. docker從基礎鏡像運行一個容器
  2. 執行一條指令並對容器做出修改
  3. 執行相似docker commit的操做提交一個新的鏡像層
  4. docker再基於剛提交的鏡像運行一個新容器
  5. 執行dockerfile中的下一條指令直到全部指令都執行完成
6.2.3 小總結

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

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

Dockerfile面向開發,Docker鏡像成爲交付標準,Docker容器則涉及部署與運維,三者缺一不可,協力充當Docker體系的基石。linux

  1. Dockerfile,須要定義一個Dockerfile,Dockerfile定義了進程須要的一切東西。Dockerfile涉及的內容包括執行代碼或者是文件、環境變量、依賴包、運行時環境、動態連接庫、操做系統的發行版、服務進程和內核進程(當應用進程須要和系統服務和內核進程打交道,這時須要考慮如何設計namespace的權限控制)等等;

 

  1. Docker鏡像,在用Dockerfile定義一個文件以後,docker build時會產生一個Docker鏡像,當運行 Docker鏡像時,會真正開始提供服務;

 

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

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

保留字 描述
FROM 基礎鏡像,當前新鏡像是基於哪一個鏡像的
MAINTAINER 鏡像維護者的姓名和郵箱地址
RUN 容器構建時須要運行的命令
EXPOSE 當前容器對外暴露出的端口
WORKDIR 指定在建立容器後,終端默認登錄的進來工做目錄,一個落腳點
ENV 用來在構建鏡像過程當中設置環境變量 (k,v)形式
ADD 將宿主機目錄下的文件拷貝進鏡像且ADD命令會自動處理URL和解壓tar壓縮包
COPY 相似ADD,拷貝文件和目錄到鏡像中。將從構建上下文目錄中 <源路徑> 的文件/目錄複製到新的一層的鏡像內的 <目標路徑> 位置 (k,v)形式和json格式均可以
VOLUME 容器數據卷,用於數據保存和持久化工做
CMD 指定一個容器啓動時要運行的命令(Dockerfile 中能夠有多個 CMD 指令,但只有最後一個生效,CMD 會被 docker run 以後的參數替換)
ENTRYPOINT 指定一個容器啓動時要運行的命令 (ENTRYPOINT 的目的和 CMD 同樣,都是在指定容器啓動程序及參數)
ONBUILD 當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承後父鏡像的onbuild被觸發

下載.png

6.4 案例

6.4.1 base鏡像(scratch)

幾乎99%的鏡像都來自於這個基礎的鏡像git

image.png

6.4.2 自定義鏡像
6.4.2.1 編寫

默認centos只有很基礎的命令 vim , ip addr都沒有
編寫一個基於centos的鏡像 而且有編輯和查看ip的功能github

FROM centos
MAINTAINER rem
ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vin
RUN yum -y install net-tools

EXPOSE 80

CMD echo "finished,---successfully"
CMD /bin/bash
6.4.2.2 構建
docker build [OPTIONS] PATH | URL | -

[OPTIONS] 選項web

-f :指定要使用的Dockerfile路徑;
--tag, -t:鏡像的名字及標籤
. :表示當前文件夾docker

Dockerfile文件apache

FROM centos
MAINTAINER rem
ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo "finished,---successfully"
CMD /bin/bash

image.png

6.4.2.3 運行

能夠看到 vi命令和 ip addr命令可使用了
image.pngjson

6.4.3 查看鏡像
docker history [OPTIONS] IMAGE

image.png

6.4.4 自定義tomcat9鏡像
6.4.4.1 準備環境

新建一個目錄dockerfile
再在下面建一個測試文件
拷貝jdk和tomcat到目錄中vim

image.png

新建掛載目錄
image.png

Dockerfile文件

FROM centos
MAINTAINER  rem
#把宿主機當前上下文的test.txt拷貝到容器/usr/local/路徑下
COPY test.txt /usr/local/cincontainer.txt
#把java與tomcat添加到容器中
ADD jdk-8u144-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.33.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_144
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.33
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.33
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器運行時監聽的端口
EXPOSE  8080
#啓動時運行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-9.0.33/bin/startup.sh" ]
# CMD ["/usr/local/apache-tomcat-9.0.33/bin/catalina.sh","run"]
CMD /usr/local/apache-tomcat-9.0.33/bin/startup.sh && tail -F /usr/local/apache-tom
6.4.4.2 構建鏡像

image.png

6.4.4.3 發佈容器

image.png

docker run -di -p 9090:8080 --name mytomcat9 -v /root/dockerfile/test:/usr/local/apache-tomcat-9.0.33/webapps/test  -v /root/dockerfile/logs:/usr/local/apache-tomcat-9.0.33/logs rem/tomcat9
6.4.4.4 驗證

image.png

Dockerfile上覆制的文件
image.png

6.4.4.5 容器卷驗證

image.png

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>

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>

image.png

日誌

image.png

下一篇:
docker 入門到實戰(七)docker經常使用安裝

相關文章
相關標籤/搜索