”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > CKA 完整课程日 ulti Stage Docker 构建

CKA 完整课程日 ulti Stage Docker 构建

发布于2024-11-04
浏览:487

CKA Full Course Day ulti Stage Docker Build

在这篇博文中,我们将探索 Docker 并逐步使用简单的 Nginx 应用程序创建多阶段 Docker 构建。如果你刚刚开始使用 Docker,别担心,我会一步一步分解所有内容,以便你可以跟着做!

Dockerfile

这是我们将使用的 Dockerfile:

FROM node:18-alpine AS installer

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build

FROM nginx:latest AS deployer

COPY --from=installer /app/build /usr/share/nginx/html

解压 Dockerfile

现在,让我们一步步解开这个 Dockerfile 中发生的事情:

1. 来自节点:18-alpine AS安装程序

此行从 Docker Hub 中提取官方 Node.js 镜像(Alpine Linux 上的版本 18)。将 Docker Hub 视为一个镜像库。通过使用这一行,我们指定要使用 Node.js 作为构建第一阶段的基础镜像。

2. WORKDIR /应用程序

该命令将容器内的工作目录设置为/app。您可以将其视为在容器内为您的应用程序创建一个专用文件夹,类似于您在桌面上组织文件的方式。

3. 复制包*.json ./

在这里,我们将 package.json 和 package-lock.json 文件从本地目录复制到容器的工作目录。这些文件包含有关我们的应用程序所需的依赖项的信息。

4. 运行 npm install

此命令运行 npm install,它会安装 package.json 中指定的所有依赖项。

5. 复制。 .

这一行将其余的应用程序文件复制到容器中。它将本地目录中的所有内容带到容器内的 /app 目录中。

6. RUN npm run build

现在我们使用命令 npm run build 编译我们的应用程序。此步骤通常将我们的代码(在本例中通常是 React)转换为静态包,准备好提供给用户。此命令的输出将放置在 /app 内的构建目录中。

7. 来自 nginx:最新 AS 部署程序

在这一行中,我们切换到一个新的基础镜像:Nginx。 Nginx 是一个功能强大的 Web 服务器,可以提供静态文件,就像我们刚刚构建的那样。这是多阶段构建过程第二阶段的开始。

8. COPY --from=installer /app/build /usr/share/nginx/html

在这里,我们将前一阶段(安装程序)构建的应用程序文件复制到 Nginx 服务目录中。 --from=installer 标志告诉 Docker 从我们刚刚定义的安装程序阶段获取文件。

运行你的 Docker 容器

设置好 Dockerfile 后,您可以使用以下命令构建并运行 Docker 容器:

docker build -t your-app-name .
docker run -dp 3000:80 your-app-name

确保将 your-app-name 替换为您选择的名称。 -dp 标志将分离您的容器并将主机上的端口 3000 映射到容器中的端口 80,从而允许您通过 http://localhost:3000 访问您的应用程序。

结论

这就是你得到的!您刚刚创建了一个多阶段 Docker 构建,该构建使用 Nginx 将您的应用程序从开发带到生产。如果您对此过程有任何疑问或想法,请随时在下面发表评论!

陷阱:需要注意的事项

使用此设置时的一个常见问题是忘记映射正确的端口号。 Nginx 通常侦听容器内的端口 80,但如果您尝试访问本地计算机上的应用程序,则需要将正确的端口从容器转发到您的计算机。例如,如果您想访问 localhost:3000 上的应用程序,则需要使用 -p 3000:80 标志运行容器,以将计算机上的端口 3000 映射到容器中的端口 80。

错过这一步,您会发现自己想知道为什么一切都构建得很完美,但您无法在浏览器中访问该应用程序!


标签和提及

@piyushsachdeva
第三天视频

