DockerFile篇
前言:docker是一款容器管理工具,第一次知道docker是在几年前刚开始接触开发的时候,但一直没有对docker进行过深入的学习。之前只有简单的了解过docker基本命令,甚至都不知道docker file如何编写。直到今年初的一个项目,需要使用docker的容器编排,于是只能硬着头皮往上顶,经过一些简单的学习,发现docker file及容器编排并没有以前想象中的那么难,在搜索引擎的帮助下很快就完成了那个项目的容器编排。时间过了大半年,我终于开始重头整理下docker的相关指令和知识了,此次共分为安装篇,docker基础篇,dockerFile篇,docker_compose篇。
DockerFile的作用
DockerFile就是一个用来构建Docker镜像的文本文件,里面包含了一些构建镜像的指令。以前学Docker基础时总以为DockerFile很难很复杂,在实际上手过后发现基本不需要太多的学习成本。
示例
在对DockerFile指令讲解前,我们先来看一个普通的DockerFile文件,这就是使用DockerFile将一个jar构建成镜像。
第一步是指定基础镜像,这个镜像可以是本地镜像也可以是远程仓库的镜像,这里可以理解为基础环境依赖,我们跑jar包,肯定是得需要依赖jdk环境的。
第二步是设置容器内的工作目录,设置这个工作目录后后续的容器指令都是以该目录作为基础目录的
第三步是将我们本地的jar包复制到容器的工作目录下去,我们想要通过容器部署jar,可不得容器内先有这个jar嘛
第四步是暴露端口,这一步其实没有那么必要,也可以在启动镜像的时候通过-p去手动映射端口
第五步是环境变量定义,这一步其实也没那么必要,比如这里我们就没有用到
第六步是通过Json(非shell)的方式运行这个jar包,这里第一个参数是可执行文件或者命令,后面的都是跟的需要拼接的参数
按照上面示例的步骤,参照示例的DcokerFile应该就能写出工作中大部分场景下的DockerFile了
DockerFile指令
对于DockerFile的指令,我还是按照我自己的理解来进行描述,对于我使用较多的会进行标黑
- FROM:用来指定基础镜像的。
- 这个指令从上面的示例也能看出来,它是必须存在,而且不可替代的,它可以存在多个
- MAINTAINER:指定Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令)
- LABEL:添加镜像的元数据,使用键值对的形式。就是用来添加一些描述信息的
- RUN:在构建过程中在镜像中执行命令。
- 这个指令用的挺多的,主要是针对构建过程中去执行命令,它也分Exec和shell两种方式
- RUN [“executable”, “param1”, “param2”]或者RUN command
- CMD:指定容器创建时的默认命令。(可以被覆盖)
- 用来指定启动容器时执行的命令参数,可以被Docker run中的参数覆盖,多个只有最后一个CMD参数会生效
- ENTRYPOINT:设置容器创建时的主要命令。(不可被覆盖)
- 也是用来用来指定启动容器时执行的命令参数,但是不可以被覆盖,CMD的参数会传给**
ENTRYPOINT
** ,所以可以和CMD搭配使用,ENTRYPOINT
配置固定的命令参数,CMD配置可变的命令参数
- 也是用来用来指定启动容器时执行的命令参数,但是不可以被覆盖,CMD的参数会传给**
- EXPOSE: 声明容器运行时监听的特定网络端口
- 用来暴露端口号的,如果不在DockerFile中指定,那也可以通过启动命令去指定,但必须得指定,不然会默认随机映射一个主机端口
- ENV:在容器内部设置环境变量
- 在容器内部设置环境变量,我的理解就是一个常量的配置,类似于配置JDK环境时往往都配置了一个JAVA_HOME的环境变量去指向JDK的目录
- ADD:将文件、目录或远程URL复制到镜像中
- 支持自动解压tar文件和从远程URL下载文件,我理解就是COPY的plus版本,但我更多时候使用的是COPY
- COPY:将文件或目录复制到镜像中
- 通常启动jar包的时候我会从外部指定配置文件,这时候就需要将外部的配置文件也打包到镜像中去,就可以使用该命令将外部的配置文件复制到镜像内去
- VOLUME:为容器创建挂载点或声明卷
- 为容器创建挂载点或声明卷,就是将容器内部的数据挂载到主机上,这样不至于容器被干掉了数据也没了,说白了就是持久化容器内部数据
- WORKDIR:设置后续指令的工作目录
- USER:指定后续指令的用户上下文
- ARG:定义在构建过程中传递给构建器的变量,可使用 “docker build” 命令设置
- ONBUILD:当该镜像被用作另一个构建过程的基础时,添加触发器
- STOPSIGNAL:设置发送给容器以退出的系统调用信号
- HEALTHCHECK:定义周期性检查容器健康状态的命令
- SHELL:覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令
DockerFile的构建(2024-12-28新增)
之前写的时候搞忘写DockerFile的构建命令了,后续自己来翻DockerFile指令才注意到,我们写完DockerFile后还只是一个文本文件,要想让它构建成一个镜像需要用到docker build -t 镜像名:tag DockerFile所在目录
DockerFile的编写目前来看难度不大,至少我作为一名后端开发感觉已经很够用了,但我很少单独使用DockerFile,一般都是配合docker compose一起使用,在下一篇文章将会详细介绍docker compose相关知识