1. 程式人生 > 其它 >Dockerfile構建過程

Dockerfile構建過程

Dockerfile 構建過程

 

基礎知識

 

1 每個保留關鍵字(指令)都是必須是⼤寫字⺟

2 執⾏從上到下順序執⾏

3 # 表示註釋

4 每⼀個指令都會建立⼀個新的映象層,並提交

步驟

 

  • docker從基礎映象運⾏⼀個容器,執⾏⼀條指令並對容器做出修改。
  • 執⾏類似 docker commit 的操作提交⼀個新的映象層。
  • Docker再基於剛提交的映象運⾏⼀個新容器。
  • 執⾏dockerfile中的下⼀條指令直到所有指令都執⾏完成!

 

具體說明

dockerfile是⾯向開發的,以後要釋出項⽬,做映象,就需要編寫dockerfile⽂件。

DockerFile: 構建⽂件,定義了⼀切步驟,原始碼!!

 

DockerImages:在DockerFile 定義了⼀個⽂件之後,Docker build 時會產⽣⼀個Docker映象,當運⾏Docker 映象時,會真正開始提供服務。

Docker容器:容器就是映象運⾏起來的提供伺服器!!

Dockerfile 的指令

FROM #基礎映象,⼀切從這⾥開始構建

MAINTAINER #映象是誰寫的,名字+郵箱

RUN #映象構建的時候被需要運⾏的命令 

ADD #步驟,tomcat映象,這個tomcat壓縮包,新增內容

WORKDIR #映象的掛載⽬錄

VOLUME #掛載的⽬錄

EXPOST #保留端⼝配置

CMD #指定這個容器啟動的時候要運⾏的命令,只有之後⼀個會⽣效,可被替代

ENTRYPOINT #指定這個容器啟動的時候要運⾏的命令,可以追加命令

COPY #類似ADD,將我們⽂件拷⻉到映象中

ENV #構建的時候設定環境變數

指令:FROM
功能描述:設定基礎映象
語法:FROM < image>[:< tag> | @< digest>]
提示:映象都是從⼀個基礎映象(作業系統或其他映象)⽣成,可以在⼀個Dockerfile中新增多
條FROM指令,⼀次⽣成多個映象
注意:如果忽略tag選項,會使⽤latest映象

指令:MAINTAINER
功能描述:設定映象作者
語法:MAINTAINER < name>

指令:RUN
功能描述:
語法:RUN < command>
         RUN [“executable”,”param1”,”param2”]
提示:RUN指令會⽣成容器,在容器中執⾏指令碼,容器使⽤當前映象,指令碼指令完成後,Docker
Daemon會將該容器提交為⼀箇中間映象,供後⾯的指令使⽤
補充:RUN指令第⼀種⽅式為shell⽅式,使⽤/bin/sh -c < command>運⾏指令碼,可以在其中
使⽤\將指令碼分為多⾏
         RUN指令第⼆種⽅式為exec⽅式,映象中沒有/bin/sh或者要使⽤其他shell時使⽤
該⽅式,其不會調⽤shell命令
例⼦:RUN source $HOME/.bashrc;\
          echo $HOME
          
         RUN [“/bin/bash”,”-c”,”echo hello”]
         
         RUN [“sh”,”-c”,”echo”,”$HOME”] 使⽤第⼆種⽅式調⽤shell讀取環境變數
         
指令:CMD
功能描述:設定容器的啟動命令
語法:CMD [“executable”,”param1”,”param2”]
         CMD [“param1”,”param2”]
         CMD < command>
提示:CMD第⼀種、第三種⽅式和RUN類似,第⼆種⽅式為ENTRYPOINT引數⽅式,為entrypoint
提供引數列表
注意:Dockerfile中只能有⼀條CMD命令,如果寫了多條則最後⼀條⽣效


指令:LABEL
功能描述:設定映象的標籤
延伸:映象標籤可以通過docker inspect檢視
格式:LABEL < key>=< value> < key>=< value> …
提示:不同標籤之間通過空格隔開

注意:每條指令都會⽣成⼀個映象層,Docker中映象最多隻能有127層,如果超出Docker
Daemon就會報錯,如LABEL ..=.. <假裝這⾥有個換⾏> LABEL ..=..合在⼀起⽤空格分隔就
可以減少映象層數量,同樣,可以使⽤連線符\將指令碼分為多⾏映象會繼承基礎映象中的標籤,如果
存在同名標籤則會覆蓋


