当前位置: 首页 > backend >正文

使用Docker部署React应用与Nginx

这个教程将帮助您使用Docker部署一个带有React的Nginx容器,并通过卷(volumes)将本地代码绑定到Docker容器中。这种设置非常适合开发环境,因为它允许您在本地编辑代码,而容器中的应用会自动更新。

步骤概述

  1. 创建Nginx配置文件
  2. 创建Dockerfile
  3. 创建docker-compose.yml文件
  4. 运行容器

1. 创建Nginx配置文件

首先,让我们创建一个Nginx配置文件,用于正确地提供React应用:

server {listen 80;server_name localhost;location / {root /usr/share/nginx/html;index index.html index.htm;try_files $uri $uri/ /index.html;  # 支持React路由}# 如果您有API请求需要代理,可以添加如下配置# location /api {#     proxy_pass http://backend:8080;#     proxy_set_header Host $host;#     proxy_set_header X-Real-IP $remote_addr;# }error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}
}

2. 创建Dockerfile

接下来,创建一个Dockerfile来设置Nginx容器:

FROM nginx:alpine# 删除默认的nginx配置
RUN rm /etc/nginx/conf.d/default.conf# 复制我们的配置
COPY nginx.conf /etc/nginx/conf.d/# 创建存放React应用的目录
RUN mkdir -p /usr/share/nginx/htmlEXPOSE 80CMD ["nginx", "-g", "daemon off;"]

3. 创建docker-compose.yml文件

现在,创建一个docker-compose.yml文件来定义服务和卷映射:

version: '3'services:nginx-react:build:context: .dockerfile: Dockerfilecontainer_name: nginx-react-appports:- "80:80"volumes:- ./dist:/usr/share/nginx/html- ./nginx.conf:/etc/nginx/conf.d/nginx.confrestart: unless-stopped

4. 创建一个简单的React应用(如果您还没有)

如果您还没有React应用,可以使用以下命令创建一个:

npm create vite@latest . -- --template react

在这里插入图片描述
修改app的代码:


import './App.css'function App() {return (<><div>hello world</div></>)
}export default App

在这里插入图片描述

然后构建React应用:

 npm installnpm run build

在这里插入图片描述

这将在项目目录中创建一个build文件夹,其中包含可以由Nginx提供服务的静态文件。
在这里插入图片描述

5. 运行Docker容器

最后,使用以下命令启动容器:

docker-compose up -d

这将构建Docker镜像并启动容器。您的React应用将在 http://localhost 上可用。
在这里插入图片描述

开发工作流程

  1. 在本地编辑您的React代码
  2. 运行npm run build生成新的构建文件
  3. 由于卷映射,Nginx将自动提供更新后的文件,无需重启容器

注意事项

  • 确保在运行docker-compose up之前已经构建了React应用(npm run build
  • 如果您更改了Nginx配置,需要重启容器:docker-compose restart
  • 如果您需要查看容器日志:docker-compose logs -f

这个设置使您可以在本地开发React应用,同时使用Docker和Nginx来模拟生产环境。通过卷映射,您的本地代码更改会立即反映在容器中。

http://www.xdnf.cn/news/7342.html

相关文章:

  • 分组背包问题:如何最大化背包价值?
  • 基于Java在高德地图面查询检索中使用WGS84坐标的一种方法-以某商场的POI数据检索为例
  • 常见提示词攻击方法和防御手段——提示词越狱
  • 专题五:floodfill算法(太平洋大西洋水流问题)
  • 前端加载超大图片(100M以上)实现秒开解决方案
  • 【分治】快速排序
  • lowcoder数据库操作4:显示查询数据表格
  • 加载渲染geojson数据
  • list.forEach(s -> countService.refreshArticleStatisticInfo(s.getId())); 讲解一下语法
  • Blender cycles烘焙贴图笔记
  • Linux 文件(2)
  • JavaScript 中的五种继承方式进行深入对比
  • vue3 vite 项目中自动导入图片
  • Axure疑难杂症:垂直菜单展开与收回(4大核心问题与专家级解决方案)
  • 新能源汽车充电桩管理平台如何利用智慧技术优化资源配置问题?
  • Triton介绍和各平台支持情况分析
  • Spring 代理与 Redis 分布式锁冲突:一次锁释放异常的分析与解决
  • 每日c/c++题 备战蓝桥杯(洛谷P4715 【深基16.例1】淘汰赛 题解)
  • 基于Zynq SDK的LWIP UDP组播开发实战指南
  • redis的List为什么用ziplist和quicklist
  • SCGI 服务器详解
  • 大模型(1)——基本概念
  • JVM的内存划分
  • vue3:十三、分类管理-表格--编辑、新增、详情、刷新
  • TDengine 安全部署配置建议
  • SpringBoot+ELK 搭建日志监控平台
  • Android Kotlin权限管理最佳实践
  • 【集成电路】集成电路导论知识点
  • HJ10 字符个数统计【牛客网】
  • JavaScript:PC端特效--缓动动画