docker容器部署express+mysql项目和H5项目

428 阅读7分钟

Nodejs下的express编写后端接口的流程

  • 安装Node.js和Express: 首先,确保系统上安装了Node.js。可以在Node.js官方网站上下载并安装最新版本。安装完Node.js后,可以使用Node包管理器(npm)来安装Express.js:
    bash
    npm install express --save
    
    --save选项将Express添加到项目依赖中。
  • 创建Express应用 在项目的根目录下,创建一个JavaScript文件(通常命名为app.jsserver.js)并开始编写Express应用。在文件中引入Express和创建一个应用实例:
    javascript
    const express = require('express');
    const app = express();
    const port = 3000; // 应用监听的端口号
    
    // 其他代码将在下面补充
    
  • 定义路由: 使用Express,可以定义不同的路由来处理不同的HTTP请求。例如,要创建一个简单的GET请求路由:
    javascript
    app.get('/', (req, res) => {
      res.send('Hello, World!');
    });
    
    这个路由将匹配根路径(/)的GET请求,并发送Hello, World!作为响应。
  • 中间件: Express中间件允许在请求到达路由处理程序之前或之后执行某些操作。例如,可以使用中间件来解析请求主体、验证用户、记录请求日志等。Express提供了许多内置的中间件,也可以编写自定义中间件。
    javascript
    // 示例:使用内置中间件来解析JSON请求主体
    app.use(express.json());
    
  • 启动服务器: 最后,在应用的底部启动服务器并监听指定的端口:
    javascript
    app.listen(port, () => {
      console.log(`Server is running on port ${port}`);
    });
    
  • 运行应用: 在项目的根目录下,运行以下命令来启动Express应用:
    bash
    node app.js
    
    或者,如果使用了Nodemon来监视文件变化,可以运行:
    bash
    nodemon app.js
    
    这会启动服务器,并在指定的端口上监听请求。
  • 测试接口: 使用工具如Postman或者浏览器来测试接口。访问http://localhost:3000(或者指定的端口)来测试创建的路由。

docker容器部署express+mysql生成器项目

  • 服务器安装docker-compose,会自动安装docker,不然手动安装即可。
  • 项目源代码地址:Team_Web_Graduated_Internship: 毕业实习 (gitee.com) 上传项目根目录下除node_modules文件夹的所有文件夹及文件到服务器指定目录中,编写Dockerfile镜像文件和docker-compose.yml容器编排文件:
  • Dockerfile
    # node采用最新版本的就好
    # 首先,选择官方的 node 镜像作为项目的基础镜像。
    FROM node
    
    MAINTAINER YeTing "wxw@graduate.info"
    
    WORKDIR /app
    # 安装forever进程、清楚npm缓存
    RUN npm install -g forever
    RUN npm cache clean --force
    RUN npm cache clean --force --global
    
    # 接着,优先将 ./package.json 复制到镜像中,预先加载第三方依赖。
    COPY ./package.json /app/
    
    # 安装依赖
    RUN npm install
    
    # 最后,将 Express 应用程序复制到容器 /app,暴露 3000 端口。
    COPY . /app/
    
    # Docker Container 之间是通过 link 机制来做通信的,EXPOSE 3000 ,是别的容器想要访问 该容器 3000 端口的前提条件。
    EXPOSE 3000
    
    CMD forever bin/www
    
    
  • docker-compose.yml
    • 太高版本的mysql容器好像不支持身份验证,以免麻烦,选择mysql5镜像,加载根目录下zhsq.sql卷到容器并运行zhsq.sql,从而直接使用身份验证机制password()而不是SHA1()
      • ./db/pool.js文件数据库连接池host地址需要更改为容器地址,可以是mysql
      • routers/users.jsmysql2模块采用PASSWORD()验证加密。
    • exress的3000端口映射为服务器8080端口,MySQL容器的3306端口映射为服务器的3307端口(防止与服务器已有的mysql服务端口3306冲突)。同时,开启服务器安全组:8080、3307并备注。
    • 容器可设置在同一网络环境net中,以保证进程正常运行。
    version: '3'
    services:
      express:
        build:
          context: .
          dockerfile: Dockerfile
        ports:
          - 8080:3000
        depends_on:
          - mysql
        networks:
          net:
    
      mysql:
        image: mysql:5
        environment:
          - MYSQL_ROOT_PASSWORD=123456
          - MYSQL_DATABASE=zhsq
          - MYSQL_USER=zhsq_root
          - MYSQL_PASSWORD=123456
        volumes:
          - ./zhsq.sql:/docker-entrypoint-initdb.d/zhsq.sql
        ports:
          - 3307:3306
        networks:
          net:
    networks:
        net:
    
  • 构建并运行容器:
    • 全网最详细的Docker-Compose详细教程 - 掘金 (juejin.cn)
    • 后台运行:docker-compose up -d,查看日志:docker-compose logs
    • 实时运行,可以不用观察日志直接查看服务器express代码运行状态:docker-compose up
    • image.png
    • 可进入express容器运行node环境,可进入MySQL容器bash命令行输入mysql -u root =p与mysql数据库进行交互。docker ps—>docker exec -it 容器id bash
      // node环境中查看文件
        const fs = require('fs'); fs.readFile('./routes/users.js', 'utf8', (err, data) => { if (err) { console.error(err); return; } console.log(data); });
      
  • 遇到的问题及解决方法
    • 第二次重新编排部署容器,如果是更改了数据库代码或者其他大的改动,则不能使用docker-compose build重构,否则容器运行内部还是上一次的代码,需要清除缓存重新构建(清缓存命令详见下文)。
    • Mysql容器采用8版本的话使用SHA1(str)加密字符串,出现的问题是容器间的密码不能匹配,报错说node中mysql模块版本不满足实际的mysql服务器或者是MySQL版本仍然过低,但是在本地上采用最新的mysql版本和mysql:^2.3模块版本运行SHA1是没有问题的。于是,挣扎了一会,MySQL模块版本不变,MySQL容器改为5版本的,采用PASSWORD(str)加密方式。这种问题猜想是mysql内核采用MariDB的缘故,因为不使用docker容器,直接在linux服务器上部署express项目和安装mysql版本8的,SHA1()加密是可以直接运行的,而docker拉取的MySQL镜像则是采用MariDB分支。