指令:EXPOSE
功能描述:設定映象暴露端⼝,記錄容器啟動時監聽哪些端⼝
語法:EXPOSE < port> < port> …
延伸:映象暴露端⼝可以通過docker inspect檢視
提示:容器啟動時,Docker Daemon會掃描映象中暴露的端⼝,如果加⼊-P引數,Docker
Daemon會把映象中所有暴露端⼝匯出,併為每個暴露端⼝分配⼀個隨機的主機端⼝(暴露端⼝是容
器監聽端⼝,主機端⼝為外部訪問容器的端⼝)
注意:EXPOSE只設置暴露端⼝並不匯出端⼝,只有啟動容器時使⽤-P/-p才匯出端⼝,這個時候才
能通過外部訪問容器提供的服務


指令:ENV
功能描述:設定映象中的環境變數
語法:ENV < key>=< value>…|< key> < value>
注意:環境變數在整個編譯週期都有效,第⼀種⽅式可設定多個環境變數,第⼆種⽅式只設置⼀個
環境變數
提示:通過${變數名}或者 $變數名使⽤變數,使⽤⽅式${變數名}時可以⽤${變數名:-
default} ${變數名:+cover}設定預設值或者覆蓋值ENV設定的變數值在整個編譯過程中總是保
持不變的


指令:ADD
功能描述:複製⽂件到映象中
語法:ADD < src>… < dest>|[“< src>”,… “< dest>”]
注意:當路徑中有空格時,需要使⽤第⼆種⽅式
         當src為⽂件或⽬錄時,Docker Daemon會從編譯⽬錄尋找這些⽂件或⽬錄,⽽
dest為映象中的絕對路徑或者相對於WORKDIR的路徑
提示:src為⽬錄時,複製⽬錄中所有內容,包括⽂件系統的元資料,但不包括⽬錄本身
         src為壓縮⽂件,並且壓縮⽅式為gzip,bzip2或xz時,指令會將其解壓為⽬錄
         如果src為⽂件,則複製⽂件和元資料
         如果dest不存在,指令會⾃動建立dest和缺失的上級⽬錄
         
指令:COPY
功能描述:複製⽂件到映象中
語法:COPY < src>… < dest>|[“< src>”,… “< dest>”]
提示:指令邏輯和ADD⼗分相似,同樣Docker Daemon會從編譯⽬錄尋找⽂件或⽬錄,dest為鏡
像中的絕對路徑或者相對於WORKDIR的路徑
指令:ENTRYPOINT
功能描述:設定容器的⼊⼝程式
語法:ENTRYPOINT [“executable”,”param1”,”param2”]
         ENTRYPOINT command param1 param2(shell⽅式)
提示:⼊⼝程式是容器啟動時執⾏的程式,docker run中最後的命令將作為引數傳遞給⼊⼝程式
         ⼊⼝程式有兩種格式:exec、shell,其中shell使⽤/bin/sh -c運⾏⼊⼝程式,
此時⼊⼝程式不能接收訊號量
         當Dockerfile有多條ENTRYPOINT時只有最後的ENTRYPOINT指令⽣效
         如果使⽤指令碼作為⼊⼝程式,需要保證指令碼的最後⼀個程式能夠接收訊號量,可以在
指令碼最後使⽤exec或gosu啟動傳⼊指令碼的命令
注意:通過shell⽅式啟動⼊⼝程式時,會忽略CMD指令和docker run中的引數
         為了保證容器能夠接受docker stop傳送的訊號量,需要通過exec啟動程式;如果
沒有加⼊exec命令,則在啟動容器時容器會出現兩個程序,並且使⽤docker stop命令容器⽆法
正常退出(⽆法接受SIGTERM訊號),超時後docker stop傳送SIGKILL,強制停⽌容器
例⼦:FROM ubuntu <換⾏> ENTRYPOINT exec top -b

指令:VOLUME
功能描述:設定容器的掛載點
語法:VOLUME [“/data”]
         VOLUME /data1 /data2
提示:啟動容器時,Docker Daemon會新建掛載點,並⽤映象中的資料初始化掛載點,可以將主
機⽬錄或資料卷容器掛載到這些掛載點

指令:USER
功能描述:設定RUN CMD ENTRYPOINT的⽤戶名或UID
語法:USER < name>

