• Docker制作tomcat镜像之Dockerfile


    基于CentOS7、Tomcat1.7、JDK1.8制作Tomcat镜像

    1.拉取centos7镜像

    docker pull centos:centos7

    2.将jdk1.8和tomcat1.7解压到 /data1/software目录下

       

    3.编写Dockerfile,命名为dockerfile-tomcat,内容如下:

    FROM centos:centos7
    MAINTAINER m01
    #RUN mkdir /usr/local/java && \
    # mkdir /usr/local/tomcat #将tomcat和jdk下的所有文件拷贝到镜像中,目标目录不存在会自动创建。COPY源目录不能使用/data1/sofotware/apache-,无法识别 COPY apache
    -tomcat-7.0.64 /usr/local/tomcat COPY jdk1.8.0_73 /usr/local/java
    #ADD apache-tomcat-7.0.64.tar.gz /usr/local/tomcat/ #会将其自动解压到镜像的/usr/local/tomcat/apache-tomcat-7.0.64目录下,.sh没有执行权限
    #拷贝过去的文件没有可执行权限 RUN
    chmod a+x /usr/local/tomcat/bin/*.sh #添加环境变量 ENV JAVA_HOME /usr/local/java ENV CATALINA_HOME /usr/local/tomcat ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin ENV CLASSPATH .:$JAVA_HOME/lib:$JAVA_HOME/jre/lib EXPOSE 8080 CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
    #Dockerfile设置多个环境变量
    ENV JAVA_HOME=/usr/local/java  \
        CATALINA_HOME=/usr/local/tomcat
    #因为下面要调用上面生成的环境变量,所以必须要分开写,写一起后面无法生效
    ENV PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin  CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

    4.运行docker build生成镜像

    docker build -t centos7_tomcat7:v1 -f dockerfile-tomcat ..  # 最后的..指定工作目录,使其能够找到COPY的源目录

     5.查看新生成的Tomcat镜像

     6.启动容器:

    docker container run  -d -p 8080:8080 --name tomcat01 -d centos7_tomcat7:v1

    部署jenkins

    从jenkins官网下载jenkins.war放到宿主/data1/software/下

    编辑dockerfile-tomcat-jenkins,基于前面的tomcat镜像生成新的jenkins镜像,内容如下:

    FROM centos7_tomcat7:v1
    COPY jenkins.war /usr/local/tomcat/webapps/jenkins.war

    docker build -t jenkins:v1 -f dockerfile-tomcat-jenkins ..    #生成jenkins镜像

    docker run -d -p 8090:8080 --name jenkins01 jenkins:v1  #启动jenkins容器

    访问:http://宿主IP:8090/jenkins可以正常打开jenkins页面

    #将容器中的tomcat log映射到宿主机/data1/logs/tomcat05,容器启动后可以在/data1/logs/tomcat05目录下看到tomcat日志

    docker run -d -p 8091:8080 --name jenkins05 --mount type=bind,source=/data1/logs/tomcat05,target=/usr/local/tomcat/logs -d jenkins:v1

    ====================================================================================================================

    docker container run  -d -p 8080:8080 --name tomcat01 -d centos7_tomcat7:v1

    docker cp jenkins.war tomcat01:/usr/local/tomcat/webapps/jenkins.war  #借助前面已生成的容器,将jenkins.war包拷贝进去也可以正常使用

    重新启动容器tomcat01,访问http://宿主IP:8080/jenkins可以正常打开jenkins页面

    =================================================================================

    编写高效Dockerfile:https://blog.fundebug.com/2017/05/15/write-excellent-dockerfile/

    #dockerfile拷贝多个文件到./
    COPY ["filea", "fileb", "filec", "filed", "./"]
    
    COPY ["dira", "dirb", "./"] #只会将目录a和目录b下的所有文件都拷贝到./,不会包含目录a和目录b本身

    Dockerfile中的ARG参数只在构建docker镜像时有效,在镜像创建了并用该镜像启动容器后则无效。但可以配合ENV指令使用使其在创建后的容器也可以生效

    FROM ubuntu
    ARG TEST   #ARG TEST=deault_value
    ENV ENV_TEST=$TEST

    docker build --build-arg TEST=1 -t ubuntu:test-build -f ./dockerfile .

    docker run --rm -it ubuntu:test-build
    env|grep "TEST"

     Dockerfile VOLUME应用:

    FROM alpine
    VOLUME ["/data1","/data2"] #创建两个挂载点,但无法指定宿主具体目录,创建容器的时候自动生成

    docker build -t alpine01 -f df01 .

    docker container run -it --name alpine03 -d alpine01 /bin/sh

    docker inspect alpine03:

      效果等同于 docker run --name test1 -it -v /data1 ubuntu /bin/bash

     Dockerfile HEALTHCHECK应用:

    HEALTHCHECK只是用来检查容器健康状态,应用场景:容器还在运行中,监控服务是否已经假死

    如果容器已停止,需要自启动,则使用docker run --restart always参数

    编写dockerfile-nginx,内容如下:

    FROM nginx
    #延迟5s才开始检查,留给容器一个启动时间;每10s检查一次;检查命令超时时间为3s,重试3次都失败,则认为容器是unhealthy状态
    HEALTHCHECK --start-period=5s --interval=10s --timeout=3s --retries=3 \
    #检查80端口,如果失败则返回1,返回非零状态码Docker就会认为当前容器的状态是不健康的
    CMD curl -sS 'http://localhost:80' || exit 1   #使用脚本检查:CMD /bin/bash /opt/check80.sh

    check80.sh脚本内容如下:

    curl -sS 'http://localhost:80' > /dev/null
    if [ $? == 0 ];then
      exit 0
    else
      exit 1
    fi
    View Code

    docker build -t nginx_test:v2 -f dockerfile-nginx01 .

    docker run --name nginx01 -d nginx_test:v2

  • 相关阅读:
    Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记
    Android请求网络共通类——Hi_博客 Android App 开发笔记
    Html Agility Pack 解析Html
    Asp.Net Mvc 使用WebUploader 多图片上传
    JavaScript初探 二
    JavaScript初探 三
    JavaScript初探 四
    JavaScript初探一
    async & await 的前世今生(Updated)
    Grunt基础知识介绍
  • 原文地址:https://www.cnblogs.com/dreamer-fish/p/15745608.html
Copyright © 2020-2023  润新知