Dockerfile构建过程

Dockerfile构建过程,第1张

基础知识 每个保留关键字(指令)都是必须是⼤写字⺟执⾏从上到下顺序执⾏ 表示注释 每⼀个指令都会创建⼀个新的镜像层,并提交
步骤 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值不同
则编译过程也不同)
 编译时,读取所有ONBUILD镜像并记录下来,在当前编译过程中不执⾏指令;
 ⽣成镜像时将所有ONBUILD指令记录在镜像的配置⽂件OnBuild关键字中;
 ⼦镜像在执⾏FROM指令时会读取基础镜像中的ONBUILD指令并顺序执⾏,如果执⾏过程中失败则编
译中断;当所有ONBUILD执⾏成功后开始执⾏⼦镜像中的指令;
 ⼦镜像不会继承基础镜像中的ONBUILD指令;
RUN指令是设置编译镜像时执⾏的脚本和程序,镜像编译完成后,RUN指令的⽣命周期结束
 容器启动时,可以通过CMD和ENTRYPOINT设置启动项,其中CMD叫做容器默认启动命令,如果在
docker run命令末尾添加command,则会替换镜像中CMD设置的启动程序;ENRTYPOINT叫做⼊⼝程
序,不能被docker run命令末尾的command替换,⽽是将command当作字符串,传递给ENTRYPOINT
作为参数
ONBUILD流程
CMD ENTRYPOINT和RUN的区别
例⼦: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的文件
[root@node143 dockerfile]# vim mydockerfile
FROM centos
MAINTAINER xiaoshimei<12345645@qq.com>
ENV MYPATH /usr/locat
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo"----end----"
CMD /bin/bash 
通过这个文件构建镜像

#命令 docker build -f dockerfile⽂件路径 -t 镜像名:[tag]版本号
docker build -f mydockerfile -t mydockerfile:0.1 .
构建成功最底部会显示这两⾏
Successfully built 29f50f45bc0b
Successfully tagged mydockerfile:0.1

测试运⾏
[root@node143 dockerfile]# docker run -it mydockerfile:0.1
[root@5115d212f2c2 locat]# pwd
/usr/locat

列出本地镜像的变更历史

查看现有的镜像

[root@node143 dockerfile]# docker images
REPOSITORY                                       TAG                    
  IMAGE ID       CREATED         SIZE
mydockerfile                                     0.1                    
  29f50f45bc0b   26 minutes ago   291MB
nginx                                           latest                  
f6d0b4767a6c   2 months ago     133MB
foxiswho/rocketmq                                4.8.0                  
  ccdf2960021a   2 months ago     505MB
styletang/rocketmq-console-ng                   latest                  
7df83bb6e638   3 years ago     702MB

通过 docker history +镜像ID 可以查看当前镜像构成历史

[root@node143 dockerfile]# docker history   29f50f45bc0b
IMAGE         CREATED         CREATED BY                              
      SIZE     COMMENT
29f50f45bc0b   26 minutes ago   /bin/sh -c #(nop) CMD ["/bin/sh" "-c"
"/bin…   0B        
ad88d26c0c57   26 minutes ago   /bin/sh -c #(nop) CMD ["/bin/sh" "-c"
"echo…   0B        
025d57b9faec   26 minutes ago   /bin/sh -c #(nop) CMD ["/bin/sh" "-c"
"echo…   0B        
e224252e8c18   26 minutes ago   /bin/sh -c #(nop) EXPOSE 80            
      0B        
eb920921d222   26 minutes ago   /bin/sh -c yum -y install net-tools      
      23.4MB    
3c70319360e9   31 minutes ago   /bin/sh -c yum -y install vim            
      58.1MB    
ba3d8a11d96e   31 minutes ago   /bin/sh -c #(nop) WORKDIR /usr/locat    
      0B        
87e3e7c84495   31 minutes ago   /bin/sh -c #(nop) ENV MYPATH=/usr/locat
      0B        
140dd8dc67e8   31 minutes ago   /bin/sh -c #(nop) MAINTAINER
xiaoshimei<1230B        
300e315adb2f   3 months ago     /bin/sh -c #(nop) CMD ["/bin/bash"]    
      0B        
