Docker 镜像构建的最佳做法

这篇具有很好参考价值的文章主要介绍了Docker 镜像构建的最佳做法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、镜像分层

使用docker image history命令,可以看到用于在镜像中创建每个层的命令。

 1、 使用docker image history命令查看创建的入门镜像中的层。

docker image history getting-started

您应该得到如下所示的输出:

IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
a78a40cbf866        18 seconds ago      /bin/sh -c #(nop)  CMD ["node" "src/index.j⦠   0B                  
f1d1808565d6        19 seconds ago      /bin/sh -c yarn install --production            85.4MB              
a2c054d14948        36 seconds ago      /bin/sh -c #(nop) COPY dir:5dc710ad87c789593⦠  198kB               
9577ae713121        37 seconds ago      /bin/sh -c #(nop) WORKDIR /app                  0B                  
b95baba1cfdb        13 days ago         /bin/sh -c #(nop)  CMD ["node"]                 0B                  
<missing>           13 days ago         /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry⦠  0B                  
<missing>           13 days ago         /bin/sh -c #(nop) COPY file:238737301d473041⦠  116B                
<missing>           13 days ago         /bin/sh -c apk add --no-cache --virtual .bui⦠  5.35MB              
<missing>           13 days ago         /bin/sh -c #(nop)  ENV YARN_VERSION=1.21.1      0B                  
<missing>           13 days ago         /bin/sh -c addgroup -g 1000 node     && addu⦠  74.3MB              
<missing>           13 days ago         /bin/sh -c #(nop)  ENV NODE_VERSION=12.14.1     0B                  
<missing>           13 days ago         /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B                  
<missing>           13 days ago         /bin/sh -c #(nop) ADD file:e69d441d729412d24⦠  5.59MB   

每条线表示镜像中的一个层。此处的显示在底部显示底部,最新层在顶部。使用此选项,您还可以快速查看每个层的大小,帮助诊断大型镜像。

2、您将注意到有几行被截断。如果添加--no trunc标志,则将获得完整的输出。

docker image history --no-trunc getting-started

二、图层缓存

现在您已经看到了分层的作用,有一个重要的教训需要学习,以帮助减少容器映像的构建时间。一旦层更改,也必须重新创建所有下游层。
请查看您为入门应用程序创建的以下Dockerfile。

# syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]

回到镜像历史记录输出,您会看到Dockerfile中的每个命令都成为镜像中的新层。您可能记得,当您对镜像进行更改时,必须重新安装纱线依赖项。每次构建时都围绕相同的依赖项进行交付是没有多大意义的。
要修复它,您需要重新构造Dockerfile,以帮助支持依赖项的缓存。对于基于节点的应用程序,这些依赖项在package.json文件中定义。您可以首先只复制该文件,安装依赖项,然后复制其他所有文件。然后,只有在package.json发生更改时,才重新创建纱线依赖项。

1、更新Dockerfile以首先在package.json中复制,安装依赖项,然后复制中的所有其他内容。

# syntax=docker/dockerfile:1
FROM node:18-alpine
WORKDIR /app
COPY package.json yarn.lock ./
RUN yarn install --production
COPY . .
CMD ["node", "src/index.js"]

2、在与Dockerfile相同的文件夹中创建一个名为.dockerignore的文件,其中包含以下内容。
node_modules
.dockerignore文件是一种简单的方法,可以选择性地仅复制与映像相关的文件。你可以在这里阅读更多关于这方面的内容。在这种情况下,应该在第二个COPY步骤中省略node_modules文件夹,因为否则,它可能会覆盖由RUN步骤中的命令创建的文件。
3、使用docker Build构建新镜像。

docker build -t getting-started .

您应该看到如下输出。

