[译] 面向 React 和 Nginx 的 Docker 多阶段构建

简介: [译] 面向 React 和 Nginx 的 Docker 多阶段构建

原文:progressivecoder.com/docker-mult…

Docker 多阶段构建(Multi-Stage) 是一种创建生产环境 Docker 镜像的极佳途径。

如果你是一位 Docker 新手,强烈推荐你先阅读“理解 Docker 基础”一文 (progressivecoder.com/understandi…)。另一篇“从头为 NodeJS 应用创建 Dockerfile” (progressivecoder.com/creating-a-…) 也很有意思。

若你已经掌握了 Docker 基础知识,就可以跟随以下每一步的细致讲解继续阅读了。

1. 为什么要用 Docker 多阶段构建?

Docker 多阶段构建 是 Docker 17.05 版本开始才有的一个相对较新的特性。多阶段构建允许我们将多个 FROM 语句放在同一个 Dockerfile 中。

每条 FROM 指令都可以使用各自不同的基础镜像。每个 FROM 语句也都标记了 Docker 构建过程中一个新阶段的开始。我们可以拷贝一个阶段的产出物到另一个阶段,也可以抛弃不需要的部分。

基本上,在我们不希望构建过程依赖项被拷贝到最终镜像的情况下这是个非常有用的特性。换句话说,Docker 多阶段构建帮助我们把镜像变得更小了

2. 开发和生产过程的区别

为了演示 Docker 多阶段构建,我们将以一个 React 应用为例

下图展示了要成功构建和运行一个 React 应用所需要完成的事情。

Docker 多阶段构建

如上所示,整个过程被分为 构建阶段运行阶段

在构建阶段,我们以 node:alpine 基础镜像开始。基本上,我们要做的就是使用 NodeJS 安装依赖项。最后,以生产环境为目的使用 npm run build 构建应用。

从此刻起,构建阶段就结束了。对于随后开始的运行阶段,使用 nginx 作为基础镜像。然后,我们将构建阶段中 npm run build 命令的结果,也就是 构建产物(诸如 index.htmlmain.js 等文件),拷贝到 nginx 服务器目录中。这时候,除了我们拷贝的构建产物之外,构建阶段产生的其它所有文件和目录都将被抛弃,并不会纳入最终镜像。

在最后一个步骤,我们可以启动 nginx 以伺服 React 应用。

3. 建立 React 应用

先生成一个简单的 React 应用。

要快速开始的话,我们先安装 create-react-app 包,它可以快速生成一个 ReactJS 应用。以下面的命令全局安装:


npm install -g create-react-app

一旦安装完成,就可以用其生成项目。在终端中进入想要建立项目的目录,并执行以下命令。


create-react-app docker-react-app

这将创建一个名为 docker-react-app 的应用,用于我们的例子。

4. 创建多阶段的 Dockerfile

现在可以创建我们的 Dockerfile 以支持多阶段 Docker 构建过程了。 注意该文件要放置在项目根目录下

供参考的项目目录结构

接下来,在 Dockerfile 中添加以下内容:


#构建阶段
FROM node:alpine as builder
WORKDIR '/app'
COPY package.json .
RUN npm install
COPY . .
RUN npm run build
#运行阶段
FROM nginx
COPY --from=builder /app/build /usr/share/nginx/html

下面详细解释这两个阶段。

构建阶段

步骤 1 – 以 node:alpine 作为基础镜像。同时我们将该阶段定名为 builder。这将帮助我们在其后引用这个阶段。

步骤 2 – 接下来,为应用指定工作目录。这也是构建产物将要被创建的位置。

步骤 3 – 将 package.json 文件拷贝到工作目录。npm 需要该文件以安装所需依赖项。注意我们只拷贝了 package.json 文件以确保对于随后由于代码更改而发生的构建,不会使 docker 镜像缓存失效(译注:对于 COPY 和 ADD 命令,会计算镜像内的文件和构建目录文件的校验和,然后做比较来判断本层是否有改动;如果只改了 src 的文件但依赖项没变,就可以利用这层的缓存从而加速构建)。

步骤 4 – 在下一步中,使用 npm install 命令安装依赖项。也就是安装了被 .dockerignore 忽略的 node_modules 目录。

步骤 5 – 然后,将其它文件拷贝到工作目录,也就是包含了应用真正代码的那些文件。

步骤 6 – 下一步,执行 npm run build 命令。该命令将准备好 React 应用的生产环境构建产物。也就是说,该命令会生成用来伺服客户端的 index.html 文件和 main.js 文件。

运行阶段

步骤 1 – 以 nginx 基础镜像开始运行阶段。Nginx 是一个非常流行的 web-server,是伺服静态文件的理想工具。

步骤 2 – 接着,我们从 builder 阶段拷贝构建产物到 nginx 所需的位置。注意我们通过 –from=builder tag 引用了 构建阶段,并从构建阶段的工作目录拷贝了 /app/build

这样我们就完成了 Docker 多阶段构建的 Dockerfile

