• Docker自定义镜像


    接上一篇:Docker数据卷
    ♦️前期我们使用镜像都是从仓库中pull下来的
    那么,仓库中的镜像其实也是docker的用户上传过去的,所以我们也可以通过自己的方式去自定义镜像


    ♦️创建Docker镜像的方式有三种

    • docker commit命令:由容器生成镜像;
    • Dockerfile文件+docker build命令;
    • 从本地文件系统导入:OpenVZ的模板。

    下面来看第二种方式
    ♦️在windows下新建一个Dockerfile文件
    把后缀名删了,该文件不给后缀
    在这里插入图片描述
    在Dockerfile文件中编写内容,指定我们需要的镜像信息
    ♦️Dockerfile文件中常用的内容如下:

    🔹FROM :指定当前自定义镜像依赖的环境
    🔹MAINTAINER :镜像创建者信息
    🔹EXPOSE :开放的端口
    🔹COPY:将相对路径下的内容复制到自定义镜像中
    🔹ENV :设置变量
    🔹ADD :复制文件到镜像
    🔹RUN :制作镜像时执行的命令,可以有多个
    🔹WORKDIR :定义容器默认的工作目录
    🔹CMD :容器启动时执行的命令,可以写多个,只以最后一个为准。

    ♦️1. 自定义一个tomcat镜像,并把ssm.war部署到tomcat中
    在这里插入图片描述
    复制到daocloud.io/library/tomcat:8.5.15-jre8

    返回Dockerfile文件完成编写

    from daocloud.io/library/tomcat:8.5.15-jre8
    copy ssm.war /usr/local/tomcat/webapps
    
    • 1
    • 2

    🔺from :指定当前自定义镜像依赖的环境
    🔺copy:将相对路径下的内容复制到自定义镜像中。(注意是相对路径,所以ssm.war这个压缩包要和Dockerfile在同级目录下)
    在这里插入图片描述
    ♦️2. 将准备好的Dockerfile和相应的文件拖拽到Linux操作系统中,通过Docker的命令制作镜像

    🔹接下来打Xterm中,把这个Dockerfile和ssm.war都拖拽到新建的ssm-tomcat文件夹中
    在这里插入图片描述
    在这里插入图片描述
    cd ssm-tomcat/切换到新建的ssm-tomcat文件夹
    ls查看,发现存在Dockerfile和ssm.war
    接下来输入以下命令
    docker build -t ssm-tomcat:1.0.0 .
    docker build -t 自定义镜像名:版本号 .

    在这里插入图片描述
    docker build命令,-t选项用来指定镜像的tag,最后一个点代表把当前目录下的Dockerfile文件制作成一个自定义的镜像
    它会自动识别Dockerfile这个文件名
    在这里插入图片描述
    要想用我们的镜像启动一个容器,通过这个ssm-tomcat镜像的Image ID来创建容器

    docker run -d -p 8081:8080 --name custom-ssm-tomcat 40
    
    • 1

    在这里插入图片描述

    #启动容器
    docker run -d -p 8081:8080 --name custom-ssm-tomcat 40
    
    #防火墙开放端口
    firewall-cmd --add-port=9090/tcp --permanent --zone=docker
    firewall-cmd --reload
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    docker ps查看所有运行的容器
    在这里插入图片描述
    可以看到,刚刚创建的容器custom-ssm-tomcat已经存在了
    浏览器访问报错:
    在这里插入图片描述
    看一下日志:
    在这里插入图片描述
    在这里插入图片描述
    解决办法就是访问http,而不是https
    具体看这篇:Tomcat报错:org.apache.coyote.http11.Http11Processor.service 解析 HTTP 请求 header 错误

    再次访问成功!
    在这里插入图片描述
    浏览器上访问https://192.168.199.10:8081/ssm
    成功运行部署到自定义镜像的SSM项目

    ♦️这篇写的比较详细:Docker自定义镜像

    🦩上面只演示了form和copy
    Dockerfile文件中其他常用的内容,在下面例题中演示

    ♦️例1. Dockerfile文件

    #指定基础镜像(java:8-alpine这个在dockerhub上面已经找不到了)
    FROM openjdk:8-jre-alpine 
    
    #拷贝jar包到上面基础镜像的/tmp目录下,并命名为 app.jar
    COPY ./docker-demo.jar /tmp/app.jar
    
    #暴露端口(就是容器的端口,前面有用过-p 8080:80,8080是宿主机端口,
    # 而80就是这里EXPOSE的端口号,当然了,这里我们暴露出去的端口号是9090)
    EXPOSE 9090
     
    #入口,java项目的启动命令
    ENTRYPOINT java -jar /tmp/app.jar
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    ♦️例2. Dockerfile文件

    
    # 指定基础镜像(即基于哪个系统,如果是Ubuntu16.04,那就是ubuntu:16.04,当然了,具体还得按照dockhub官网的来,不能乱写)
    FROM centos:7
    # 配置环境变量,JDK的安装目录
    ENV JAVA_DIR=/usr/local
    
    # 拷贝jdk和java项目的包(这里的$JAVA_DIR就是上面的/usr/local)
    COPY ./jdk8.tar.gz $JAVA_DIR/
    COPY ./docker-demo.jar /tmp/app.jar
    
    # 安装JDKRUN就是使用我们的终端运行的指令)
    RUN cd $JAVA_DIR \
     && tar -xf ./jdk8.tar.gz \
     && mv ./jdk1.8.0_144 ./java8
    
    # 配置环境变量
    ENV JAVA_HOME=$JAVA_DIR/java8
    ENV PATH=$PATH:$JAVA_HOME/bin
    
    # 暴露端口(就是容器的端口,前面有用过-p 8080:80,8080是宿主机端口,
    # 而80就是这里EXPOSE的端口号,当然了,这里我们暴露出去的端口号是9090EXPOSE 9090
    
    # 入口,java项目的启动命令
    ENTRYPOINT java -jar /tmp/app.jar
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    tar -xf ./jdk8.tar.gz命令,tar -x是解压

    ♦️Dockerfile创建自定义Docker镜像以及CMDENTRYPOINT指令的比较:
    Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较

  • 相关阅读:
    防止被00后整顿?一公司招聘要求员工不能起诉公司
    吃透Redis(四):网络框架篇-多路复用器
    Spire.xls+excel文件实现单据打印
    《Linux》day3--shell语法(上)
    一周净赚一套房,“羊了个羊”爆火的产品逻辑可复制吗?
    【QT】信号与槽
    SpringBoot 自动装配原理
    ​LeetCode解法汇总2864. 最大二进制奇数
    【java】Java项目从开发到部署生产完整流程梳理
    RabbitMQ简介&在分布式微服务中的使用场景
  • 原文地址:https://blog.csdn.net/m0_47010003/article/details/127834997