指令:WORKDIR
功能描述:設定RUN CMD ENTRYPOINT ADD COPY指令的⼯作⽬錄
語法:WORKDIR < Path>
提示:如果⼯作⽬錄不存在,則Docker Daemon會⾃動建立Dockerfile中多個地⽅都可以調⽤
WORKDIR,如果後⾯跟的是相對位置,則會跟在上條WORKDIR指定路徑後(如WORKDIR /A  
WORKDIR B   WORKDIR C,最終路徑為/A/B/C)

指令:ARG
功能描述:設定編譯變數
語法:ARG < name>[=< defaultValue>]
注意:ARG從定義它的地⽅開始⽣效⽽不是調⽤的地⽅,在ARG之前調⽤編譯變數總為空,在編譯鏡
像時,可以通過docker build –build-arg < var>=< value>設定變數,如果var沒有通過
ARG定義則Daemon會報錯
         可以使⽤ENV或ARG設定RUN使⽤的變數,如果同名則ENV定義的值會覆蓋ARG定義的
值,與ENV不同,ARG的變數值在編譯過程中是可變的,會對⽐使⽤編譯快取造成影響(ARG值不同
則編譯過程也不同)
例⼦:ARG CONT_IMAG_VER <換⾏> RUN echo $CONT_IMG_VER
         ARG CONT_IMAG_VER <換⾏> RUN echo hello
         當編譯時給ARG變數賦值hello,則兩個Dockerfile可以使⽤相同的中間映象,如
果不為hello,則不能使⽤同⼀箇中間映象

指令:ONBUILD
功能描述:設定⾃徑想的編譯鉤⼦指令
語法:ONBUILD [INSTRUCTION]
提示:從該映象⽣成⼦映象,在⼦映象的編譯過程中,⾸先會執⾏⽗映象中的ONBUILD指令,所有
編譯指令都可以成為鉤⼦指令

指令:STOPSIGNAL
功能描述:設定容器退出時,Docker Daemon向容器傳送的訊號量
語法:STOPSIGNAL signal
提示:訊號量可以是數字或者訊號量的名字,如9或者SIGKILL,訊號量的數字說明在Linux系統
管理中有簡單介紹

ONBUILD流程

 

編譯時,讀取所有ONBUILD映象並記錄下來,在當前編譯過程中不執⾏指令;

 

⽣成映象時將所有ONBUILD指令記錄在映象的配置⽂件OnBuild關鍵字中;

 

⼦映象在執⾏FROM指令時會讀取基礎映象中的ONBUILD指令並順序執⾏,如果執⾏過程中失敗則編 譯中斷;當所有ONBUILD執⾏成功後開始執⾏⼦映象中的指令;

 

⼦映象不會繼承基礎映象中的ONBUILD指令;

 

CMD ENTRYPOINT和RUN的區別

 

RUN指令是設定編譯映象時執⾏的指令碼和程式,映象編譯完成後,RUN指令的⽣命週期結束

 

容器啟動時,可以通過CMD和ENTRYPOINT設定啟動項,其中CMD叫做容器預設啟動命令,如果在 docker run命令末尾新增command,則會替換映象中CMD設定的啟動程式;ENRTYPOINT叫做⼊⼝程 序,不能被docker run命令末尾的command替換,⽽是將command當作字串,傳遞給ENTRYPOINT 作為引數

 

FROM ubuntu
ENTRYPOINT ["ps"]
//通過命令docker run --rm test啟動容器,列印ps的輸出
//通過命令docker run --rm test -ef啟動容器,列印ps -ef的輸出

 

在docker run中,可以通過–entrypoint替換映象中的⼊⼝程式,在Dockerfile中,應該⾄少有⼀條CMD 或者ENTRYPOINT指令,如果同時定義了CMD和ENTRYPOINT則CMD會作為引數傳遞給ENTRYPOINT

 

FROM ubuntu
ENTRYPOINT ["ps"]
CMD ["-ef"]
//通過命令docker run --rm test啟動容器,列印ps -ef的輸出

 

測試

 

編寫Dockerfile

 

 1 [root@localhost dockerfile]# vim mydockerfile
 2 FROM centos:7
 3 MAINTAINER xiaoshimei<[email protected]>
 4 
 5 ENV MYPATH /usr/locat
 6 WORKDIR $MYPATH
 7 
 8 RUN yum -y install vim
 9 RUN yum -y install net-tools
10 
11 EXPOSE 80
12 
13 CMD echo $MYPATH
14 CMD echo"----end----"
15 CMD /bin/bash

通過這個⽂件構建映象

 