清除docker缓存和node缓存

  • docker编排出现问题需要重新拉取另一版本镜像时需要杀死容器进程docker kill,停止容器docker stop,移除删除容器docker down&&docker rm,同时,清除docker缓存和node缓存。
  • 要清除Docker Compose、Docker、和npm的缓存,您需要执行一些特定的操作。请注意,清除缓存可能会对系统产生一些影响,因此在执行这些操作之前,请确保您明白这些操作的影响,并备份重要数据。

清除Docker缓存

  1. 清除Docker镜像缓存

    您可以使用以下命令清除Docker镜像缓存:

    docker image prune -a
    

    这将删除未被使用的镜像,包括不再使用的中间层,以释放磁盘空间。

  2. 清除Docker容器缓存

    如果您还希望清除停止的Docker容器,可以使用以下命令:

    docker container prune
    

    这将删除所有已停止的容器。

  3. 清除Docker卷和网络

    如果需要,您还可以清除未使用的卷和网络:

    docker volume prune
    docker network prune
    

    这些命令将删除未使用的卷和网络。

清除Docker Compose缓存

Docker Compose本身不会存储缓存,但它可能使用Docker缓存,所以在清除Docker缓存后,Docker Compose将不再使用旧的镜像和中间层。

清除npm缓存

要清除npm的缓存,您可以使用以下命令:

npm cache clean --force

这将清除npm的本地缓存。

如果您希望清除全局npm缓存,可以运行:

npm cache clean --force --global

请注意,清除npm缓存可能会导致重新下载依赖项,因此执行此操作时可能需要一些时间,特别是对于大型项目。

总之,清除缓存是一个有用的维护操作,可以释放磁盘空间并确保您的环境保持干净。但请谨慎操作,确保备份重要数据,并明白执行这些操作的影响。

// node环境中查看文件
const fs = require('fs'); fs.readFile('./routes/users.js', 'utf8', (err, data) => { if (err) { console.error(err); return; } console.log(data); });

nginx容器部署uni-app(H5)项目

  • Hbuild中,项目清单文件中进行H5配置:路由模式history,运行基础路径./,然后发行网站-PC Web或手机H5(仅适用于uni-app)(H) 云打包即可。
  • 上传打包好的H5项目到服务器指定文件夹中。(web项目需要支持http协议才可以运行,因此需要远程机器上安装web服务器,如tomcat、apache、nginx等等),此处选nginx容器。
  • 拉取nginx镜像,运行容器,查看http配置,将H5项目路径下的文件复制到容器目录下。
  • 详细教程:本地项目部署到服务器——docker-nginx-腾讯云开发者社区-腾讯云 (tencent.com)