04|创建容器镜像:如何编写正确、高效的Dockerfile
镜像的内部机制是什么
- 深入了解
- 翻译
- 解释
- 总结
Dockerfile是创建容器镜像的关键,记录了构建指令,如选择基础镜像、拷贝文件、运行脚本等。每个指令生成一个Layer,按顺序执行这些指令,最终创建出一个新的镜像。镜像内部由多个Layer组成,通过Union FS技术合并在一起,实现共享和节约资源。Dockerfile的基本结构和使用方法得到了清晰的解释,读者可以通过实例了解如何使用Dockerfile创建镜像。文章通过生动的比喻和实例演示,使读者能够快速了解Docker镜像的内部机制和Dockerfile的作用,为读者提供了正确、高效地编写Dockerfile制作容器镜像的方法。 文章还介绍了Dockerfile的常用指令和最佳实践,包括选择基础镜像、拷贝文件、运行Shell命令、声明服务端口号等。此外,还详细讲解了docker build的用法,包括构建上下文、.dockerignore文件的使用以及镜像标签的添加。最后,文章提供了Dockerfile示例和课下作业,引导读者进一步学习高级技巧。 总之,本文通过清晰的解释和实例演示,帮助读者快速了解Docker镜像的内部结构和Dockerfile的编写方法,为读者提供了丰富的学习资源和思考题。
《Kubernetes 入门实战课》,新⼈⾸单¥59
全部留言(39)
- 最新
- 精选
- includestdio.h关于指令生成层的问题需要再补充哈:只有 RUN, COPY, ADD 会生成新的镜像层,其它指令只会产生临时层,不影响构建大小,官网的镜像构建最佳实践里面有提及 https://docs.docker.com/develop/develop-images/dockerfile_best-practices/ Only the instructions RUN, COPY, ADD create layers. Other instructions create temporary intermediate images, and do not increase the size of the build.
作者回复: many thanks。
2022-06-29268 - 陈卧虫1. 创建和修改文件:通过在写时复制实现;删除文件:通过白障实现,也就是通过一个文件记录已经被删除的文件。 2. 镜像分层的好处:可以重复使用未被改动的layer,每次修改打包镜像,只需重新构建被改动的部分
作者回复: great
2022-06-2917 - 风飘,吾独思1.容器最上一层是读写层,镜像所有的层是只读层。容器启动后,Docker daemon会在容器的镜像上添加一个读写层。 2.容器分层可以共享资源,节约空间,相同的内容只需要加载一份份到内存。
作者回复: great
2022-06-2912 - hiDaLao请问下docker pull时输出的layer的值为什么和docker inspect里面layer信息的sha256的值不一样呢?
作者回复: docker pull的layer是压缩数据的sha256,docker inspect是解压后数据的sha256。
2022-07-1911 - 奕ENTRYPOINT 和 CMD 的本质区别是什么的? 什么时候用 ENTRYPOINT 什么时候用 CMD?
作者回复: 看小贴士应该就能够理解它们两个的区别了,ENTRYPOINT是执行的命令, CMD是参数。 感觉这应该是docker当初的设计小失误,其实用哪个没有什么太严格的区分。
2022-06-2929 - CK还是没太理解构建上下文的意思,是指docker build的时候指定路径?比如文中示例docker build -f Dockerfile.busybox . 是一个.表示,我执行文末的课下作业时,显示COPY failed: file not found in build context or excluded by .dockerignore: stat default.conf: file does not exist,是不是docker build时的路径没指定好呢
作者回复: “上下文”这个词确实很难理解,最好直接用英文context,就是要打包进镜像的文件所在的目录。 如果copy时在这个目录里找不到文件,当然就会报错了。
2022-06-308 - Geek_666217构建包如果出错了,注意注释和内容不要再同一行,会将注释视为参数
作者回复: 是的,Dockerfile的注释比较特殊,必须的单独一行,不能在行尾。
2022-09-29归属地:北京6 - Geek_f20da9老师有时间帮忙看一下,不知道写的对不对。 dockerfile常用参数: 1.ARG:镜像层的环境变量 2.FROM:拉取基础镜像 3.COPY:拷贝文件 4.ADD:拷贝文件、URL、压缩文件等 5.EVN:镜像层和容器层参数 6.EXPOSE:暴露容器内部端口给外部使用 7.RUN:执行shell指令 8.CMD:构建完成时执行的指令 思考题: 1.docker采用UNION FS文件系统,将文件系统分为上层和下层。即上层为容器层,下层为镜像层。如果下层有修改,运行容器时,上层会同步修改。如果上层有数据修改(即容器层数据修改),不会影响到下层(即镜像层)。 2.好处:共享已存在的layer,如果有新的数据加入,只会增量在最上层新增layer层。减少了网络传输等一些成本。
作者回复: 写的很好。
2022-09-17归属地:北京25 - 每天晒白牙chatgpt的回答 1.容器运行时需要写入数据,但是Docker镜像的分层技术是只读的,这会导致冲突。为了解决这个问题,Docker采用了一种称为“容器层”的技术,用于在镜像的基础上创建一个可写的文件系统层,用于存储容器中的数据和修改。 具体来说,当创建一个新的Docker容器时,Docker会在镜像的基础上创建一个可写的文件系统层,称为“容器层”,用于存储容器中的数据和修改。容器层会覆盖镜像中相应的文件系统层,从而实现容器的个性化定制和隔离。 容器层是可写的,因此容器运行时可以向其中写入数据和修改文件。这些修改都是存储在容器层中的,而不会影响到镜像中的文件系统层。这样可以保证镜像的不变性和可重复性,从而方便镜像的管理和使用。 需要注意的是,容器层是临时的,当容器被删除时,容器层也会被删除。因此,容器层中存储的数据和修改都是临时的,不会对镜像产生影响。如果需要将容器中的数据持久化保存,可以使用Docker的数据卷或者绑定挂载等技术 2.镜像的分层结构带来了以下好处: 减小镜像的大小:镜像的分层结构可以将镜像拆分成多个只读的文件系统层,这些层可以共用相同的Layer,从而减小镜像的大小,提高镜像的构建和传输效率。 提高镜像的可重复性:镜像的分层结构可以保证镜像的不变性和可重复性,因为每个文件系统层都是只读的,不会被修改。这样可以方便镜像的管理和使用。 方便镜像的定制和扩展:镜像的分层结构可以方便镜像的定制和扩展,因为可以在镜像的基础上创建一个可写的容器层,用于存储容器中的数据和修改。这样可以实现容器的个性化定制和隔离。 提高镜像的安全性:镜像的分层结构可以提高镜像的安全性,因为每个文件系统层都是只读的,不会被修改。这样可以避免恶意软件或攻击者修改镜像中的文件,从而提高镜像的安全性。 方便镜像的共享和复用:镜像的分层结构可以方便镜像的共享和复用,因为可以将多个镜像共用相同的Layer,从而减小镜像的大小,提高镜像的构建和传输效率。这样可以方便镜像的共享和复用,提高镜像的可用性和可维护性。
作者回复: awesome,不过chatGPT使用也要适度,当心它一本正经地胡说八道。
2023-05-17归属地:北京4 - 虢國技醬"Dockerfile 里,第一个指令必须是 FROM,用来选择基础镜像" 一直有个疑问,写Dockerfile都必须有个基础镜像,那么依赖的这些基础镜像 的最原始镜像是怎么制作的? 这里研究了一下文档,同步给大家: https://docs.docker.com/build/building/base-images/#create-a-simple-parent-image-using-scratch 两个方式: 1、Create a full image using tar 2、Create a simple parent image using scratch 特别是 scratch 这个: You can use Docker’s reserved, minimal image, scratch, as a starting point for building containers. Using the scratch “image” signals to the build process that you want the next command in the Dockerfile to be the first filesystem layer in your image. While scratch appears in Docker’s repository on the hub, you can’t pull it, run it, or tag any image with the name scratch. Instead, you can refer to it in your Dockerfile.
作者回复: great
2023-03-10归属地:广东4