使用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 的…...
5个实用技巧:快速掌握猫抓扩展的高效资源嗅探方法
5个实用技巧:快速掌握猫抓扩展的高效资源嗅探方法 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为网页上的精彩视频无法保存而烦…...
5分钟快速上手:Buzz离线语音转文字终极指南,保护隐私的完整解决方案
5分钟快速上手:Buzz离线语音转文字终极指南,保护隐私的完整解决方案 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/…...
一款即插即用的西门子PLC测试工具,全面支持S7200、SMART 1200、1500、300...
西门子PLC测试工具,支持S7200,SMART 1200 1500 300等各种PLC,到手即用,。搞自动化的小伙伴们有没有遇到过PLC调试效率低的问题?今天要安利的这个西门子全家桶测试工具,简直就是程序员的物理外挂。从老掉牙的…...
Ostrakon-VL-8B实战:利用LSTM时序模型增强视频片段内容理解
Ostrakon-VL-8B实战:利用LSTM时序模型增强视频片段内容理解 你有没有遇到过这样的场景?面对一段几分钟的监控录像,需要快速知道里面发生了什么;或者刷到一个短视频,想让它自动生成一段文字描述。单纯靠人眼去看、人脑…...
零基础入门:计算机视觉需要哪些数学基础?如何高效学习线性代数和概率论?
零基础入门:计算机视觉需要哪些数学基础?如何高效学习线性代数和概率论? 标签:#计算机视觉、#线性代数、#人工智能、#深度学习、#自然语言处理、#神经网络、#机器学习### 一、痛点引入:为什么很多人怕CV数学࿱…...
2026 年AI Agent面试题及答案Top30
智能体人工智能正在各行各业迅速普及,许多新兴公司都在寻找这方面的专家。本文收录了一些来自初级和中级职位面试的真实问题,其中一些是我自己设计的,另一些则旨在帮助读者对该领域有一个大致的了解。 请记住,在正式面试中,你可能会被要求先完成一项实践练习。你也可能会被…...
Gotestsum核心功能解析:从基础输出到JUnit XML集成
Gotestsum核心功能解析:从基础输出到JUnit XML集成 【免费下载链接】gotestsum go test runner with output optimized for humans, JUnit XML for CI integration, and a summary of the test results. 项目地址: https://gitcode.com/gh_mirrors/go/gotestsum …...
从KITTI到SemanticKITTI:手把手教你用Python玩转这个LiDAR语义分割数据集
从KITTI到SemanticKITTI:Python实战LiDAR语义分割全流程指南 当Velodyne HDL-64E激光雷达以10Hz频率旋转时,每秒产生的约10万个三维点云数据究竟蕴含怎样的语义信息?这正是SemanticKITTI数据集要解决的核心问题。作为KITTI数据集的重要扩展&a…...
CCS开发避坑指南:如何正确使用DSP281x官方库文件与例程(TMS320F2812实战)
CCS开发避坑指南:如何正确使用DSP281x官方库文件与例程(TMS320F2812实战) 在嵌入式开发领域,TI的TMS320F2812 DSP芯片因其强大的性能和丰富的外设资源,一直是工业控制、电机驱动等应用的热门选择。但很多开发者在初次接…...
教育AI合规生死线!SITS2026 AIAgent通过等保三级+GDPR+《未成年人网络保护条例》三重认证的7项技术锚点(含审计日志模板)
第一章:教育AI合规生死线:SITS2026 AIAgent通过等保三级GDPR《未成年人网络保护条例》三重认证的总体战略定位 2026奇点智能技术大会(https://ml-summit.org) SITS2026 AIAgent并非将合规视为附加功能,而是将其内化为系统架构的DNA——从数…...