版本声明 本文转载于:https://dev.to/lloydrivers/cka-full-course-2024-day-340-multi-stage-docker-build-2ld3?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Python不会对超范围子串切片报错的原因
    Python不会对超范围子串切片报错的原因
    在python中用索引切片范围:二重性和空序列索引单个元素不同,该元素会引起错误,切片在序列的边界之外没有。这种行为源于索引和切片之间的基本差异。索引一个序列,例如“示例” [3],返回一个项目。但是,切片序列(例如“示例” [3:4])返回项目的子序列。索引不存在的元素时,例如“示例” [9] ...
    编程 发布于2025-05-20
  • 表单刷新后如何防止重复提交?
    表单刷新后如何防止重复提交?
    在Web开发中预防重复提交 在表格提交后刷新页面时,遇到重复提交的问题是常见的。要解决这个问题,请考虑以下方法: 想象一下具有这样的代码段,看起来像这样的代码段:)){ //数据库操作... 回声“操作完成”; 死(); } ?> ...
    编程 发布于2025-05-20
  • 在JavaScript中如何获取实际渲染的字体,当CSS字体属性未定义时?
    在JavaScript中如何获取实际渲染的字体,当CSS字体属性未定义时?
    Accessing Actual Rendered Font when Undefined in CSSWhen accessing the font properties of an element, the JavaScript object.style.fontFamily and objec...
    编程 发布于2025-05-20
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-05-20
  • 如何简化PHP中的JSON解析以获取多维阵列?
    如何简化PHP中的JSON解析以获取多维阵列?
    php 试图在PHP中解析JSON数据的JSON可能具有挑战性,尤其是在处理多维数组时。要简化过程,建议将JSON作为数组而不是对象解析。执行此操作,将JSON_DECODE函数与第二个参数设置为true:[&&&&& && &&&&& json = JSON = JSON_DECODE($ j...
    编程 发布于2025-05-20
  • 编译器报错“usr/bin/ld: cannot find -l”解决方法
    编译器报错“usr/bin/ld: cannot find -l”解决方法
    错误:“ usr/bin/ld:找不到-l “ 此错误表明链接器在链接您的可执行文件时无法找到指定的库。为了解决此问题,我们将深入研究如何指定库路径并将链接引导到正确位置的详细信息。添加库搜索路径的一个可能的原因是,此错误是您的makefile中缺少库搜索路径。要解决它,您可以在链接器命令中添加...
    编程 发布于2025-05-20
  • 我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    将我的加密库从mcrypt升级到openssl 问题:是否可以将我的加密库从McRypt升级到OpenSSL?如果是这样,如何?答案:是的,可以将您的Encryption库从McRypt升级到OpenSSL。可以使用openssl。附加说明: [openssl_decrypt()函数要求iv参...
    编程 发布于2025-05-20
  • 如何在其容器中为DIV创建平滑的左右CSS动画?
    如何在其容器中为DIV创建平滑的左右CSS动画?
    通用CSS动画,用于左右运动 ,我们将探索创建一个通用的CSS动画,以向左和右移动DIV,从而到达其容器的边缘。该动画可以应用于具有绝对定位的任何div,无论其未知长度如何。问题:使用左直接导致瞬时消失 更加流畅的解决方案:混合转换和左 [并实现平稳的,线性的运动,我们介绍了线性的转换。这...
    编程 发布于2025-05-20
  • Python中嵌套函数与闭包的区别是什么
    Python中嵌套函数与闭包的区别是什么
    嵌套函数与python 在python中的嵌套函数不被考虑闭合,因为它们不符合以下要求:不访问局部范围scliables to incling scliables在封装范围外执行范围的局部范围。 make_printer(msg): DEF打印机(): 打印(味精) ...
    编程 发布于2025-05-20
  • Python高效去除文本中HTML标签方法
    Python高效去除文本中HTML标签方法
    在Python中剥离HTML标签,以获取原始的文本表示 仅通过Python的MlStripper 来简化剥离过程,Python Standard库提供了一个专门的功能,MLSTREPERE,MLSTREPERIPLE,MLSTREPERE,MLSTREPERIPE,MLSTREPERCE,MLST...
    编程 发布于2025-05-20
  • 如何使用FormData()处理多个文件上传?
    如何使用FormData()处理多个文件上传?
    )处理多个文件输入时,通常需要处理多个文件上传时,通常是必要的。 The fd.append("fileToUpload[]", files[x]); method can be used for this purpose, allowing you to send multi...
    编程 发布于2025-05-20
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。 映射{} 因此。我们不使用jQuery的“ .aimimate(...
    编程 发布于2025-05-20
  • C++20 Consteval函数中模板参数能否依赖于函数参数?
    C++20 Consteval函数中模板参数能否依赖于函数参数?
    [ consteval函数和模板参数依赖于函数参数在C 17中,模板参数不能依赖一个函数参数,因为编译器仍然需要对非contexexpr futcoriations contim at contexpr function进行评估。 compile time。 C 20引入恒定函数,必须在编译时进行...
    编程 发布于2025-05-20
  • JavaScript计算两个日期之间天数的方法
    JavaScript计算两个日期之间天数的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    编程 发布于2025-05-20
  • 如何有效地转换PHP中的时区?
    如何有效地转换PHP中的时区?
    在PHP 利用dateTime对象和functions DateTime对象及其相应的功能别名为时区转换提供方便的方法。例如: //定义用户的时区 date_default_timezone_set('欧洲/伦敦'); //创建DateTime对象 $ dateTime = ne...
    编程 发布于2025-05-20

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3