<missing>      3 months ago     /bin/sh -c #(nop) LABEL org.labelschema.sc…   0B        
<missing>      3 months ago     /bin/sh -c #(nop) ADD
file:bd7a2aed6ede423b7…   209MB
CMD和ENTRYPOINT区别

CMD #指定这个容器启动的时候要运⾏的命令,只有最后⼀个会⽣效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运⾏的命令,可以追加命令

测试cdm

编写dockerfile⽂件

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

构建⽂件

[root@node143 dockerfile]# docker build -f dockerfile-cmd-test -t cmdtset
.
Sending build context to Docker daemon  217.6MB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : CMD ["ls","-a"],
---> Running in 4dd090d39ebf
Removing intermediate container 4dd090d39ebf
---> b31e0a3e81b4
Successfully built b31e0a3e81b4
Successfully tagged cmdtset:latest

run 运⾏,返回的结果就是脚本⾥写的需要执⾏ ls -a 的结果

[root@node143 dockerfile]# docker run b31e0a3e81b4
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt

想追加⼀个命令 -l ls -al 返回结果报错了

[root@node143 dockerfile]# docker run b31e0a3e81b4 -l
docker: Error response from daemon: OCI runtime create failed:
container_linux.go:370: starting container process caused: exec: "-l":
executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled

cmd 的情况下 -l 替换了 [“ls”,“-a”] 这个命令,所以执⾏不成功 ,因为 l 并不是命令

测试entrypoint

同样也是编写dockerfile⽂件,内容与之前的⼀样

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

构建⽂件

[root@node143 dockerfile]# docker build -f dockerfile-cmd-entrypoint -t
entoryonit-test .
Sending build context to Docker daemon  217.6MB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in 52fd4e3fc7f5
Removing intermediate container 52fd4e3fc7f5
---> 77d940efb3ad
Successfully built 77d940efb3ad
Successfully tagged entoryonit-test:latest

运⾏

[root@node143 dockerfile]# docker run 77d940efb3ad
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found

我们的追加命令,是直接拼接在我们的 ENTRYPOINT 命令后⾯的

[root@node143 dockerfile]# docker run 77d940efb3ad -l
total 0
drwxr-xr-x   1 root root   6 Mar 16 14:38 .
drwxr-xr-x   1 root root   6 Mar 16 14:38 ..
-rwxr-xr-x   1 root root   0 Mar 16 14:38 .dockerenv
lrwxrwxrwx   1 root root   7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x   5 root root 340 Mar 16 14:38 dev
drwxr-xr-x   1 root root  66 Mar 16 14:38 etc
drwxr-xr-x   2 root root   6 Nov  3 15:22 home
lrwxrwxrwx   1 root root   7 Nov  3 15:22 lib -> usr/lib
lrwxrwxrwx   1 root root   9 Nov  3 15:22 lib64 -> usr/lib64
drwx------   2 root root   6 Dec  4 17:37 lost+found
案例说明 编写dockerfile文件

查看官⽅默认的CentOS镜像的情况

需求实现

登陆后的默认路径/home、安装vim编辑器、安装查看⽹络配置ifconfig

[root@Linux home]# mkdir dockerfile-test
[root@Linux home]# cd dockerfile-test/
[root@Linux dockerfile-test]# vim mydockerfile-centos # 编辑⽂件
[root@Linux dockerfile-test]# ls
mydockerfile-centos
[root@Linux dockerfile-test]# cat mydockerfile-centos
FROM centos
MAINTAINER guardwhy<hxy1625309592@aliyun.com>
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@Linux dockerfile-test]#
构建镜像
docker build -f mydockerfile-centos -t centos:7 .

运行新镜像
docker run -it centos:7

列出镜像地的变更历史
docker history 70aba9c80bd4
定义镜像tomcat 创建文件夹

执⾏以下命令: mkdir -p guardwhy/tomcat

在上述⽬录下创建新⽂件:touch readme.txt。

将 jdk 和 tomcat 安装的压缩包拷⻉进上⼀步⽬录

在guardwhy/tomcat⽬录下新建⼀个Dockerfile⽂件

