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

CKA 完整课程日 ulti Stage Docker 构建

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

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]删除
最新教程 更多>
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-04-26
  • Python不会对超范围子串切片报错的原因
    Python不会对超范围子串切片报错的原因
    在python中用索引切片范围:二重性和空序列索引单个元素不同,该元素会引起错误,切片在序列的边界之外没有。这种行为源于索引和切片之间的基本差异。索引一个序列,例如“示例” [3],返回一个项目。但是,切片序列(例如“示例” [3:4])返回项目的子序列。索引不存在的元素时,例如“示例” [9] ...
    编程 发布于2025-04-26
  • 如何配置Pytesseract以使用数字输出的单位数字识别?
    如何配置Pytesseract以使用数字输出的单位数字识别?
    Pytesseract OCR具有单位数字识别和仅数字约束 在pytesseract的上下文中,在配置tesseract以识别单位数字和限制单个数字和限制输出对数字可能会提出质疑。 To address this issue, we delve into the specifics of Te...
    编程 发布于2025-04-26
  • 解决MySQL错误1153:数据包超出'max_allowed_packet'限制
    解决MySQL错误1153:数据包超出'max_allowed_packet'限制
    mysql错误1153:故障排除比“ max_allowed_pa​​cket” bytes 更大的数据包,用于面对阴谋mysql错误1153,同时导入数据capase doft a Database dust?让我们深入研究罪魁祸首并探索解决方案以纠正此问题。理解错误此错误表明在导入过程中接...
    编程 发布于2025-04-26
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-04-26
  • 表单刷新后如何防止重复提交?
    表单刷新后如何防止重复提交?
    在Web开发中预防重复提交 在表格提交后刷新页面时,遇到重复提交的问题是常见的。要解决这个问题,请考虑以下方法: 想象一下具有这样的代码段,看起来像这样的代码段:)){ //数据库操作... 回声“操作完成”; 死(); } ?> ...
    编程 发布于2025-04-26
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-04-26
  • 可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    可以在纯CS中将多个粘性元素彼此堆叠在一起吗?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    编程 发布于2025-04-26
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案:的,请访问量很大,并应为procectiquiestate的,并在整个代码上正确格式不多: java.text.simpledateformat; 导入java.util.calendar; 导入java...
    编程 发布于2025-04-26
  • 在PHP中如何高效检测空数组?
    在PHP中如何高效检测空数组?
    在PHP 中检查一个空数组可以通过各种方法在PHP中确定一个空数组。如果需要验证任何数组元素的存在,则PHP的松散键入允许对数组本身进行直接评估:一种更严格的方法涉及使用count()函数: if(count(count($ playerList)=== 0){ //列表为空。 } 对...
    编程 发布于2025-04-26
  • C++20 Consteval函数中模板参数能否依赖于函数参数?
    C++20 Consteval函数中模板参数能否依赖于函数参数?
    [ consteval函数和模板参数依赖于函数参数在C 17中,模板参数不能依赖一个函数参数,因为编译器仍然需要对非contexexpr futcoriations contim at contexpr function进行评估。 compile time。 C 20引入恒定函数,必须在编译时进行...
    编程 发布于2025-04-26
  • 在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在C中的显式删除 在C中的动态内存分配时,开发人员通常会想知道是否有必要在heap-procal extrable exit exit上进行手动调用“ delete”操作员,但开发人员通常会想知道是否需要手动调用“ delete”操作员。本文深入研究了这个主题。 在C主函数中,使用了动态分配变量(H...
    编程 发布于2025-04-26
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-04-26
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-04-26
  • 为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    为什么Microsoft Visual C ++无法正确实现两台模板的实例?
    The Mystery of "Broken" Two-Phase Template Instantiation in Microsoft Visual C Problem Statement:Users commonly express concerns that Micro...
    编程 发布于2025-04-26

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

Copyright© 2022 湘ICP备2022001581号-3