[+] Building 16.1s (10/10) FINISHED
=> [internal] load build definition from Dockerfile
=> => transferring dockerfile: 175B
=> [internal] load .dockerignore
=> => transferring context: 2B
=> [internal] load metadata for docker.io/library/node:18-alpine
=> [internal] load build context
=> => transferring context: 53.37MB
=> [1/5] FROM docker.io/library/node:18-alpine
=> CACHED [2/5] WORKDIR /app
=> [3/5] COPY package.json yarn.lock ./
=> [4/5] RUN yarn install --production
=> [5/5] COPY . .
=> exporting to image
=> => exporting layers
=> => writing image     sha256:d6f819013566c54c50124ed94d5e66c452325327217f4f04399b45f94e37d25
=> => naming to docker.io/library/getting-started

4、现在,对src/static/index.html文件进行更改。例如,将<title>更改为“the Awesome Todo App”。
5、现在使用Docker Build-t getting started构建Docker镜像。再次。这一次,您的输出应该看起来有点不同。

[+] Building 1.2s (10/10) FINISHED
=> [internal] load build definition from Dockerfile
=> => transferring dockerfile: 37B
=> [internal] load .dockerignore
=> => transferring context: 2B
=> [internal] load metadata for docker.io/library/node:18-alpine
=> [internal] load build context
=> => transferring context: 450.43kB
=> [1/5] FROM docker.io/library/node:18-alpine
=> CACHED [2/5] WORKDIR /app
=> CACHED [3/5] COPY package.json yarn.lock ./
=> CACHED [4/5] RUN yarn install --production
=> [5/5] COPY . .
=> exporting to image
=> => exporting layers
=> => writing image     sha256:91790c87bcb096a83c2bd4eb512bc8b134c757cda0bdee4038187f98148e2eda
=> => naming to docker.io/library/getting-started

首先,您应该注意到构建速度快得多。并且,您将看到几个步骤正在使用以前缓存的层。推拉此镜像以及对其的更新也将快得多。

三、多阶段构建

多阶段构建是一个非常强大的工具,可以帮助使用多个阶段来创建镜像。它们有几个优点:

  • 将构建时依赖项与运行时依赖项分离
  • 通过仅传送应用程序运行所需的内容来减少总体镜像大小

1、Maven/Tomcat示例

在构建基于Java的应用程序时,需要JDK将源代码编译为Java字节码。然而,生产中不需要JDK。此外,您可能正在使用Maven或Gradle等工具来帮助构建应用程序。在最终的镜像中也不需要这些。多阶段构建帮助。 

# syntax=docker/dockerfile:1
FROM maven AS build
WORKDIR /app
COPY . .
RUN mvn package

FROM tomcat
COPY --from=build /app/target/file.war /usr/local/tomcat/webapps 

在这个例子中,您使用一个阶段(称为构建)来使用Maven执行实际的Java构建。在第二个阶段(从FROM tomcat开始),从构建阶段复制文件。最终镜像只是正在创建的最后一个阶段,可以使用--target标志覆盖它。

2、React示例

在构建React应用程序时,需要一个Node环境来将JS代码(通常是JSX)、SASS样式表等编译为静态HTML、JS和CSS。如果不进行服务器端渲染,则生产构建甚至不需要节点环境。您可以在静态nginx容器中运送静态资源。

# syntax=docker/dockerfile:1
FROM node:18 AS build
WORKDIR /app
COPY package* yarn.lock ./
RUN yarn install
COPY public ./public
COPY src ./src
RUN yarn run build

FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html

在前面的Dockerfile示例中,它使用node:18镜像执行构建(最大化层缓存),然后将输出复制到nginx容器中。文章来源地址https://www.toymoban.com/news/detail-776620.html