1 [root@localhost dockerfile]# docker build -f mydockerfile -t mydockerfile:0.1 .
2 #命令 docker build -f dockerfile⽂件路徑 -t 映象名:[tag]版本號
3 構建成功最底部會顯示這兩⾏
4 Successfully built 0690882230ff
5 Successfully tagged mydockerfile:0.1
1 測試執行
2 [root@localhost dockerfile]# docker run -it mydockerfile:0.1
3 [root@4ad38bfa1894 locat]# pwd
4 /usr/locat
5 [root@4ad38bfa1894 locat]# cd
6 [root@4ad38bfa1894 ~]# exit
7 exit

 

列出本地映象的變更歷史

檢視現有的映象

 

[root@localhost dockerfile]# docker images
REPOSITORY                                   TAG       IMAGE ID       CREATED          SIZE
mydockerfile                                 0.1       0690882230ff   50 seconds ago   591MB
<none>                                       <none>    ae92491469b1   4 minutes ago    231MB
nginx                                        1.0.2     18e19572d1b4   2 days ago       140MB
meapp                                        v1.0      c92b8d5a6959   2 days ago       142MB
registry.cn-hangzhou.aliyuncs.com/vm1/test   v1.0      c92b8d5a6959   2 days ago       142MB
nginx                                        1.1       b9d5e0d36529   2 days ago       142MB
test/redis                                   0.1       1c011895a942   2 days ago       140MB
docke.io/xmfree/alpine                       v3.12.2   2800fc93554b   4 days ago       140MB

  

通過 docker history +映象ID 可以檢視當前映象構成歷史

 

[root@localhost dockerfile]# docker history 0690882230ff
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
0690882230ff   25 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B        
01d9595cf185   25 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
f1b45fa8f078   25 minutes ago   /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B        
c1eebaf2c787   25 minutes ago   /bin/sh -c #(nop)  EXPOSE 80                    0B        
eaac0d046e38   25 minutes ago   /bin/sh -c yum -y install net-tools             166MB     
8c45e29ac44e   25 minutes ago   /bin/sh -c yum -y install vim                   221MB     
70641c8c24f8   26 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/locat            0B        
78ab043d751d   26 minutes ago   /bin/sh -c #(nop)  ENV MYPATH=/usr/locat        0B        
ecd571b61df3   26 minutes ago   /bin/sh -c #(nop)  MAINTAINER xiaoshimei<123…   0B        
eeb6ee3f44bd   7 months ago     /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      7 months ago     /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      7 months ago     /bin/sh -c #(nop) ADD file:b3ebbe8bd304723d4…   204MB

CMD 和ENTRYPOINT 區別

 

CMD #指定這個容器啟動的時候要運⾏的命令,只有最後⼀個會⽣效,可被替代

ENTRYPOINT #指定這個容器啟動的時候要運⾏的命令,可以追加命令

 

測試 cdm

編寫dockerfile⽂件

[root@localhost dockerfile]# vim dockerfile-cmd-test
FROM centos
CMD ["ls","-a"],

構建檔案

[root@localhost dockerfile]# docker build -f dockerfile-cmd-test -t cmdtset .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM centos
 ---> 5d0da3dc9764
Step 2/2 : CMD ["ls","-a"],
 ---> Running in 8b3b368c4e1c
Removing intermediate container 8b3b368c4e1c
 ---> 46be6b4d8359
Successfully built 46be6b4d8359
Successfully tagged cmdtset:latest

run 運⾏,返回的結果就是指令碼⾥寫的需要執⾏ ls -a 的結果

[root@localhost dockerfile]# docker run 46be6b4d8359
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

想追加⼀個命令 -l ls -al 返回結果報錯了

cmd 的情況下 -l 替換了 [“ls”,"-a"] 這個命令,所以執⾏不成功 ,因為 l 並不是命令

 

測試ENTRYPOINT

同樣也是編寫dockerfile⽂件,內容與之前的⼀樣

[root@localhost dockerfile]# vim dockerfile-cmd-entrypoint
FROM centos
CMD ["ls","-a"],

構建檔案

[root@localhost dockerfile]# docker build -f dockerfile-cmd-entrypoint -t entoryonit-test .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM centos
 ---> 5d0da3dc9764
Step 2/2 : CMD ["ls","-a"],
 ---> Using cache
 ---> 46be6b4d8359
Successfully built 46be6b4d8359
Successfully tagged entoryonit-test:latest

執行

[root@localhost dockerfile]# docker run 46be6b4d8359
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

