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

2023年 10月 14日 81.1k 0

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

镜像

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

镜像结构

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

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

  • 安装并配置JDK

  • 拷贝jar包

  • 配置启动脚本

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

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

    Java项目镜像结构

    Dockerfile

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

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

    docs.docker.com/engine/refe…

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

    指令 说明 示例
    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"]
    

    以后我们会有很多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"]
    

    构建镜像

    在/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"]
    

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

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

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

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

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

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

    运行结果如下:

    运行结果

    查看镜像

    查看镜像

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

    尝试运行:

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

    运行结果

    相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论