热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Dockerfile构建过程

Dockerfile构建过程 基础知识 1每个保留关键字(指令)都是必须是⼤写字⺟2执⾏从上到下顺序执⾏3#表示注释4每⼀个指令都会创建⼀个新的镜像层,并提交步骤 doc

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 [: | @]
提示:镜像都是从⼀个基础镜像(操作系统或其他镜像)⽣成,可以在⼀个Dockerfile中添加多
条FROM指令,⼀次⽣成多个镜像
注意:如果忽略tag选项,会使⽤latest镜像
指令:MAINTAINER
功能描述:设置镜像作者
语法:MAINTAINER
指令:RUN
功能描述:
语法:RUN
RUN [“executable”,”param1”,”param2”]
提示:RUN指令会⽣成容器,在容器中执⾏脚本,容器使⽤当前镜像,脚本指令完成后,Docker
Daemon会将该容器提交为⼀个中间镜像,供后⾯的指令使⽤
补充:RUN指令第⼀种⽅式为shell⽅式,使⽤/bin/sh -c 运⾏脚本,可以在其中
使⽤\将脚本分为多⾏
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
提示:CMD第⼀种、第三种⽅式和RUN类似,第⼆种⽅式为ENTRYPOINT参数⽅式,为entrypoint
提供参数列表
注意:Dockerfile中只能有⼀条CMD命令,如果写了多条则最后⼀条⽣效
指令:LABEL
功能描述:设置镜像的标签
延伸:镜像标签可以通过docker inspect查看
格式:LABEL = =
提示:不同标签之间通过空格隔开
注意:每条指令都会⽣成⼀个镜像层,Docker中镜像最多只能有127层,如果超出Docker
Daemon就会报错,如LABEL ..=.. <假装这⾥有个换⾏> LABEL ..=..合在⼀起⽤空格分隔就
可以减少镜像层数量,同样,可以使⽤连接符\将脚本分为多⾏镜像会继承基础镜像中的标签,如果
存在同名标签则会覆盖
指令:EXPOSE
功能描述:设置镜像暴露端⼝,记录容器启动时监听哪些端⼝
语法:EXPOSE
延伸:镜像暴露端⼝可以通过docker inspect查看
提示:容器启动时,Docker Daemon会扫描镜像中暴露的端⼝,如果加⼊-P参数,Docker
Daemon会把镜像中所有暴露端⼝导出,并为每个暴露端⼝分配⼀个随机的主机端⼝(暴露端⼝是容
器监听端⼝,主机端⼝为外部访问容器的端⼝)
注意:EXPOSE只设置暴露端⼝并不导出端⼝,只有启动容器时使⽤-P/-p才导出端⼝,这个时候才
能通过外部访问容器提供的服务
指令:ENV
功能描述:设置镜像中的环境变量
语法:ENV =…|
注意:环境变量在整个编译周期都有效,第⼀种⽅式可设置多个环境变量,第⼆种⽅式只设置⼀个
环境变量
提示:通过${变量名}或者 $变量名使⽤变量,使⽤⽅式${变量名}时可以⽤${变量名:-
default} ${变量名:+cover}设定默认值或者覆盖值ENV设置的变量值在整个编译过程中总是保
持不变的
指令:ADD
功能描述:复制⽂件到镜像中
语法:ADD |[“”,… “”]
注意:当路径中有空格时,需要使⽤第⼆种⽅式
当src为⽂件或⽬录时,Docker Daemon会从编译⽬录寻找这些⽂件或⽬录,⽽
dest为镜像中的绝对路径或者相对于WORKDIR的路径
提示:src为⽬录时,复制⽬录中所有内容,包括⽂件系统的元数据,但不包括⽬录本身
src为压缩⽂件,并且压缩⽅式为gzip,bzip2或xz时,指令会将其解压为⽬录
如果src为⽂件,则复制⽂件和元数据
如果dest不存在,指令会⾃动创建dest和缺失的上级⽬录

指令:COPY
功能描述:复制⽂件到镜像中
语法:COPY |[“”,… “”]
提示:指令逻辑和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
指令:WORKDIR
功能描述:设置RUN CMD ENTRYPOINT ADD COPY指令的⼯作⽬录
语法:WORKDIR
提示:如果⼯作⽬录不存在,则Docker Daemon会⾃动创建Dockerfile中多个地⽅都可以调⽤
WORKDIR,如果后⾯跟的是相对位置,则会跟在上条WORKDIR指定路径后(如WORKDIR /A
WORKDIR B WORKDIR C,最终路径为/A/B/C)
指令:ARG
功能描述:设置编译变量
语法:ARG [=]
注意:ARG从定义它的地⽅开始⽣效⽽不是调⽤的地⽅,在ARG之前调⽤编译变量总为空,在编译镜
像时,可以通过docker build –build-arg =设置变量,如果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<12345645@qq.com>
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
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
7 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
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
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
#把宿主机当前上下⽂的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
---> 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
f384dd7cd319 3 minutes ago 600MB
centos 7 3999ed212935 About an hour ago 830MB
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
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

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">

 

 

创建 index.jsp

 

[root@localhost test]# vim index.jsp
<%@ page cOntentType="text/html;charset=UTF-8" language="java" %>





hello,docker


<%
System.out.println("hello, dockerlogs");
%>
%
%

 

执行结果

 

进入链接: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

 

 

 



推荐阅读
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 处理docker容器时间和宿主机时间不一致问题的方法
    本文介绍了处理docker容器时间和宿主机时间不一致问题的方法,包括复制主机的localtime到容器、处理报错情况以及重启容器的步骤。通过这些方法,可以解决docker容器时间和宿主机时间不一致的问题。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了在Docker容器技术中限制容器对CPU的使用的方法,包括使用-c参数设置容器的内存限额,以及通过设置工作线程数量来充分利用CPU资源。同时,还介绍了容器权重分配的情况,以及如何通过top命令查看容器在CPU资源紧张情况下的使用情况。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了Java的公式汇总及相关知识,包括定义变量的语法格式、类型转换公式、三元表达式、定义新的实例的格式、引用类型的方法以及数组静态初始化等内容。希望对读者有一定的参考价值。 ... [详细]
author-avatar
楠楠妈妈05乄23
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有