• Dockerfile自定义镜像以及案例分析


    一、Dockerfile自定义镜像

    常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须自己构建镜像了。

    而要自定义镜像,就必须先了解镜像的结构才行。

    1.1 镜像结构

    镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。

    例如mysql镜像的组成结构如下图所示:在这里插入图片描述
    简单来说,镜像就是在系统函数库、运行环境基础上,添加应用程序文件、配置文件、依赖文件等组合,然后编写好启动脚本打包在一起形成的文件。

    我们要构建镜像,其实就是实现上述打包的过程。

    1.2 Dockerfile语法

    构建自定义的镜像时,并不需要一个个文件去拷贝,打包。

    我们只需要告诉Docker,我们的镜像的组成,需要哪些BaseImage、需要拷贝什么文件、需要安装什么依赖、启动脚本是什么,将来Docker会帮助我们构建镜像。

    而描述上述信息的文件就是Dockerfile文件。

    Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。

    在这里插入图片描述
    在这里插入图片描述

    更新详细语法说明,可以参考官网文档: https://docs.docker.com/engine/reference/builder

    二、构建Java项目

    需求:基于Ubuntu镜像构建一个新镜像,运行一个java项目

    • 步骤1:新建一个空文件夹docker-demo
    • 步骤2:拷贝我们打包好的java项目docker-demo.jar文件到docker-demo这个目录
    • 步骤3:拷贝课前资料中的jdk8.tar.gz文件到docker-demo这个目录
    • 步骤4:拷贝课前资料提供的Dockerfile到docker-demo这个目录,其中的内容如下:
    # 指定基础镜像
    FROM ubuntu:16.04
    # 配置环境变量,JDK的安装目录
    ENV JAVA_DIR=/usr/local
    
    # 拷贝jdk和java项目的包
    COPY ./jdk8.tar.gz $JAVA_DIR/
    COPY ./docker-demo.jar /tmp/app.jar
    
    # 安装JDK
    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
    
    # 暴露端口
    EXPOSE 8090
    # 入口,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
    • 步骤5:进入docker-demo
      将准备好的docker-demo上传到虚拟机任意目录,然后进入docker-demo目录下。(这里使用的finalshell远程连接Centos7虚拟机)
      在这里插入图片描述

    • 步骤6:运行命令:

    docker build -t javaweb:1.0 .   
    # 一定不要忘记了最后有个.,表示从当前目录开始构建
    
    • 1
    • 2

    最后访问 http://192.168.207.129:8090/hello/count,其中的ip改成自己的虚拟机ip,具体的端口后面的路径地址也和自己的java项目有关。

    三、基于java8构建java

    虽然我们可以基于Ubuntu基础镜像,添加任意自己需要的安装包,构建镜像,但是却比较麻烦。所以大多数情况下,我们都可以在一些安装了部分软件的基础镜像上做改造。

    例如,构建java项目的镜像,可以在已经准备了JDK的基础镜像基础上构建。

    需求:基于java:8-alpine镜像,将一个Java项目构建为镜像

    实现思路如下:

    • ① 新建一个空的目录,然后在目录中新建一个文件,命名为Dockerfile

    • ② 将自己打包好的Java项目docker-demo.jar拷贝到这个目录中

    • ③ 编写Dockerfile文件:

      • a )基于java:8-alpine作为基础镜像

      • b )将app.jar拷贝到镜像中

      • c )暴露端口

      • d )编写入口ENTRYPOINT

        内容如下:

    FROM java:8-alpine
    COPY ./app.jar /tmp/app.jar
    EXPOSE 8090
    ENTRYPOINT java -jar /tmp/app.jar
    
    • 1
    • 2
    • 3
    • 4
    • ④ 使用docker build命令构建镜像

    • ⑤ 使用docker run创建容器并运行

    四、小结

    1. Dockerfile的本质是一个文件,通过指令描述镜像的构建过程

    2. Dockerfile的第一行必须是FROM,从一个基础镜像来构建

    3. 基础镜像可以是基本操作系统,如Ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine

  • 相关阅读:
    ZooKeeper技术内幕
    各中间件性能、优缺点对比
    算法基础-数学知识-欧拉函数、快速幂、扩展欧几里德、中国剩余定理
    【Vue】模板语法,插值、指令、过滤器、计算属性及监听属性(内含面试题及毕设等实用案例)上篇
    虚幻5框架GamePlay全图
    只要有开始,就会有进​步
    C语言的offsetof宏模拟和用宏实现交换奇偶位
    Flink 程序剖析
    LeetCode(26)判断子序列【双指针】【简单】
    8. 基于消影点进行相机内参(主点)的标定
  • 原文地址:https://blog.csdn.net/qq_45858191/article/details/134462785