注意: 官⽅命名为Dockerfile,build会⾃动寻找这个⽂件,就不需要-f指定了

# vim Dockerfile
FROM centos
MAINTAINER guardwhy<hxy1625309592@aliyun.com>
#把宿主机当前上下⽂的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.46.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.46
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.46
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运⾏时监听的端⼝
EXPOSE 8080
#启动时运⾏tomcat
CMD /usr/local/apache-tomcat-9.0.46/bin/startup.sh && tail -F
/usr/local/apache-tomcat-9.0.46/bin/logs/catalina.out
构建镜像
[root@Linux tomcat]# docker build -t diytomcat .
Sending build context to Docker daemon  154.6MB
Step 1/15 : FROM centos
---> 300e315adb2f
Step 2/15 : MAINTAINER guardwhy<hxy1625309592@aliyun.com>
---> Using cache
---> 2d8a3df8c6fb
Dependencies resolved.
=========================================================================
=======
 Package             Arch       Version                   Repository    
Size
=========================================================================
=======
Installing:
 vim-enhanced       x86_64      2:8.0.1763-15.el8         appstream    
1.4 M
Installing dependencies:
 gpm-libs           x86_64      1.20.7-17.el8             appstream    
  39 k
 vim-common         x86_64      2:8.0.1763-15.el8         appstream    
6.3 M
 vim-filesystem     noarch      2:8.0.1763-15.el8         appstream    
  48 k
 which               x86_64      2.21-12.el8               baseos        
49 k
Transaction Summary
=========================================================================
=======
Install  5 Packages
Total download size: 7.8 M
Installed size: 30 M
Downloading Packages:
(1/5): gpm-libs-1.20.7-17.el8.x86_64.rpm        132 kB/s |  39 kB    
00:00    
(2/5): vim-enhanced-8.0.1763-15.el8.x86_64.rpm  2.9 MB/s | 1.4 MB    
00:00    
(3/5): vim-filesystem-8.0.1763-15.el8.noarch.rp 233 kB/s |  48 kB    
00:00    
(4/5): vim-common-8.0.1763-15.el8.x86_64.rpm    9.0 MB/s | 6.3 MB    
00:00    
(5/5): which-2.21-12.el8.x86_64.rpm             205 kB/s |  49 kB    
00:00  
-------------------------------------------------------------------------
-------
Total                                           4.7 MB/s | 7.8 MB    
00:01    
warning: /var/cache/dnf/appstream-02e86d1c976ab532/packages/gpm-libs1.20.7-17.el8.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID
8483c65d: NOKEY
CentOS Linux 8 - AppStream                      1.6 MB/s | 1.6 kB    
00:00    
Importing GPG key 0x8483C65D:
 Userid     : "CentOS (CentOS Official Signing Key)
<security@centos.org>"
 Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Complete!
Successfully built ecc82f059377
Successfully tagged diytomcat:latest
[root@Linux tomcat]# docker images
REPOSITORY         TAG                 IMAGE ID           CREATED      
      SIZE
diytomcat           latest             ecc82f059377        4 minutes ago
      638MB
centos              7                   70aba9c80bd4        18 hours ago
      451MB
centos             latest             300e315adb2f        6 months ago
      209MB
[root@Linux tomcat]#
运行自定义镜像
docker run \
-d -p 9090:8080 --name mydiytomcat \
-v /home/guardwhy/tomcat/test:/usr/local/apache-tomcat9.0.46/webapps/test \
-v /home/guardwhy/tomcat/tomcat9logs/:/usr/local/apache-tomcat9.0.46/logs \
--privileged=true diytomcat

开启端口

开启8080:9000端⼝,打开防⽕墙

firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --zone=public --add-port=9090/tcp --permanent
firewall-cmd --reload

查看所有开启的端⼝

验证测试

链接访问: http://192.168.50.128:9090/

网页发布测试

创建WEB-INF⽂件夹,在⽂件夹中新建web.xml⽂件

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
<%@ 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.50.128:9090/test/

