云原生架构与 GitOps 实战
王炜
前腾讯云 CODING 架构师
5442 人已学习
新⼈⾸单¥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
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《云原生架构与 GitOps 实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(9)

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

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

    归属地:广东
    4
    27
  • Daniel
    首先感谢老师的文章,比较适合我这种 先感受,再理论(先feel it,再know it)的实战派。 问题中的"所有的文件" 可能是一个动态变化的“一堆文件”,因为后期随着项目的不断迭代,里面会引进一些其它的文件,因此这个所谓的“所有文件”可能是一个动态文件, 而 COPY requirements.txt 在今后的镜像构建里是一个静态的单一文件,因为只有'requirements.txt'。 docker 在构建镜像的时候,dockerfile的会每一个命令会构建一个层, 而在构建的时候是有一个缓存的特点,而这个缓存机制如果是遇到发生变化的层,即使后面的层没有发生变化,也会重新构建,进而并不会用到缓存。 所以,把不变的层放在前面,变的层放在后面,就会让变化之前的层利用到构建镜像的缓存机制,来加速构建镜像的时间。 不知道我说的对不,还请老师指点,我之前有遇到过这个问题。

    作者回复: 感谢你对课程的认可,我个人也比较喜欢从实战学习一门技术。 回到你的问题,从缓存的角度上来说是这样的。所以在构建镜像的时候要注意把经常会变化以及不变的区分开,这样可以最大程度利用缓存,加速镜像构建镜像。

    归属地:广东
    12
  • Librant
    跟着老师一步一个脚印,github.com/librant/git-ops-learn 每章节的详细实践,可以大家一起学习分享,觉得不错的可以帮忙 star一下,我会坚持到课程结束嘞

    作者回复: 太棒了!已 Star。

    归属地:广东
    2
    5
  • Dexter
    老师讲一下最新的buildkit和之前docker built之间的异同

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

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

    作者回复: ✅

    归属地:广东
    4
  • Layne
    docker在构建对象的时候,是有个分层的概念,可以通过指令 docker inspect 185eac234bc3。可以看到对应的分层RootFS信息。所以在编写构建语句的时候,需要考虑静态和动态信息,这样可以减少存储大小,静态信息对应的分层是不需要重新生成的。

    作者回复: 正确!最大程度利用缓存。

    归属地:广东
    1
  • 范飞扬
    有个小建议,文中shell命令可以去掉前面的$符号吗,因为按“复制代码”的时候也会把$复制进来。《k8s入门实战》就是我说的这样的

    作者回复: 感谢,很好的建议~

    归属地:广西
  • 码小呆
    因为语句是自上而下执行的,如果都copy文件,那么有些文件的依赖没有安装,那么执行就会保持,镜像就无法构建成功,会失败,所以需要先安装依赖,在copy所有文件

    作者回复: 可以实践一下试试看~

    归属地:广东
  • 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)
    归属地:北京
    2
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部