到了这里,关于Docker 镜像构建的最佳做法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Docker进阶:容器数据卷与Dockerfile构建镜像(发布)

    💖The Begin💖点点关注,收藏不迷路💖 1、完成数据持久化和共享数据,docker容器中的数据,同步到本地。 2、重要数据back_up 特点: 实时生效、数据卷可在容器之间共享和重用数据、数据卷中的更改不会包含在镜像更新中、数据卷的生命周期会一直延续到没有容器使用它为止

    2024年02月09日
    浏览(55)
  • Docker基础入门:容器数据卷与Dockerfile构建镜像(发布)

    💖The Begin💖点点关注,收藏不迷路💖 1、完成数据持久化和共享数据,docker容器中的数据,同步到本地。 2、重要数据back_up 特点: 实时生效、数据卷可在容器之间共享和重用数据、数据卷中的更改不会包含在镜像更新中、数据卷的生命周期会一直延续到没有容器使用它为止

    2024年02月10日
    浏览(55)
  • Docker 多主机部署:构建容器集群的最佳实践,助力高可用性与负载均衡

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月16日
    浏览(56)
  • Docker 仓库与注册表: 构建可靠的容器镜像生态系统

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月17日
    浏览(48)
  • Jenkins+GitLab+Docker搭建前端自动化构建镜像容器部署

    前言 🚀 需提前安装环境及知识点: 1、Docker搭建及基础操作 2、DockerFile文件描述 3、Jenkins搭建及基础点 🚀 目的: 将我们的前端项目打包成一个镜像容器并自动发布部署,可供随时pull访问 1、在当前项目的根目录创建Dockerfile文件并写入如下代码: 代码片段详细描述: 注意

    2024年02月05日
    浏览(74)
  • Docker(镜像、容器、仓库)工具安装使用命令行选项及构建、共享和运行容器化应用程序

    👧个人主页:@小沈YO. 😚小编介绍:欢迎来到我的乱七八糟小星球🌝 🔑本章内容:Docker工具安装使用、命令行选项及构建、共享和运行容器化应用程序时的主要步骤 记得 评论📝 +点赞👍 +收藏😽 +关注💞哦~ 提示:以下是本篇文章正文内容,下面案例可供参考 以下是在常

    2024年02月05日
    浏览(67)
  • 【Docker】如何编写Dockerfile,深入理解 Dockerfile:构建精简且高效的容器镜像

    Docker 是一种轻量级的容器化技术,使得应用程序和它们的依赖可以被打包到一个容器中,方便在不同环境中运行。Dockerfile 是用于定义 Docker 镜像的文本文件,其中包含了一系列的指令,这些指令描述了镜像中应该包含哪些内容和如何配置。 在开始编写 Dockerfile 之前,确保你

    2024年01月24日
    浏览(54)
  • Jenkins+GitLab+Docker搭建前端自动化构建镜像容器部署(无本地证书,映射证书)

    前言 🚀 需提前安装环境及知识点: 1、Docker搭建及基础操作 2、DockerFile文件描述 3、Jenkins搭建及基础点 🚀 目的: 将我们的前端项目打包成一个镜像容器并自动发布部署,可供随时pull访问 1、在当前项目的根目录创建Dockerfile文件并写入如下代码: 代码片段详细描述: 注意

    2024年02月15日
    浏览(60)
  • 如何在 Linux 命令行下玩转 Docker——如何使用 Dockerfile 来构建和运行容器镜像

    作者:禅与计算机程序设计艺术 Docker 是一款开源的容器化技术,它利用 Linux 内核的容器特性,将应用部署到独立的进程环境中。基于容器技术可以极大地提高开发者和运维人员的效率,降低部署、测试和生产环节中的成本,有效地实现云计算资源的弹性伸缩。 本文主要介绍

    2024年02月07日
    浏览(59)
  • windows部署python项目(以Flask为例)到docker,通过脚本一键生成dockerfile并构建镜像启动容器

    这里使用 pipreqs 进行依赖库的识别。使用 pipreqs 可以自动检索到当前项目下的所有组件及其版本,并生成 requirements.txt 文件。相比直接用pip freeze 命令,避免将整个python环境的依赖包写入。 在项目的当前目录中执行 pipreqs ./ --encoding=utf8 --force 这里使用的是一个基于flask项目,

    2023年04月08日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包