这里的一个重点是对于 nginx 不需要显式的 RUN 命令。nginx 基础镜像本身会在 80 端口启动 web-server。

5. 测试 React 应用

为了测试 React 应用,先以下面的命令,基于多阶段 Dockerfile 构建一个镜像:


docker build -t docker-react-app .

在第一次执行时这会费一点时间,因为所有的基础镜像和依赖项都会被下载。

一旦构建完成,运行下面的命令来运行它:


docker run -p 8080:80 docker-react-app

这里基本就是运行了镜像并将 nginx 的 80 端口映射到了我们本机上的 8080 端口。

我们没在命令行窗口中看到太多可视化的输出。但是,当我们打开浏览器并访问 http://localhost:8080 ,将看到以下 React 应用运行界面:

总结

在本文中,我们使用 Docker 多阶段构建 过程成功运行了一个 Nginx server 上的 React 应用。

我们将构建的过程分为了构建阶段和运行阶段。应用在构建过程中被创建后,将其产出拷贝到运行阶段并抛弃无用的部分。这大大地减少了镜像的总体积。



相关文章
|
26天前
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
1天前
|
运维 Kubernetes Docker
利用Docker和Kubernetes构建微服务架构
利用Docker和Kubernetes构建微服务架构
|
7天前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
65 2
|
11天前
|
资源调度 前端开发 数据可视化
构建高效的数据可视化仪表板:D3.js与React的融合之道
【10月更文挑战第25天】在数据驱动的时代,将复杂的数据集转换为直观、互动式的可视化表示已成为一项至关重要的技能。本文深入探讨了如何结合D3.js的强大可视化功能和React框架的响应式特性来构建高效、动态的数据可视化仪表板。文章首先介绍了D3.js和React的基础知识,然后通过一个实际的项目案例,详细阐述了如何将两者结合使用,并提供了实用的代码示例。无论你是数据科学家、前端开发者还是可视化爱好者,这篇文章都将为你提供宝贵的洞见和实用技能。
28 5
|
15天前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
本文介绍了Docker和Kubernetes在构建高效微服务架构中的应用,涵盖基本概念、在微服务架构中的作用及其实现方法。通过具体实例,如用户服务、商品服务和订单服务,展示了如何利用Docker和Kubernetes实现服务的打包、部署、扩展及管理,确保微服务架构的稳定性和可靠性。
62 7
|
14天前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【10月更文挑战第22天】随着云计算和容器技术的快速发展,微服务架构逐渐成为现代企业级应用的首选架构。微服务架构将一个大型应用程序拆分为多个小型、独立的服务,每个服务负责完成一个特定的功能。这种架构具有灵活性、可扩展性和易于维护的特点。在构建微服务架构时,Docker和Kubernetes是两个不可或缺的工具,它们可以完美搭档,为微服务架构提供高效的支持。本文将从三个方面探讨Docker和Kubernetes在构建高效微服务架构中的应用:一是Docker和Kubernetes的基本概念;二是它们在微服务架构中的作用;三是通过实例讲解如何使用Docker和Kubernetes构建微服务架构。
51 6
|
13天前
|
负载均衡 应用服务中间件 nginx
基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细
通过使用Nginx和Consul构建自动发现的Docker服务架构,可以显著提高服务的可用性、扩展性和管理效率。Consul实现了服务的自动注册与发现,而Nginx则通过动态配置实现了高效的反向代理与负载均衡。这种架构非常适合需要高可用性和弹性扩展的分布式系统。
22 4
|
14天前
|
负载均衡 应用服务中间件 nginx
基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细
通过使用Nginx和Consul构建自动发现的Docker服务架构,可以显著提高服务的可用性、扩展性和管理效率。Consul实现了服务的自动注册与发现,而Nginx则通过动态配置实现了高效的反向代理与负载均衡。这种架构非常适合需要高可用性和弹性扩展的分布式系统。
29 3
|
19天前
|
jenkins 测试技术 持续交付
Docker最佳实践:构建高效的CI/CD流水线
【10月更文挑战第17天】在现代软件开发实践中,持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)已成为提高开发效率和软件质量的重要手段。Docker作为一种容器技术,为构建一致且隔离的开发环境提供了强有力的支撑。本文将探讨如何利用Docker来优化CI/CD流程,包括构建环境的标准化、镜像管理以及与CI/CD工具(如Jenkins、GitLab CI)的集成。
40 5
|
18天前
|
JavaScript Docker Python
下个时代的开发工具-Nix:声明式的运行环境构建器、简单场景下的docker替身
Nix 是一个独特的包管理工具和构建系统,采用声明式方法管理软件包和运行环境。它通过精确控制依赖关系和环境配置,确保软件的可重复性、隔离性和可追溯性。Nix 支持多语言开发环境,提供声明式配置、环境隔离、回滚与版本控制等核心功能,适用于复杂开发场景,有效解决依赖冲突和环境不一致问题。
下一篇
无影云桌面