使用docker部署node和react应用
使用docker部署node和react应用
Docker
使开发人员能够将所有应用程序打包到容器中。这些容器可以在任何安装了 Docker
的机器上运行,并且应用程序将是相同的。这是在多个系统上运行代码库克隆的好方法,并且我们可以确保它们都是相同的。
在本文中,我们将学习如何在 Docker
容器内创建和运行 NodeJS Express
后端和 React
前端应用。
在 Docker 中运行 NodeJS
开始之前,请确保计算机上已安装并运行 Docker
。
现在使用命令行导航到桌面等目录,然后运行以下命令。
mkdir my-app-docker
cd my-app-docker
touch docker-compose.yml
mkdir api
cd api
npm init -y
npm i express
touch app.js Dockerfile .dockerignore
cd ..
我们设置了一个名为 api
的后端并创建了一些 Docker
文件。现在在代码编辑器中打开项目并将以下代码添加到相应的文件中。
将其放入docker-compose.yml
文件中。要非常注意 yaml
格式,否则在尝试运行它时会出现 Docker
错误。
version: '3.8'
services:api:build: ./apicontainer_name: api_backendports:- '4000:4000'volumes:- ./api:/app- ./app/node_modules
而我们的node
应用非常简单,就只有一个文件
const express = require('express');const app = express();const port = process.env.PORT || 4000;app.get('/', (req, res) => {res.send('Home Route');
});app.listen(port, () =>console.log(`Server running on port ${port}, http://localhost:${port}`)
);
现在将此行添加到.dockerignore
文件中
node_modules
把下面的代码添加到Dockerfile
文件中
FROM node:16-alpineWORKDIR /appCOPY package.json .RUN npm installCOPY . .EXPOSE 4000CMD ["node", "app.js"]
最后将此运行脚本命令添加到package.json
文件中。
"scripts": {"start": "node app.js"},
使用 Nodemon 让服务器在发生更改时自动重新启动(可选)
如果我们希望每次更改后端文件时都重新启动服务器,那么我们可以将其配置为使用 Nodemon
。
我们所要做的就是更新api
文件夹内的Dockerfile
和package.json
文件。
更新Dockerfile
。我们现在在启动时安装 Nodemon
并使用dev
作为运行命令。
FROM node:16-alpineRUN npm install -g nodemonWORKDIR /appCOPY package.json .RUN npm installCOPY . .EXPOSE 4000CMD ["npm", "run", "dev"]
package.json
现在使用 Nodemon
的运行脚本更新文件。
"scripts": {"start": "node app.js","dev": "nodemon -L app.js"},
我们刚刚创建了一个在端口 4000 上运行的基本 Express
应用程序。该端口也映射到 docker
中的 4000,这让我们可以在 Docker
容器中运行它。
启动服务器
要像平常一样使用 Node
在 Docker
容器外部运行服务器,只需在命令行中运行以下代码即可。我们需要确保位于 api
文件夹内。如果我们访问http://localhost:4000
,我们应该会在浏览器窗口中看到主路由。
npm run start
让 Express
应用程序在 Docker
内运行需要不同的命令。首先,我们需要位于docker-compose.yml
文件所在的根文件夹中。现在运行下面的命令,它应该在 Docker
容器内运行。
docker-compose up
不要忘记首先停止运行节点服务器,因为我们只能让一台服务器在端口 4000 上运行。
可以使用以下命令停止服务器,也可以转到 Docker
应用程序并停止容器运行。
docker-compose down
在 Docker 中运行 React 前端
现在让我们创建一个 React
项目。使用命令行进入 my-app-docker
的根文件夹。运行以下命令来设置项目。
npx create-react-app client
cd client
touch .dockerignore Dockerfile
现在将以下代码添加到相应的文件中。
将此行添加到.dockerignore
文件中。
node_modules
将此代码放入Dockerfile
文件中。
FROM node:17-alpineWORKDIR /appCOPY package.json .RUN npm installCOPY . .EXPOSE 3000CMD ["npm", "start"]
最后使用以下代码更新根文件夹中的docker-compose.yml
。我们在底部添加了一个客户端部分,其中包含用于在 Docker
容器内运行 React
的设置。
version: '3.8'
services:api:build: ./apicontainer_name: api_backendports:- '4000:4000'volumes:- ./api:/app- ./app/node_modulesclient:build: ./clientcontainer_name: client_frontendports:- '3000:3000'volumes:- ./client:/app- ./app/node_modulesstdin_open: truetty: true
启动服务器
要像平常一样使用 Node
在 Docker
容器外部运行服务器,只需在命令行中运行以下代码即可。
npm run start
确保我们位于客户端文件夹内。如果我们访问http://localhost:3000
,我们应该会在浏览器窗口中看到主路由。
让 React
应用程序在 Docker
内运行需要不同的命令。首先,我们需要位于docker-compose.yml
文件所在的根文件夹中。现在运行下面的命令,它应该在 Docker
容器内运行。
docker-compose up
不要忘记首先停止运行 React
应用程序服务器,因为我们只能让一台服务器在端口 3000 上运行。
如果我们访问http://localhost:3000
,我们应该会在浏览器窗口中看到主路由。
我们可以使用以下命令停止服务器,也可以转到 Docker
应用程序并停止容器运行。
docker-compose down
通过此设置,我们可以在 Docker
内同时运行 NodeJS
后端和 React
前端项目。如果遇到任何错误,则可能需要打开 Docker
桌面应用程序并删除与该项目相关的任何镜像。然后我们可以尝试docker-compose up
再次运行该命令。
相关文章:
使用docker部署node和react应用
使用docker部署node和react应用 Docker 使开发人员能够将所有应用程序打包到容器中。这些容器可以在任何安装了 Docker 的机器上运行,并且应用程序将是相同的。这是在多个系统上运行代码库克隆的好方法,并且我们可以确保它们都是相同的。 在本文中&…...
对List集合、数组去重
前言: 还记得在2021我发布的第一篇博客就是关于数组的去重,从那一刻开始,命运的齿轮开始转动…… 扯远了哈哈哈,我重新写这篇文章只是想让去重方式更加严谨(ps:我才不会说是因为技术成长了,看不上之前写的…...

AI相机“妙鸭相机”原理分析和手动实现方案
妙鸭相机 一个通过上传大约20张照片,生成专属自拍。在2023年7月末爆火,根据36Kr报道,妙鸭相机系阿里系产品,挂靠在阿里大文娱体系下,并非独立公司。 使用方法是上传20张自拍照片,之后可以选择模板生成自己…...

关于计算机大学生秋招面试的那点事?(Golang篇)
前言; Go语言(简称Golang)越来越受到开发者的关注和欢迎。它由Google公司于2009年推出,旨在提供更好的性能和并发性能。眼下,越来越多的公司在使用它,比如著名的云计算服务商AWS,以及知名电商京…...
Windows网络自学的第一天:创建线程
CreateThread函数: 该函数用于创建一个新的线程并在其上运行指定的函数,原型如下: HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,SIZE_T dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID …...

正确的 Java 异常处理
我们来谈谈痛点吧。由于我的职责,我必须使用许多不同的服务(进行编辑、进行代码审查......);不同的团队通常会编写所有这些服务,每当涉及到处理错误并从服务转发错误时,有时我的眼睛就会开始流泪。让我尝试…...

RTT(RT-Thread)时钟管理
目录 时钟管理 时钟节拍 RTT工程目录结构介绍 配置文件:rtconfig.h 获取系统节拍 获取系统节拍数函数 实例 定时器 RT_Thread定时器介绍 定时器源码分析(了解即可) rt_system_timer_init (硬件定时器初始化) rt_system_timer_thr…...

基础实验篇 | uORB消息读写与自定义实验(二)
导读 uORB是PX4/Pixhawk系统中非常重要且关键的模块之一,是用于无人机模块间通信的协议机制。本篇将详细介绍uORB并详细拆解uORB消息读写与自定义实验全流程(二)。 基础实验篇 | uORB消息读写与自定义实验(二) 01 RflySim平台的uORB消息读写…...

k8s pod数据存储Volumes
一、说在前面的话 在 Kubernetes 的 Deployment 中,您可以使用多种类型的 Volumes 来管理 Pod 中的数据。 作用是用来共享目录及配置,不用在每个pod里进行配置。 本文主要概述怎么使用HostPath、PersistentVolumeClaim、ConfigMap。 二、k8s有哪些Vol…...

ZYNQ在Petalinux系统下双网口同网段的实现
ZYNQ在Petalinux系统下双网口同网段的实现 1.开发环境 采用了赛灵思zynq xc7z100芯片,外部挂载了两个网口phy芯片(marvell 88e1510),且两个网口phy芯片公用MDIO管脚,bd配置如下: 2.问题说明 忙去了&am…...

突破传统监测模式:业务状态监控HM的新思路 | 京东云技术团队
一、传统监控系统的盲区,如何打造业务状态监控。 在系统架构设计中非常重要的一环是要做数据监控和数据最终一致性,关于一致性的补偿,已经由算法部的大佬总结过就不再赘述。这里主要讲如何去补偿?补偿的方案哪些?这就…...
7-16 验证“哥德巴赫猜想” (20 分)
7-16 验证“哥德巴赫猜想” (20 分) 数学领域著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24519,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以…...

GEE学习02 --设置Jupyter Notebook的打开路径
直接双击Jupyter Notebook 桌面图标运行时,打开的文件路径是默认的:C:\用户\用户名 如果使用python命令提示符打开jupyter notebook , 而我新建的GEE学习文件夹在另一个路径,可以直接修改默认的保存路径:…...

stm32与上位机电脑间最快的通信方式是什么?
对于小型多关节机械臂的控制电路设计,选择合适的通信方式可以提高MCU与上位机之间的实时性。以下是一些在STM32上常用的通信方式,你可以根据你的具体需求选择适合的: 串口通信(UART):串口通信是一种常见的…...

pytorch学习——卷积神经网络——以LeNet为例
目录 一.什么是卷积? 二.卷积神经网络的组成 三.卷积网络基本元素介绍 3.1卷积 3.2填充和步幅 3.2.1填充(Padding) 填充是指在输入数据周围添加额外的边界值(通常是零),以扩展输入的尺寸。填充可以在卷…...

stm32 mpu6050 cubemx DMP法读取角度
文章目录 前言一、相关文件二、cubemx配置三、代码变量初始化主循环 总结 前言 文件 记录使用dmp库来读取mpu6050的角度。 这是参考文件 参考1–主要参考 github参考 参考2 参考三 一、相关文件 相关文件在这里下载(未填,不过可以在上面的git中下载&a…...

.Net6 Core Web API 配置 log4net + MySQL
目录 一、导入NuGet 包 二、添加配置文件 log4net.config 三、创建MySQL表格 四、Program全局配置 五、帮助类编写 六、效果展示 小编没有使用依赖注入的方式。 一、导入NuGet 包 ---- log4net 基础包 ---- Microsoft.Extensions.Logging.Log4Net…...

校园跑腿小程序运营攻略
作为一名校园跑腿小程序的运营者,你可能会面临诸如用户获取、平台推广、服务质量保证等挑战。在本篇推文中,我将为你提供一些关键的运营策略,帮助你成功运营校园跑腿小程序。 1. 用户获取和留存 用户是校园跑腿小程序成功的关键。以下是一些…...

InfluxDB2如何求增量数据
需求 项目中需要接入电表设备,求用电量。 按天和设备统计用电量 按天统计用电量 统计总用电量 存在的问题 difference 函数可以求增量,但是以上计算均存在一个问题,比如xx设备有8.1号和8.2号的数据,我统计每天的用电量…...

Flink作业调度的9种状态
1.什么是作业调度 Flink 通过 Task Slots 来定义执行资源。每个 TaskManager 有一到多个 task slot,每个 task slot 可以运行一条由多个并行 task 组成的流水线。 这样一条流水线由多个连续的 task 组成,比如并行度为 n 的 MapFunction 和 并行度为 n 的…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...