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

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