看到同事写的Dockerfile后,我笑了

先放个链接,万一有人关注呢

优质文章推荐

↓ ↓ ↓ ↓ 

Linux系统监控工具推荐

Docker常用命令总结:运维必知必会

Linux系统安全:IPS入侵防御系统

CentOS再见!拥抱Rocky ro Alma

一文搞懂Linux下的神级编辑器:Vim

一、Dockerfile简介
Dockerfile是用来构建Docker镜像的文本文件,包含了一条条的指令(Instruction)来告诉Docker如何生成镜像。
Docker镜像是由文件系统叠加而成的,系统的每层可以对应Dockerfile中的一条指令。比如安装软件用RUN指令,拷贝文件用COPY指令。每执行一条指令,就会生成对应的镜像层。所有指令执行完成后,整个Dockerfile所对应的镜像也就构建完成了。
使用Dockerfile可以让镜像构建过程具备重复性,可以对镜像进行版本管理。通过Dockerfile我们可以管理镜像的所有组件parts,实现自动化的镜像构建和发布。
二、Dockerfile的作用
1、实现自动化构建
使用Dockerfile,我们可以通过代码定制镜像,并实现自动化构建和发布,提高效率。由于Dockerfile将镜像的生成过程编写成了代码,所以可以进行代码管理、可重复利用,并实现自动化测试、构建和部署。
2、实现镜像定制
Dockerfile允许我们充分定制自己的镜像,可以指定镜像的每个组件,从基础镜像一直到运行环境、配置、文件等。我们只需要在Dockerfile中用简单的指令描述各层需安装什么东西、放什么文件,Docker就能自动构建定制的镜像。
3、实现标准化和最佳实践
Dockerfile将镜像的生成过程代码化,使得镜像构建过程标准化。团队成员只要按照Dockerfile即可重现相同环境,使得研发、测试和运维采用统一的镜像构建流程。
Dockerfile还可实现最佳实践,如将经常变化的东西放在后面层,将静态不变内容放前面层等,以提高镜像构建的效率。
三、Dockerfile的应用场景
1、Web应用开发
对于Web应用开发,可以用Dockerfile定义包含应用代码和所有运行时依赖的docker镜像。通过Dockerfile可以确保开发环境、测试环境和产品环境下都是相同的运行环境。
2、持续集成持续交付(CI/CD)
Dockerfile可以和CI/CD集成,实现应用从构建到测试再到生产环境的流程自动化。开发人员将应用Dockerfile提交给代码仓库后,通过CI/CD后续的编译、测试、审核、部署等流程都可以自动化完成。
3、机器学习模型部署
对于机器学习模型,可以用Dockerfile将模型代码、模型依赖的软件环境、配置等全部包含在镜像中。这样就能够在任何环境下快速部署该机器学习模型。
4、多层软件堆栈部署
复杂软件可能需要部署LAMP、LNMP这类多层软件架构。使用Dockerfile可以通过多阶段构建的方式,一步步构建出包含完整软件堆栈的镜像。
四、Dockerfile的创建
1、新建Dockerfile文件
Dockerfile是一个文本文件,需要命名为Dockerfile,没有文件尾缀。可以使用代码编辑器新建Dockerfile文件进行编辑。
2、编写Dockerfile内容
Dockerfile内容包括了多条指令、参数、环境变量等信息。常见的有以下几类指令:
FROM:定义所需的基础镜像
LABEL:添加镜像信息如维护者、版本等元数据
COPY:将本地文件拷贝到镜像中
RUN:在镜像内执行命令行命令
EXPOSE:声明容器运行时监听的端口
ENV:设置环境变量
CMD:容器启动时默认执行的命令
编写时,每条指令都会建立镜像的一个新的层。按照软件需要从下依次往上编排不同的指令。
3、构建镜像
编写完成Dockerfile后,使用docker build 命令进行镜像构建,生成定制的镜像。
五、Dockerfile常用指令详解
Dockerfile有许多指令,这些指令不区分大小写,每条指令都会建立镜像的一个新的层,常用的有以下几种:
1、FROM
FROM是必备的第一条指令,用于定义使用的基础镜像,后续指令都依赖于该基础镜像进行堆栈。如果不指定标签,默认使用latest版本镜像。
示例:
FROM centos FROM centos:7
2、LABEL
LABEL用于添加镜像的元数据,如镜像制作者、版本、描述等信息。
示例:
LABEL maintainer="SvenDowideit@home.org.au" LABEL version="1.0" LABEL description="This text illustrates \ that label-values can span multiple lines."
3. RUN
RUN用于执行命令行命令,常用于安装软件包、运行安装向导或进行任何镜像构建中需要的配置操作。
示例:
RUN yum install -y vim RUN apt-get update && apt-get install -y perl pwgen --no-install-recommends
4. COPY
COPY用于将文件从构建上下文目录复制到镜像内。其中上下文目录指docker build命令所给定的目录。
示例:
COPY package.json /usr/src/app/ COPY hom* /mydir/ COPY hom?.txt /mydir/
5. ADD
ADD和COPY类似,但ADD有些额外功能,如自动解压压缩文件,支持从远程URL提取文件。
示例:
ADD http://example.com/big.tar.xz /usr/src/things/ ADD hom*.txt /mydir/
6. CMD
CMD用于设置容器默认的启动命令,每个Dockerfile只能有一条CMD命令。如果指定了多个,只有最后一条会生效。
示例:
CMD ["/usr/bin/find", "/"] CMD /bin/bash
7. EXPOSE
EXPOSE用于声明容器在运行时监听的端口。这只是一个声明,不会自动在主机上开启该端口。
示例:
EXPOSE 80/tcp EXPOSE 80/udp
8. ENV
ENV用于设置环境变量,这些变量可以在后续指令中被直接调用。
示例:
ENV MY_NAME="John Doe" ENV MY_VERSION 1.0
9. ARG
ARG用于定义只在构建过程中使用的参数,构建完成后参数不会存在于镜像里。
示例:
ARG user1=someuser ARG buildno=1
10. VOLUME
VOLUME用于创建一个可以从本地主机或其他容器挂载的挂载点。
示例:
VOLUME ["/data"]
11. USER
USER用于切换到指定用户而不必使用root用户来执行后续命令。
示例:
USER daemon
12. WORKDIR
WORKDIR用于切换工作目录,以后各层的当前目录就被改为指定的目录。
示例:
WORKDIR /app WORKDIR src/app
13. ONBUILD
ONBUILD用于设置镜像触发器,当该镜像被用做其他镜像的基础镜像时,会触发指定的操作指令。
示例:
ONBUILD ADD . /app/src ONBUILD RUN /usr/local/bin/python-build --dir /app/src
以上是Dockerfile的常见指令,还有许多其他指令可用。通过这些指令的灵活组合,可以构建出适合自己需求的Docker镜像。
六、Dockerfile参数和环境变量
1、参数
许多指令都可以使用参数,参数可以让这些指令更灵活地定制镜像。比如RUN指令可以通过参数指定安装软件时的版本或下载地址等。
2、环境变量
环境变量可以用ENV定义,然后在后续所有指令中直接使用。环境变量使得Dockerfile更易维护,尤其是需要频繁修改的配置项可以集中放在环境变量中。
七、Dockerfile最佳实践
1、每层精简
每条指令应精简地完成一个操作,尽量减少层数。过多层会增加构建时间、镜像大小。