案例說明

編寫DockerFlie⽂件

檢視官⽅預設的CentOS映象的情況

預設容器沒有安裝vim,預設容器不支援ifconfig

需求實現

登陸後的預設路徑/home、安裝vim編輯器、安裝檢視網路配置ifconfig

[root@localhost ~]# mkdir home
[root@localhost ~]# cd home/
[root@localhost home]# ls
[root@localhost home]# mkdir dockerfile-test
[root@localhost home]# ls
dockerfile-test
[root@localhost home]# cd dockerfile-test/
[root@localhost dockerfile-test]# vim mydockerfile-centos
FROM centos:7
MAINTAINER guarwhy<[email protected]>

ENV MYPATH /home
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools
RUN yum -y install gcc
EXPOSE 80

CMD echo $MYPATH
CMD echo "----------end--------"
CMD /bin/bash

構建映象

 

[root@localhost dockerfile-test]#  docker build -f mydockerfile-centos -t centos:7 .

運⾏新映象

 

[root@localhost dockerfile-test]# docker run -it centos:7

列出映象地的變更歷史

 

[root@localhost dockerfile-test]# docker history 3999ed212935

定義映象 tomcat

 

建立⽂件夾

 

1、執⾏以下命令: mkdir -p guardwhy/tomcat

2、在上述⽬錄下建立新⽂件:touch readme.txt。

3、將 jdk 和 tomcat 安裝的壓縮包拷⻉進上⼀步⽬錄。

4、在guardwhy/tomcat⽬錄下新建⼀個Dockerfile⽂件

 

注意: 官⽅命名為Dockerfile,build會⾃動尋找這個⽂件,就不需要-f指定了!!!

[root@localhost tomcat]# vim dockerfile 
FROM centos:7
MAINTAINER guardwhy<[email protected]>

#把宿主機當前上下⽂的readme.txt拷⻉到容器/usr/local/路徑下
COPY readme.txt /usr/local/readme.txt
#把java與tomcat新增到容器中
ADD jdk-8u261-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.62.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_261
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.62
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

#容器運⾏時監聽的端⼝
EXPOSE 8080

#啟動時運⾏tomcat
CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.62/bin/logs/catalina.out

構建映象

 

[root@localhost tomcat]# docker build -t diytomcat .
Sending build context to Docker daemon  154.7MB
Step 1/15 : FROM centos:7
 ---> 3999ed212935
Step 2/15 : MAINTAINER guardwhy<[email protected]>
 ---> Running in d989d6d19054
Removing intermediate container d989d6d19054
 ---> 6822293b9e4b
Step 3/15 : COPY readme.txt /usr/local/readme.txt
 ---> f765537c2888
Step 4/15 : ADD jdk-8u261-linux-x64.tar.gz /usr/local/
 ---> a3cf937716c3
Step 5/15 : ADD apache-tomcat-9.0.62.tar.gz /usr/local/
 ---> c05c9c3b2fac
Step 6/15 : RUN yum -y install vim
 ---> Running in dd4fc97495fb
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.ustc.edu.cn
 * updates: mirrors.aliyun.com
Package 2:vim-enhanced-7.4.629-8.el7_9.x86_64 already installed and latest version
Nothing to do
Removing intermediate container dd4fc97495fb
 ---> c5e95283ab57
Step 7/15 : ENV MYPATH /usr/local
 ---> Running in 93e76b643087
Removing intermediate container 93e76b643087
 ---> b787152e5e87
Step 8/15 : WORKDIR $MYPATH
 ---> Running in 1dcaed1f17b3
Removing intermediate container 1dcaed1f17b3
 ---> 9b1ffb870c0d
Step 9/15 : ENV JAVA_HOME /usr/local/jdk1.8.0_261
 ---> Running in 70d10d377dd5
Removing intermediate container 70d10d377dd5
 ---> 75a8292484d1
Step 10/15 : ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
 ---> Running in 27557ca3e270
Removing intermediate container 27557ca3e270
 ---> 2fd7940d96e7
Step 11/15 : ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62
 ---> Running in 82d21d0bd8a0
Removing intermediate container 82d21d0bd8a0
 ---> f92eff3612fc
Step 12/15 : ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.62
 ---> Running in 1c7478d30a51
Removing intermediate container 1c7478d30a51
 ---> 028e72ac5fb7
Step 13/15 : ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
 ---> Running in a87b45dd033c
