• 7、DockerFile案例:自定义centos、自定义tomcat、webapps项目发布


     1、Base镜像(scratch)

    Docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的

    2、自定义镜像mycentos

     1、Hub默认CentOS镜像什么情况

    docker ps
    docker rm -f $(docker ps -qa)
    docker ps
    docker images docker run
    -it centos /bin/bash pwd

    1.默认路径是别的,不是/

    2. 精简版的cnetos没有vim包,不支持  vim abc.txt 

    3、不支持ipconfig  

     

    自定义mycentos目的使我们自己的镜像具备如下:
         登陆后的默认路径
         vim编辑器
         查看网络配置ifconfig支持

    也许应该这样写:

    2、编写

    准备编写DockerFile文件
    myCentOS内容DockerFile

    cd myDocker 
    touch DockerFile
    FROM centos
    MAINTAINER zzyy<zzyy167@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

    3、构建

    docker build -t 新镜像名字:TAG .

    # . 当前路径

    [root@localhost mydocker]# pwd
    /mydocker
    [root@localhost mydocker]# docker build -f /mydocker/DockerFile1 -t centos:1.3 .
    # 会看到 docker build 命令最后有一个 .                 . 表示当前目录
    #  Step1 Step2 层层叠加
    docker  images
    # ERROR:
    [root@localhost myDocker]# docker build -f /mydocker/Dockerfile -t centos:1.3 .
    The Dockerfile (/mydocker/Dockerfile) must be within the build context (.)
    
    # 原因:. 没有指定,至少代指,应该具体点
    [root@localhost myDocker]# docker build -f /mydocker/Dockerfile -t centos:1.3 /mydocker/

    # 实质原因
    pwd
    当前目录在 /myDocker
    我的file在 /root/mydocker

     

    4、运行

    docker run -it 新镜像名字:TAG 

    docker run -it mycentos:1.3
    pwd
    /user/local  # 工作目录WORKDIR
    vim test.txt
    ipconfig
    # 都支持

     可以看到,我们自己的新镜像已经支持vim/ifconfig命令,扩展成功了。

    5、列出镜像的变更历史

    docker history 镜像名

    docker  images mycentos
    docker history 43124324
    # 从底部往上看,栈,千层饼,花卷

    3、CMD/ENTRYPOINT 镜像案例

    都是指定一个容器启动时要运行的命令

    1、CMD

    Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
    Case

    2、tomcat的讲解演示

     

      

    (1)正常情况, 怎么运行tomcat

    docker images tomcat
    docker run -it -p 7777:8080 tomcat
    # 最后一行执行CMD ["catalina.sh", "run"]

     

    (2)非正常情况
    docker run -it -p 8888:8080 tomcat ls -l

    相当于

    (3)结论

    docker ps
    # tomcat 没有启动
    # ls 把 cmd替换了 

    3、ENTRYPOINT 

    不会被覆盖,会追加

    docker run 之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的命令组合

    4、Case案例

    (1)制作CMD版可以查询IP信息的容器

    [root@localhost /]# cd mydocker/
    [root@localhost mydocker]# ls
    Dockerfile  DockerFile1
    [root@localhost mydocker]# vim dockerfile4
    FROM centos
    RUN yum install -y curl
    CMD [ "curl", "-s", "https://ip.cn" ]   # 查ip的网址现在变成https了

    编写,构建,启动

    docker build -f /mydocker/dockerfile4 -t myip .
    docker images myip
    docker run -it myip

       (2)crul命令解释

    curl命令可以用来执行下载、发送各种HTTP请求,指定HTTP头部等操作。
    如果系统没有curl可以使用yum install curl安装,也可以下载安装。
    curl是将下载文件输出到stdout
     
    使用命令:curl http://www.baidu.com
    执行后,www.baidu.com的html就会显示在屏幕上了
     
    这是最简单的使用方法。用这个命令获得了http://curl.haxx.se指向的页面,同样,如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地。

    如果下载的是HTML文档,那么缺省的将只显示文件头部,即HTML文档的header。要全部显示,请加参数 -i

    (3)问题
    如果我们希望显示 HTTP 头信息,就需要加上 -i 参数

    curl -s https://ip.cn -i

     

     

    docker run myip 
    docker run myip -i

    失效,报错

     相当于

    (3)WHY
    制作ENTROYPOINT版查询IP信息的容器

    编写

    # vim DockerFile5
    FROM centos
    RUN yum install -y curl
    ENTRYPOINT?[ "curl", "-s", "https://ip.cn" ]

    构建

    docker build -f /mydocker/dockerfile5 -t myip02 .
    docker images myip02

    生成

    docker run myip
    docker run myip -i 
    # 报错
    
    docker run myip02
    docker run myip02 -i 
    # 成功

     

    4、ONBUILD命令案例

     

     1、父镜像编写,构建

    [root@localhost mydocker]# cat dockerfile6 
    FROM centos
    RUN yum install curl -y
    ENTRYPOINT ["curl","-s","https://ip.cn"]
    ONBUILD RUN echo "father images onbuild ---- 886"
    ONBUILD RUN yum install tree -y
    [root@localhost mydocker]# docker build -f /mydocker/dockerfile6 -t myip_father .

    仅仅是在父镜像包裹,并不会执行

     

    此处,为什么进不到交互模式,是dockerfile的问题吗

    2、子镜像FROM父镜像,编写,构建,run

    [root@localhost mydocker]# cat dockerfile7 
    FROM myip_father
    RUN yum install curl -y
    ENTRYPOINT ["curl","-s","https://ip.cn"]

     继承my_ipfather

    [root@localhost mydocker]# docker build -f /mydocker/dockerfile7 -t myip_son .
    [root@localhost mydocker]# docker images
    [root@localhost mydocker]# docker run -it myip_son /bin/bash

    红色  # 触发器

    先执行父亲的dockerfile的命令,在执行自己的

     

    此处,为什么,son也不能进入交互模式,也没有启动

     

     

    父类的Dockerfile中echo被执行

    生成父镜像的dockerfile6,中的echo被执行,

    如果父镜像安装tree命令,以后每个子镜像都会自动安装tree

     3、问题解决

    进不去交互模式

    可以进去,但是不打印ip地址了

     可以进去,CMD被/bin/bash覆盖,也不会打印ipl

    实质:/bin/bash才是进入交互模式的最后一条执行命令,其他的都不可以

    5、自定义镜像Tomcat9

    1、说明: tomcat的Dockerfile

    支持的版本

    自己配置,很恶心,用的版本不统一,出现各种问题

    2、touch c.txt

    # 1. touch c.txt
    mkdir -p /zzyyuse/mydockerfile/tomcat9
    在上述目录下touch c.txt

     3、下载tomcat和jdk 版本

    tomcat 9.029 https://tomcat.apache.org/download-90.cgi

     jdk13  https://www.oracle.com/technetwork/java/javase/downloads/jdk13-downloads-5672538.html

    版本下正确,对于jdk8,已经不维护了。

    # 压缩包上传
    将jdk和tomcat安装的压缩包拷贝进上一步目录
    apache-tomcat-9.0.8.tar.gz   
    jdk-8u171-linux-x64.tar.gz  
    
    # 存在
    ll
    3个存在

     

     4、编写DockerFIle

     在/zzyyuse/mydockerfile/tomcat9目录下新建Dockerfile文件

    1、目录内容

    2、讲解

    纯净的centos
    copy c.txt /user/local/cincotainer.txt   
    copy+重名
    copy  
    add = copy+ 解压缩
    安装vim
    ENV 环境变量配置
    CMD 追加到log日志

     3、apache9.09和jdk13对应的

    FROM centos
    MAINTAINER zzyy<zzyybs@126.com>
    # 把宿主机当前上下文的c.txt copy到容器/usr/local下
    COPY c.txt /usr/local/cincontainer.txt
    # 把java和tomcat添加到docker中
    ADD apache-tomcat-9.0.29.tar.gz /usr/local
    ADD jdk-13.0.1_linux-x64_bin.tar.gz /usr/local
    # 安装vim
    RUN yum install vim -y
    # 设置工作访问时候的WORKDIR路径,登录落脚点
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    # 配置java与tomcat环境变量
    ENV JAVA_HOME /usr/local/jdk-13.0.1
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.29
    ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.29
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    # 容器运行时监听的端口
    EXPOSE 8080
    # 启动时运行tomcat
    # ENTRYPOINT ["/usr/local/apache-tomcat-9.0.29/bin/startup.sh" ]
    # CMD ["/usr/local/apache-tomcat-9.0.29/bin/catalina.sh","run"]
    CMD /usr/local/apache-tomcat-9.0.29/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.29/logs/catalina.out

    5、构建

    docker build -f DockerFile -t zzyytomcat9 .  
    # 默认读取当前目录下的DockerFile
    # 指定target 名称
    
    docker images

     

    构建完成

     

     6、run

     1、先 测试下

    docker run -p 888:8080 -it zzyytomcat9

    交互模式,打印日志

    2、error:碰到的

    原因:jdk版本与tomcat版本不匹配

     

     

     3、备注

    Docker挂载主机目录Docker访问出现cannot open directory .: Permission denied
    解决办法:在挂载目录后多加一个--privileged=true参数即可

     4、真实的run一下

    完整命令

     

    docker run -d 
    -p 9080:8080 
    --name myt9 
    -v /zzyyuse/mydockderfile/tomcat9/test:/usr/local/apache-tomcat-9.0.29/webapps/test 
    -v /zzyyuse/mydockderfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.29/logs 
    --privileged=true  
    zzyytomcat9

    查看结果

     

    浏览器登录

    7、验证

    docker ps 
    
    # 隔空取物
    docker exec 03434 ls -l
    docker exec 03434 ls -l /tmp

     

    6、结合前述的容器卷将测试的web服务test发布

    1、总体概述

    webapp 存放我们的项目

    直接在容器里面读取我们在宿主机的项目

    容器卷2个生成,往里面放web项目,容器会动生成

    2、宿主机创建webapps

    1、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>

    2、WEB-INF/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>

    3、ok

    pwd
    /zzyyuse/mydockderfile/tomcat9/test
    
    vim a.jsp
    
    mkdir WEB-INF
    cd WEB-INF
    vim web.xml

    3、容器内

    此时已经同步到容器内部了,webapps项目

    docker exec 0da java --version
    
    docker exec 0da ls /usr/local/apache-tomcat-9.0.29/webapps/test

     4、测试

    docker ps
    docker restart 0343
    docker ps
    
    # 浏览器访问 9080
    localhost:9080/test/a.jsp

     

    # 修改 内容
    vim a.jsp

     

    刷新页面,查看效果

     

     查看日志

    查看日志
    
    [root@localhost test]# cd /zzyyuse/mydockderfile/tomcat9/tomcat9logs/
    
    [root@localhost tomcat9logs]# ls
    catalina.2019-11-26.log host-manager.2019-11-26.log localhost_access_log.2019-11-26.txt
    catalina.out localhost.2019-11-26.log manager.2019-11-26.log
    
    [root@localhost tomcat9logs]# less catalina.out

     

    7、小总结

     

  • 相关阅读:
    最新 Cocos2d-x 3.2 开发环境搭建(windows环境下)
    Apache OFbiz entity engine源代码解读
    Android 标签控件
    标准红外遥控的接收程序-松瀚汇编源程序
    uva 10548
    char* 和char[]的差别
    依据波形的转折点文件,转换成波形文件
    spring 中StoredProcedure的使用方法
    JMS的样例
    JavaScript高级编程
  • 原文地址:https://www.cnblogs.com/venicid/p/11922378.html
Copyright © 2020-2023  润新知