云原生架构与 GitOps 实战
王炜
前腾讯云 CODING 架构师
6217 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
云原生架构与 GitOps 实战
15
15
1.0x
00:00/00:00
登录|注册

01|如何将业务代码构建为容器镜像?

你好,我是王炜。从这节课开始,我们正式进入专栏的学习。这节课我们重点来看一下,如何将业务代码构建为容器镜像。
在工作中,我相信你经常会从同事那里听到这几个熟悉的词:Docker、镜像、镜像仓库、容器等等。
紧接着,你脑海中会浮现出几个问题:容器和镜像之间的关系是什么?如何将业务代码构建为容器镜像?容器镜像又是怎么存储和使用的呢?
别着急,这节课,我会带你从 0 开始认识作为云原生基石的容器镜像,让你在实践中理解镜像和容器的概念,也在这个过程中构建你的第一个容器镜像。

初识容器镜像

在开始实践之前,你需要准备一台电脑,推荐 Linux 或者 macOS,并安装好 Docker,具体流程你可以参考官网。Windows 系统也同样适用,只是需要注意一些操作上的差异。
接下来,我们在本地拉取一个镜像并将它运行起来,看看镜像到底能做什么。
我们首先要用下面这个命令从官方镜像仓库中拉取一个镜像到本地,这是我提前制作好的演示镜像。
$ docker pull lyzhang1999/hello-world-flask:latest
提醒一下,如果拉取镜像失败,推荐你开通一台国内云厂商的香港 Linux 主机进行接下来的实验。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了如何将业务代码构建为容器镜像。作者首先介绍了容器镜像的概念和基本操作,包括拉取镜像、运行镜像、进入容器内部等。接着,作者详细讲解了如何构建自己的镜像,以Python编写的Flask Web应用为例,包括编写app.py和requirements.txt文件,以及创建Dockerfile文件来描述镜像的构建过程。通过这些步骤,读者可以了解如何将业务代码打包成容器镜像,并且能够在本地进行实际操作。整体来说,本文内容简洁清晰,适合初学者快速了解容器镜像的基本概念和操作流程。 文章还总结了构建容器镜像的基本套路,包括使用基础镜像、配置工作目录、复制源码、下载依赖和配置启动命令等步骤。此外,还介绍了如何上传和分享镜像到Docker Hub,以及思考题引发读者思考。整体而言,本文内容涵盖了从构建容器镜像到分享的全流程,为读者提供了全面的指导和思考。 通过本文,读者可以快速了解Docker镜像和容器的基本概念,以及如何将业务代码构建为容器镜像,为进一步学习Docker和容器化技术打下基础。同时,文章还提供了构建容器镜像的基本套路和分享镜像的方法,为读者提供了实用的技术指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云原生架构与 GitOps 实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(13)

  • 最新
  • 精选
  • 陈志成
    因为 docker 镜像是分层的,先 COPY requirements.txt 再安装依赖,这样 COPY,install 这两层不包含代码文件,这样整体的镜像大小相对更小。

    作者回复: 👍🏻 非常正确!

    2022-12-12归属地:广东
    4
    29
  • 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归属地:广东
    2
    6
  • Dexter
    老师讲一下最新的buildkit和之前docker built之间的异同

    作者回复: 对大的区别是 BuildKit 支持并行构建,标准的 docker build 命令是串行构建的。当然它还有其他很多的特性,比如自动垃圾回收、更高效的缓存(支持从远端仓库读取缓存)、不需要 Root 特权等等。 BuildKit 其实不仅仅可以用来构建镜像,最近比较火 Dagger 项目用 BuildKit 做 CI/CD,非常有意思。

    2022-12-13归属地:广东
    5
  • 栖枝
    思考题:因为镜像是按照分层构建的,如果每一层的文件没有变化,是不会重复构建的,会使用之前构建好的层,加快构建速度

    作者回复: ✅

    2022-12-14归属地:广东
    4
  • Layne
    docker在构建对象的时候,是有个分层的概念,可以通过指令 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 15b89d9d304cee1ee8377bebbf657ff7c5ddbef3fab8772e9dc0a6b674906160
    2023-11-08归属地:北京
    1
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部