Henry
发布于 2025-03-09 / 5 阅读
0
0

React - Docker 部署 App

背景简介

使用 Docker 部署 React app。

环境信息

  1. Docker 已安装 【Docker - Debian 安装

示例需求

  • 生成 React 部署资源
  • 创建 Doker 容器
  • 使用 Docker 部署

详细步骤

第一步: 生成 React 部署资源

  • 在项目路径下执行如下指令
$ npm run build 
> react-app-demo@0.1.0 build
> react-scripts build

Creating an optimized production build...
Compiled successfully.

File sizes after gzip:

  59.01 kB  build/static/js/main.23b597da.js
  1.78 kB   build/static/js/453.69e8bcfe.chunk.js
  513 B     build/static/css/main.f855e6bc.css

The project was built assuming it is hosted at /.
You can control this with the homepage field in your package.json.

The build folder is ready to be deployed.
You may serve it with a static server:

  npm install -g serve
  serve -s build

Find out more about deployment here:

  https://cra.link/deployment

第二步: 创建 Docker 容器

  • 创建 react-app-demo.conf 配置文件
server {
    listen 80;

    # 使用环境变量来设置server_name
    server_name ${SERVER_NAME};

    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
        try_files $uri /index.html;
    }
}
  • 创建 Dockerfile 配置文件
# 使用官方Nginx基础镜像
FROM nginx:latest

# 删除Nginx的默认配置文件
RUN rm /etc/nginx/conf.d/default.conf

# 复制自定义Nginx配置文件到容器中
COPY react-app-demo.conf /etc/nginx/conf.d/

# 复制React应用的静态文件到Nginx服务器的默认目录
COPY build /usr/share/nginx/html

# 暴露80端口
EXPOSE 80

第三步: 构建 Docker 容器

$ sudo docker build -t react-app-demo:1.0.0 . 
[+] Building 1.7s (9/9) FINISHED                                                                                                                                                                                                                 docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                                                                                       0.0s
 => => transferring dockerfile: 485B                                                                                                                                                                                                                       0.0s
 => [internal] load metadata for docker.io/library/nginx:latest                                                                                                                                                                                            0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                                          0.0s
 => => transferring context: 2B                                                                                                                                                                                                                            0.0s
 => CACHED [1/4] FROM docker.io/library/nginx:latest                                                                                                                                                                                                       0.0s
 => [internal] load build context                                                                                                                                                                                                                          0.1s
 => => transferring context: 3.34kB                                                                                                                                                                                                                        0.0s
 => [2/4] RUN rm /etc/nginx/conf.d/default.conf                                                                                                                                                                                                            0.6s
 => [3/4] COPY react-app-demo.conf /etc/nginx/conf.d/                                                                                                                                                                                                      0.3s
 => [4/4] COPY build /usr/share/nginx/html                                                                                                                                                                                                                 0.2s
 => exporting to image                                                                                                                                                                                                                                     0.2s
 => => exporting layers                                                                                                                                                                                                                                    0.2s
 => => writing image sha256:3a6324b3cc388d6a2bff283c786632401837ab373263f23d62ede32267ae4d1f                                                                                                                                                               0.0s
 => => naming to docker.io/library/react-app-demo:1.0.0 

**第四步:**启动容器

  • 后台启动
$ sudo docker run -d -p 8080:80 --name react-app-demo -e SERVER_NAME=react-app-demo react-app-demo:1.0.0
b34a7534b0f89d8f4f36014221c85333245bfb778b0900306b3dc414543958c3
  • 查看容器状态
$ sudo docker container ls -a
CONTAINER ID   IMAGE                  COMMAND                   CREATED          STATUS          PORTS                                     NAMES
b34a7534b0f8   react-app-demo:1.0.0   "/docker-entrypoint.…"   50 seconds ago   Up 50 seconds   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   react-app-demo

第五步: 登录项目首页查看部署结果

备注: 可根据自身需求将 server name 添加至本机hosts

$ cat /etc/hosts
127.0.0.1    localhost react-app-demo


以上便是本文的全部内容,感谢您的阅读,如遇到任何问题,欢迎在评论区留言讨论。



评论