查看日志
[root@Linux tomcat]# ls
apache-tomcat-9.0.46.tar.gz Dockerfile jdk-8u261-linux-x64.tar.gz 
readme.txt test tomcat9logs
[root@Linux tomcat]# cd tomcat9logs/
[root@Linux tomcat9logs]# ls -l
总⽤量 48
-rw-r-----. 1 root root 16650 611 16:51 catalina.2021-06-11.log
-rw-r-----. 1 root root 16668 611 16:57 catalina.out
-rw-r-----. 1 root root     0 611 16:18 host-manager.2021-06-11.log
-rw-r-----. 1 root root   407 611 16:18 localhost.2021-06-11.log
-rw-r-----. 1 root root  1763 611 16:57 localhost_access_log.2021-06-
11.txt
-rw-r-----. 1 root root     0 611 16:18 manager.2021-06-11.log
[root@Linux tomcat9logs]#
发布镜像到阿里云 注册阿⾥云,登录阿⾥云服务找到容器镜像服务

创建命名空间

创建镜像仓库



点击进⼊这个镜像仓库,可以看到所有的信息

*** 作指南
1. 登录阿⾥云Docker Registry
$ docker login --username=tb99****08_88 registry.cn-qingdao.aliyuncs.com
⽤于登录的⽤户名为阿⾥云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证⻚⾯修改凭证密码。
2.Registry中拉取镜像
$ docker pull registry.cn-qingdao.aliyuncs.com/docker-guardwhy/java-test:
[镜像版本号]
3. 将镜像推送到Registry
$ docker login --username=tb99****08_88 registry.cn-qingdao.aliyuncs.com
$ docker tag [ImageId] registry.cn-qingdao.aliyuncs.com/dockerguardwhy/java-test:[镜像版本号]
$ docker push registry.cn-qingdao.aliyuncs.com/docker-guardwhy/java-test:
[镜像版本号]
请根据实际镜像信息替换示例中的[ImageId][镜像版本号]参数。
4. 选择合适的镜像仓库地址
从ECS推送镜像时,可以选择使⽤镜像仓库内⽹地址。推送速度将得到提升并且将不会损耗您的公⽹
流量。
如果您使⽤的机器位于VPC⽹络,请使⽤ registry-vpc.cn-qingdao.aliyuncs.com 作为
Registry的域名登录。
5. 示例
使⽤"docker tag"命令重命名镜像,并将它通过专有⽹络地址推送⾄Registry。
$ docker images
REPOSITORY                                                         TAG  
              IMAGE ID           CREATED             VIRTUAL SIZE
registry.aliyuncs.com/acs/agent                                    0.7-
dfb6816         37bb9c63c8b2        7 days ago          37.89 MB
$ docker tag 37bb9c63c8b2 registry-vpc.cnqingdao.aliyuncs.com/acs/agent:0.7-dfb6816
使⽤ "docker push" 命令将该镜像推送⾄远程。
$ docker push registry-vpc.cn-qingdao.aliyuncs.com/acs/agent:0.7-dfb681

测试推送发布

## 1、登录阿⾥云
[root@Linux tomcat]# docker login --username=13479615108 registry.cnqingdao.aliyuncs.com
Password:
Error response from daemon: Get https://registry.cnqingdao.aliyuncs.com/v2/: unauthorized: authentication required
[root@Linux tomcat]# clear
[root@Linux tomcat]# docker login --username=13479915208 registry.cnqingdao.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in
/root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentialsstore
Login Succeeded
## 2、设置 tag
[root@Linux tomcat]# docker tag ecc82f059377 registry.cnqingdao.aliyuncs.com/docker-guardwhy/java-test:v1.0
## 3、推送命令
[root@Linux tomcat]# docker push registry.cn-qingdao.aliyuncs.com/dockerguardwhy/java-test:v1.0
The push refers to repository [registry.cn-qingdao.aliyuncs.com/dockerguardwhy/java-test]
c7510b7d4b11: Pushed
d6d45250595e: Pushed
3a1d1e2371ce: Pushed
70d71810a13c: Pushed
2653d992f4ef: Pushed
v1.0: digest:
sha256:8baa27772f6fc09c79c5e9d986c397c243c49f601d287b9ee42781e931cae136
size: 1373
[root@Linux tomcat]#

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/928673.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-17
下一篇 2022-05-17

发表评论

登录后才能评论

评论列表(0条)

保存