• 学会Dockerfile


    一、什么是Dockerfile

    Dockerfile是一个文本文件,由一条条指令组成,用于指示 docker build 命令自动构建Image的源码。每一条指令构建一层镜像,即每一条指令的内容就是描述如何构建该层镜像。

    二、Dockerfile常用命令

    1. 创建镜像

    docker build 命令用于使用Dockerfile文件创建镜像。

    -t:选项用于设置镜像的名称或标签,可以是name:tag或者name。
    -f:选项用于指定要使用的Dockerfile文件路径。
    其他选项可阅:docker build 命令更多选项说明


    2.如何写Dockerfile

    • FROM 指令

    指定基础镜像,即构建的新镜像将基于哪个镜像进行构建。此指令通常放在第一非注释行,后续的所有指令都是运行于在此镜像所提供的运行环境。

    # 不指定tag时默认寻找latest
    FROM centos[:tag]
    
    • 1
    • 2
    • 基础镜像可以是任何可用的镜像的文件,默认情况下,docker build会先在本地查找指定的镜像文件;若本地不存在时,会到Docker Hub Register 上拉取指定的镜像文件;倘若都找不到,则会返回一个错误信息。

    • RUN 指令

    用于在构建镜像阶段需要执行FROM镜像所支持的Shell命令

    RUN yum -y python3 && yum -y python3-pip
    
    • 1
    • RUN 指令可以写多个,但每个独立的指令会建立一个镜像层,所以尽可能合并成一条指令,比如多个shell命令可以使用 && 连接在一起,成为一条指令。

    • WORKDIR 指令

    为后续指令配置工作目录,当容器运行后,进入容器内WORKDIR指定的默认目录。

    WORKDIR /home/gfstong/
    
    • 1
    • 相当于Shell命令的 cd 指定目录,不同的是如果所指定的目录不存在,WORKDIR会自行创建。

    • COPY 指令

    从构建上下文目录中的源路径文件(目录)复制到新的一层镜像内的目标路径位置。

    # COPY 源文件 目标路径
    COPY hello.py /home/gfstong/
    
    • 1
    • 2

    • ADD 指令

    除拥有COPY指令原有的功能外,还支持自动解压缩。也可访问网络资源,类似于wget,但来自远程url将不会被自动解压缩。

    COPY nginx-1.14.0.tar.gz /usr/nginx
    
    • 1

    • ENV 指令

    可设置环境变量和值,会被后续指令进行引用,并在容器运行时保持。

    EVN JAVA="JAVA" PYTHON="PYTHON" PHP="PHP"
    
    • 1

    • ARG指令

    用于设置在构建镜像时指定的环境变量和值,不会在容器运行时保持。

    ARG C="C" RUST="RUST"
    
    • 1
    • 与ENV指令不同于,ARG指令不会在容器运行时存在。
    • 若ARG指令与ENV指令同名, 则ARG的值会被其所覆盖。
    • 也可以通过 docker build --build-arg <参数名>=<值> 来覆盖。

    • CMD指令

    用于指定容器启动时默认执行的一个命令,且该命令执行结束后,容器也会停止。

    # shell格式
    CMD java -jar springboot-helloworld-0.0.1-SNAPSHOT.jar
    # exec格式
    CMD ["java", "-jar", "springboot-helloworld-0.0.1-SNAPSHOT.jar"]
    
    • 1
    • 2
    • 3
    • 4
    • 因为一个容器中需要持续运行的进程一般只能有一个,所以该指令一般为持续运行且为前台命令。
    • CMD指令不同于RUN指令,前者是在容器启动时所执行的命令,后者则是在构建镜像时所执行的命令。
    • 每一个Dockerfile只能有一条CMD指令,倘若指定了多条,也只会执行最后一条。
    • 若使用docker run 命令指定了容器的执行命令,则CMD指令将会被覆盖。

    • ENTRYPOINT指令

    功能与CMD指令类似,配置容器启动后所指定的命令及参数。

    • 每一个Dockerfile只能有一条ENTRYPOINT指令,倘若指定了多条,也只会执行最后一条。
    • 不能被docker run的执行命令所覆盖, 但可以通过–entrypoint选项来覆盖。
    • 倘若docker run有携带执行命令且Dockerfile中没有CMD指令,docker run 携带的命令将以参数的形式追加到ENTRYPOINT的参数中。
    • 倘若docker run不携带命令且Dockerfile存在CMD指令,则CMD指令的参数将追加到ENTRYPOINT的参数中。
    • 倘若docker run和Dockerfile均携带命令,则Dockerfile中的CMD指令将被docker run所覆盖,最终追加到ENTRYPOINT的参数中。

    • VOLUME指令

    在容器中创建一个可以挂载到宿主主机的挂载点,即使容器被删除,也能保证数据能持久化保存。

    VOLUME ["/data", "/data1"]
    # 或
    VOLUME /data /data1
    
    • 1
    • 2
    • 3

    或者 可以通过docker run 命令的 -v 选项来创建一个挂载到宿主主机的挂载点。


    3.简单示例

    百度网盘示例链接 | 提取码:1024


    • 首先,将示例下载复制到自己要部署存放的目录中。

    Dockerfile内容大致如下:创建一个基础镜像并安装所需的python3包,进入应用目录下并容器运行时自启动应用。

    Dockerfile文件内容

    FROM centos:7.5.1804
    
    RUN yum makecache
    
    RUN yum -y install python3-devel python3-pip
    
    RUN pip3 install flask
    
    WORKDIR /opt/product
    
    CMD ["python3", "index.py"]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    • 使用 docker build 命令将Dockerfile构建成镜像。
    docker build -t flask:demo .
    
    • 1

    • 使用 docker run 命令创建并运行容器。
    docker run -it -d -p 6868:6868 -v /dockerfile/entrypoint:/opt/product flask:demo
    
    • 1

    注意:/dockerfile/entrypoint:/opt/product 为挂载设置,/dockerfile/entrypoint 的实际目录应为你宿主主机部署存放的目录。
    关于 docker run 命令的选项作用可看文章:Docker基本操作


  • 相关阅读:
    WPF中的DataContext
    ES6中WeakMap和WeakSet
    docker部署安装Nginx
    ArcGIS Engine:C#基础语法的了解
    DWB主题事实及ST数据应用层构建,220803,,
    014-JAVA函数定义及return语句的使用
    【HarmonyOS】【JAVA UI】HarmonyOS 如何集成KLog
    ssm高校党员信息管理系统
    交通地理信息系统实习教程(二)
    Spring boot入门有手就行_SpringBoot简介及3种项目搭建方式
  • 原文地址:https://blog.csdn.net/weixin_43260238/article/details/126350644