• docker入门加实战—Docker镜像和Dockerfile语法


    docker入门加实战—Docker镜像和Dockerfile语法

    镜像

    镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。

    镜像结构

    我们要从0部署一个Java应用,大概流程是这样:

    1. 准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可)

    2. 安装并配置JDK

    3. 拷贝jar包

    4. 配置启动脚本

    镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为Layer)。这样,如果我们构建时用到的某些层其他人已经制作过,就可以直接拷贝使用这些层,而不用重复制作。

    例如,第一步中需要的Linux运行环境,通用性就很强,所以Docker官方就制作了这样的只包含Linux运行环境的镜像。我们在制作java镜像时,就无需重复制作,直接使用Docker官方提供的CentOS或Ubuntu镜像作为基础镜像。然后再搭建其它层即可,这样逐层搭建,最终整个Java项目的镜像结构如图所示:

    Java项目镜像结构

    Dockerfile

    由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。

    而这种记录镜像结构的文件就称为Dockerfile,其对应的语法可以参考官方文档:

    https://docs.docker.com/engine/reference/builder/

    其中的语法比较多,比较常用的有:

    指令说明示例
    FROM指定基础镜像FROM centos:7
    ENV设置环境变量,可在后面指令使用ENV key value
    COPY拷贝本地文件到镜像的指定目录COPY ./xx.jar /tmp/app.jar
    RUN执行Linux的shell命令,一般是安装过程的命令RUN yum install gcc
    EXPOSE指定容器运行时监听的端口,是给镜像使用者看的;
    但是后面还是需要-p来做端口映射的
    EXPOSE 8080
    ENTRYPOINT镜像中应用的启动命令,容器运行时调用ENTRYPOINT java -jar xx.jar

    例如,要基于Ubuntu镜像来构建一个Java应用,其Dockerfile内容如下:

    # 指定基础镜像
    FROM ubuntu:16.04
    # 配置环境变量,JDK的安装目录、容器内时区
    ENV JAVA_DIR=/usr/local
    ENV TZ=Asia/Shanghai
    # 拷贝jdk和java项目的包
    COPY ./jdk8.tar.gz $JAVA_DIR/
    COPY ./docker-demo.jar /tmp/app.jar
    # 设定时区
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    # 安装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 8080
    # 入口,java项目的启动命令
    ENTRYPOINT ["java", "-jar", "/app.jar"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    以后我们会有很多java项目需要打包为镜像,它们都需要Linux系统环境、JDK环境这两层,只有上面的3层不同(因为jar包不同)。如果每次制作java镜像都重复制作前两层镜像,是很麻烦的。

    所以,就有人提供了基础的系统加JDK环境,我们在此基础上制作java镜像,就可以省去JDK的配置了:

    FROM openjdk:11.0-jre-buster
    # 设定时区
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    # 拷贝jar包
    COPY docker-demo.jar /app.jar
    # 入口
    ENTRYPOINT ["java", "-jar", "/app.jar"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    构建镜像

    在/root/demo目录下有如下两个文件

    目录文件

    其中docker-demo.jar是Java项目;Dockerfile如下:

    # 基础镜像
    FROM openjdk:11.0-jre-buster
    # 设定时区
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    # 拷贝jar包
    COPY docker-demo.jar /app.jar
    # 入口
    ENTRYPOINT ["java", "-jar", "/app.jar"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    然后,执行命令,构建镜像:

    # 进入镜像目录
    cd /root/demo
    # 开始构建
    docker build -t docker-demo:1.0 .
    
    • 1
    • 2
    • 3
    • 4
    • docker build : 就是构建一个docker镜像

    • -t docker-demo:1.0-t参数是指定镜像的名称(repositorytag

    • . : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录:

      • # 直接指定Dockerfile目录
        docker build -t docker-demo:1.0 /root/demo
        
        • 1
        • 2

    如果没有指定Dockerfile的名字,就必须叫Dockerfile。

    运行结果如下:

    运行结果

    查看镜像

    查看镜像

    可以看到多了一个docker-demo的镜像;

    尝试运行:

    docker run -d --name dd -p 8080:8080 docker-demo:1.0
    
    • 1

    运行结果

  • 相关阅读:
    【单片机毕业设计】【mcuclub-hj-015】基于单片机的水质监控的设计
    冰冰学习笔记:反向迭代器的模拟
    顺序表(静态版本)-----动态版本的基础
    python super()详解,一篇文章告诉你python的super是什么,如何使用
    漏斗分析法、假设分析法
    基于人工智能的智能化指挥决策和控制
    做期权卖方有资金限制吗?
    Linux csplit命令教程:如何根据内容分割文件(附实例详解和注意事项)
    记录:2022-9-13 正则表达式匹配 Java中的String能有多大 文件系统目录 原子性操作 锁 同步 信号量
    docker安装mariadb数据库
  • 原文地址:https://blog.csdn.net/qq_41243472/article/details/133827365