Removing intermediate container a87b45dd033c
 ---> 09dccc9460c2
Step 14/15 : EXPOSE 8080
 ---> Running in afb183fa1de7
Removing intermediate container afb183fa1de7
 ---> d87b609c91d7
Step 15/15 : CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.62/bin/logs/catalina.out
 ---> Running in 54a5863b5886
Removing intermediate container 54a5863b5886
 ---> cdee012397f1
Successfully built cdee012397f1
Successfully tagged diytomcat:latest

 

檢視構建的映象

[root@localhost tomcat]# docker images
REPOSITORY                                   TAG       IMAGE ID       CREATED             SIZE
diytomcat                                    latest    cdee012397f1   2 minutes ago       1.36GB
<none>                                       <none>    f384dd7cd319   3 minutes ago       600MB
centos                                       7         3999ed212935   About an hour ago   830MB
<none>                                       <none>    93335158db01   About an hour ago   231MB
cmdtset                                      latest    46be6b4d8359   2 hours ago         231MB
entoryonit-test                              latest    46be6b4d8359   2 hours ago         231MB
mydockerfile                                 0.1       0690882230ff   2 hours ago         591MB
<none>                                       <none>    ae92491469b1   2 hours ago         231MB
nginx                                        1.0.2     18e19572d1b4   2 days ago          140MB

執行啟動自定義映象

 

[root@localhost tomcat]# docker run \
> -d -p 9090:8080 --name mydiytomcat \
> -v /home/guardwhy/tomcat/test:/usr/local/apache-tomcat-9.0.62/webapps/test \
> -v /home/guardwhy/tomcat/tomcat9logs/:/usr/local/apache-tomcat-9.0.62/logs \
> --privileged=true diytomcat
f480b355b6a3694008063853a7e0161c0f05d96359d3646c80d263df6292a70b

進入生成啟動的自定義映象

開啟埠

 

開啟8080:9000端⼝,開啟防⽕牆。

 

[root@localhost tomcat]# firewall-cmd --zone=public --add-port=8080/tcp --permanent
success
[root@localhost tomcat]# firewall-cmd --zone=public --add-port=9090/tcp --permanent
success
[root@localhost tomcat]# firewall-cmd --reload
success
[root@localhost tomcat]# firewall-cmd --list-ports
8080/tcp 9090/tcp

 

驗證測試

 

連結訪問:http://192.168.200.11:9090/

 

 

網頁釋出測試

 

建立WEB-INF⽂件夾,在⽂件夾中新建web.xml⽂件

 

[root@localhost test]# ls
index.jsp  WEB-INF
[root@localhost test]# pwd
/home/guardwhy/tomcat/test
[root@localhost test]# cd WEB-INF/
[root@localhost WEB-INF]# ls
web.xml
[root@localhost WEB-INF]# pwd
/home/guardwhy/tomcat/test/WEB-INF
[root@localhost WEB-INF]# ls
web.xml
[root@localhost WEB-INF]#

建立 web.xml

 

[root@localhost WEB-INF]# vim web.xml 
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
</web-app>

 

建立 index.jsp

 

[root@localhost test]# vim index.jsp 
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
   <title>docker</title>
</head>
<body>
   <h3>hello,docker</h3>
   <%
       System.out.println("hello, dockerlogs");
   %>
   %</body>
   %</html>

執行結果

 

進入連結:http://192.168.20.11:9090/test/

 

檢視日誌

 

[root@localhost tomcat]# ls
test  tomcat9logs
[root@localhost tomcat]# pwd
/home/guardwhy/tomcat
[root@localhost tomcat]# cd tomcat9logs/
[root@localhost tomcat9logs]# ls
catalina.2022-05-09.log  host-manager.2022-05-09.log  localhost_access_log.2022-05-09.txt
catalina.out             localhost.2022-05-09.log     manager.2022-05-09.log
[root@localhost tomcat9logs]# ls -l
總用量 24
-rw-r-----. 1 root root 6699 5月   9 18:36 catalina.2022-05-09.log
-rw-r-----. 1 root root 6717 5月   9 18:38 catalina.out
-rw-r-----. 1 root root    0 5月   9 18:23 host-manager.2022-05-09.log
-rw-r-----. 1 root root  408 5月   9 18:23 localhost.2022-05-09.log
-rw-r-----. 1 root root  833 5月   9 18:38 localhost_access_log.2022-05-09.txt
-rw-r-----. 1 root root    0 5月   9 18:23 manager.2022-05-09.log