使用docker部署node和react应用

使用docker部署node和react应用

Docker 使开发人员能够将所有应用程序打包到容器中。这些容器可以在任何安装了 Docker 的机器上运行,并且应用程序将是相同的。这是在多个系统上运行代码库克隆的好方法,并且我们可以确保它们都是相同的。

在本文中,我们将学习如何在 Docker 容器内创建和运行 NodeJS Express 后端和 React 前端应用。

在 Docker 中运行 NodeJS

开始之前,请确保计算机上已安装并运行 Docker

现在使用命令行导航到桌面等目录,然后运行以下命令。

shell 复制代码
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 错误。

yml 复制代码
version: '3.8'
services:
  api:
    build: ./api
    container_name: api_backend
    ports:
      - '4000:4000'
    volumes:
      - ./api:/app
      - ./app/node_modules

而我们的node应用非常简单,就只有一个文件

js 复制代码
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-alpine

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

EXPOSE 4000

CMD ["node", "app.js"]

最后将此运行脚本命令添加到package.json文件中。

json 复制代码
"scripts": {

"start": "node app.js"

},

使用 Nodemon 让服务器在发生更改时自动重新启动(可选)

如果我们希望每次更改后端文件时都重新启动服务器,那么我们可以将其配置为使用 Nodemon

我们所要做的就是更新api文件夹内的Dockerfilepackage.json文件。

更新Dockerfile。我们现在在启动时安装 Nodemon 并使用dev作为运行命令。

复制代码
FROM node:16-alpine

RUN npm install -g nodemon

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

EXPOSE 4000

CMD ["npm", "run", "dev"]

package.json现在使用 Nodemon 的运行脚本更新文件。

json 复制代码
"scripts": {

"start": "node app.js",

"dev": "nodemon -L app.js"

},

我们刚刚创建了一个在端口 4000 上运行的基本 Express 应用程序。该端口也映射到 docker 中的 4000,这让我们可以在 Docker 容器中运行它。

启动服务器

要像平常一样使用 NodeDocker 容器外部运行服务器,只需在命令行中运行以下代码即可。我们需要确保位于 api 文件夹内。如果我们访问http://localhost:4000,我们应该会在浏览器窗口中看到主路由。

shell 复制代码
npm run start

Express 应用程序在 Docker 内运行需要不同的命令。首先,我们需要位于docker-compose.yml文件所在的根文件夹中。现在运行下面的命令,它应该在 Docker 容器内运行。

shell 复制代码
docker-compose up

不要忘记首先停止运行节点服务器,因为我们只能让一台服务器在端口 4000 上运行。

可以使用以下命令停止服务器,也可以转到 Docker 应用程序并停止容器运行。

shell 复制代码
docker-compose down

在 Docker 中运行 React 前端

现在让我们创建一个 React 项目。使用命令行进入 my-app-docker 的根文件夹。运行以下命令来设置项目。

shell 复制代码
npx create-react-app client
cd client
touch .dockerignore Dockerfile

现在将以下代码添加到相应的文件中。

将此行添加到.dockerignore文件中。

复制代码
node_modules

将此代码放入Dockerfile文件中。

复制代码
FROM node:17-alpine

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

最后使用以下代码更新根文件夹中的docker-compose.yml。我们在底部添加了一个客户端部分,其中包含用于在 Docker 容器内运行 React 的设置。

yaml 复制代码
version: '3.8'
services:
  api:
    build: ./api
    container_name: api_backend
    ports:
      - '4000:4000'
    volumes:
      - ./api:/app
      - ./app/node_modules
  client:
    build: ./client
    container_name: client_frontend
    ports:
      - '3000:3000'
    volumes:
      - ./client:/app
      - ./app/node_modules
    stdin_open: true
    tty: true

启动服务器

要像平常一样使用 NodeDocker 容器外部运行服务器,只需在命令行中运行以下代码即可。

shell 复制代码
npm run start

确保我们位于客户端文件夹内。如果我们访问http://localhost:3000,我们应该会在浏览器窗口中看到主路由。

React 应用程序在 Docker 内运行需要不同的命令。首先,我们需要位于docker-compose.yml文件所在的根文件夹中。现在运行下面的命令,它应该在 Docker 容器内运行。

shell 复制代码
docker-compose up

不要忘记首先停止运行 React 应用程序服务器,因为我们只能让一台服务器在端口 3000 上运行。

如果我们访问http://localhost:3000,我们应该会在浏览器窗口中看到主路由。

我们可以使用以下命令停止服务器,也可以转到 Docker 应用程序并停止容器运行。

shell 复制代码
docker-compose down

通过此设置,我们可以在 Docker 内同时运行 NodeJS 后端和 React 前端项目。如果遇到任何错误,则可能需要打开 Docker 桌面应用程序并删除与该项目相关的任何镜像。然后我们可以尝试docker-compose up再次运行该命令。

相关推荐
BigBigHang4 分钟前
【docker】DM8达梦数据库的docker-compose以及一些启动踩坑
数据库·docker·容器
云道轩5 分钟前
使用Docker在Rocky Linux 9.5上在线部署LangFlow
linux·人工智能·docker·容器·langflow
伟大的大威8 分钟前
Docker 部署 Supabase并连接
运维·docker·容器
讨厌吃蛋黄酥24 分钟前
React样式冲突终结者:CSS模块化+Vite全链路实战指南🔥
前端·javascript·react.js
Alchemist0129 分钟前
React复习:基础组件+组件通信
react.js
专家大圣43 分钟前
轻量级远程开发利器:Code Server与cpolar协同实现安全云端编码
网络·docker·树莓派·香橙派·casaos·code server
杰克逊的日记1 小时前
k8s的csi对接GPFS
云原生·容器·kubernetes·存储·gpfs
岚天start1 小时前
云服务器以域名形式访问机房Kubernetes集群服务之解决方案
nginx·docker·kubernetes·kubesphere·解决方案·云服务器·机房
tianchang2 小时前
React Hook 解析(一):useCallback 与 useMemo
前端·react.js
一颗奇趣蛋2 小时前
React- useMemo & useCallback
前端·react.js