01|如何将业务代码构建为容器镜像?
初识容器镜像
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了如何将业务代码构建为容器镜像。作者首先介绍了容器镜像的概念和基本操作,包括拉取镜像、运行镜像、进入容器内部等。接着,作者详细讲解了如何构建自己的镜像,以Python编写的Flask Web应用为例,包括编写app.py和requirements.txt文件,以及创建Dockerfile文件来描述镜像的构建过程。通过这些步骤,读者可以了解如何将业务代码打包成容器镜像,并且能够在本地进行实际操作。整体来说,本文内容简洁清晰,适合初学者快速了解容器镜像的基本概念和操作流程。 文章还总结了构建容器镜像的基本套路,包括使用基础镜像、配置工作目录、复制源码、下载依赖和配置启动命令等步骤。此外,还介绍了如何上传和分享镜像到Docker Hub,以及思考题引发读者思考。整体而言,本文内容涵盖了从构建容器镜像到分享的全流程,为读者提供了全面的指导和思考。 通过本文,读者可以快速了解Docker镜像和容器的基本概念,以及如何将业务代码构建为容器镜像,为进一步学习Docker和容器化技术打下基础。同时,文章还提供了构建容器镜像的基本套路和分享镜像的方法,为读者提供了实用的技术指导。
《云原生架构与 GitOps 实战》,新⼈⾸单¥59
全部留言(13)
- 最新
- 精选
- 陈志成因为 docker 镜像是分层的,先 COPY requirements.txt 再安装依赖,这样 COPY,install 这两层不包含代码文件,这样整体的镜像大小相对更小。
作者回复: 👍🏻 非常正确!
2022-12-12归属地:广东429 - Daniel首先感谢老师的文章,比较适合我这种 先感受,再理论(先feel it,再know it)的实战派。 问题中的"所有的文件" 可能是一个动态变化的“一堆文件”,因为后期随着项目的不断迭代,里面会引进一些其它的文件,因此这个所谓的“所有文件”可能是一个动态文件, 而 COPY requirements.txt 在今后的镜像构建里是一个静态的单一文件,因为只有'requirements.txt'。 docker 在构建镜像的时候,dockerfile的会每一个命令会构建一个层, 而在构建的时候是有一个缓存的特点,而这个缓存机制如果是遇到发生变化的层,即使后面的层没有发生变化,也会重新构建,进而并不会用到缓存。 所以,把不变的层放在前面,变的层放在后面,就会让变化之前的层利用到构建镜像的缓存机制,来加速构建镜像的时间。 不知道我说的对不,还请老师指点,我之前有遇到过这个问题。
作者回复: 感谢你对课程的认可,我个人也比较喜欢从实战学习一门技术。 回到你的问题,从缓存的角度上来说是这样的。所以在构建镜像的时候要注意把经常会变化以及不变的区分开,这样可以最大程度利用缓存,加速镜像构建镜像。
2022-12-12归属地:广东12 - Librant跟着老师一步一个脚印,github.com/librant/git-ops-learn 每章节的详细实践,可以大家一起学习分享,觉得不错的可以帮忙 star一下,我会坚持到课程结束嘞
作者回复: 太棒了!已 Star。
2022-12-20归属地:广东26 - Dexter老师讲一下最新的buildkit和之前docker built之间的异同
作者回复: 对大的区别是 BuildKit 支持并行构建,标准的 docker build 命令是串行构建的。当然它还有其他很多的特性,比如自动垃圾回收、更高效的缓存(支持从远端仓库读取缓存)、不需要 Root 特权等等。 BuildKit 其实不仅仅可以用来构建镜像,最近比较火 Dagger 项目用 BuildKit 做 CI/CD,非常有意思。
2022-12-13归属地:广东5 - 栖枝思考题:因为镜像是按照分层构建的,如果每一层的文件没有变化,是不会重复构建的,会使用之前构建好的层,加快构建速度
作者回复: ✅
2022-12-14归属地:广东4 - Laynedocker在构建对象的时候,是有个分层的概念,可以通过指令 docker inspect 185eac234bc3。可以看到对应的分层RootFS信息。所以在编写构建语句的时候,需要考虑静态和动态信息,这样可以减少存储大小,静态信息对应的分层是不需要重新生成的。
作者回复: 正确!最大程度利用缓存。
2022-12-30归属地:广东1 - 范飞扬有个小建议,文中shell命令可以去掉前面的$符号吗,因为按“复制代码”的时候也会把$复制进来。《k8s入门实战》就是我说的这样的
作者回复: 感谢,很好的建议~
2023-01-24归属地:广西 - 码小呆因为语句是自上而下执行的,如果都copy文件,那么有些文件的依赖没有安装,那么执行就会保持,镜像就无法构建成功,会失败,所以需要先安装依赖,在copy所有文件
作者回复: 可以实践一下试试看~
2022-12-13归属地:广东 - ghostwritten应用: - python flask demo - go gin demo - nodejs - shell........ docker login -u <user> -p <passwd> url docker pull & docker push docker tag <image>:tag <rep>/<image>:new-tag docker build -t flask:v1.0.0 -f Dockerfile . docker run -ti -p 8080:5000 -v /app/data:/app/data -v /app/config:/app/config --name flask-demo hello-world-flask:latest 编写 Dockerfile: https://smoothies.com.cn/docker-docs/Docker/Dockerfile/ 镜像构建工具:[buildah](https://ghostwritten.blog.csdn.net/article/details/128024372) 镜像搬运工具:[skopeo](https://ghostwritten.blog.csdn.net/article/details/127342981) 私有镜像仓库:registry、VMware harbor、 jfrog artifactory、SUSE Portus、Sonatype Nexus 公共镜像仓库:docker.io、quay.io....... 无守护进程容器引擎:[podman](https://blog.csdn.net/xixihahalelehehe/article/details/121611523)2022-12-20归属地:北京2
- dj自己 docker build 容器跑不起来 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 已经执行 了 $ docker run -d -p 8000:5000 hello-word-flask 15b89d9d304cee1ee8377bebbf657ff7c5ddbef3fab8772e9dc0a6b6749061602023-11-08归属地:北京1