例如:

不推荐:

RUN apt-get update RUN apt-get install -y curl RUN apt-get install -y python

推荐:

RUN apt-get update && apt-get install -y curl python

2、将变更频繁的指令放在下面
将不频繁更改的指令放在上层,频繁更改的放下层。利用镜像缓存加速构建。

例如:

# 上层为不变基础环境 FROM ubuntu RUN apt-get update && apt-get install -y python # 下层为可能会变化的应用代码 ... COPY . /app RUN pip install -r requirements.txt
3、多阶段构建
充分利用多阶段构建,一个Dockerfile中使用多个FROM,将编译、测试等过程INCLUDE进来,而只拷贝最终需要的成果到最后的镜像中。

例如:

FROM maven AS build COPY src /usr/src/app/src RUN mvn package 
FROM tomcat COPY --from=build /usr/src/app/target/myapp.jar /usr/local/tomcat/weba

4、合并多条命令成一行
原则上应该每层只有一条指令,如果确实需要,可以使用 && 将多条命令合并为一行。
例如:
RUN apt-get update && apt-get install -y perl \&& cp .bashrc ~/.bashrc \  && apt-get clean
5、使用参数和环境变量
充分利用参数和环境变量,使镜像能够灵活配置和便于维护。
例如:
ARG VERSION=latestENV NGINX_VERSION ${VERSION}RUN apt-get install -y nginx=${NGINX_VERSION}
6、保持简单
镜像应保持最小化和专一,避免在一个Dockerfile中安装太多不相关的内容。保持Dockerfile简单、可维护。
不推荐:
FROM ubuntu RUN apt-get update && apt-get install -y python php nodejs nginx vim
推荐:
FROM python RUN pip install flask FROM php RUN install composer FROM nodejs COPY . /app RUN npm install

八、总结
Dockerfile是自动化构建Docker镜像的配置文件,包含了一条条指令来指定每个镜像层的内容,从而实现镜像的定制化。使用Dockerfile可以让镜像构建过程标准化、自动化、可重复并实现最佳实践。
Dockerfile通过简单的指令就能构建出包含应用程序及其所有依赖环境的镜像,非常适合用于Web应用、机器学习模型、多层软件堆栈的部署等场景。掌握了Dockerfile的使用技巧,就可以为自己的应用快速构建出适用的Docker镜像。

来不及解释了,快上车!(进群看公告)

欢迎新的小伙伴加入!在这里,我们鼓励大家积极参与群内讨论和交流,分享自己的见解和经验,一起学习和成长。同时,也欢迎大家提出问题和建议,让我们不断改进和完善这个平台。

                 点个在看,你最好看!

请使用浏览器的分享功能分享到微信等