LogoLogo
github
  • 💪Upupup
  • React
    • hook
    • redux
    • Router
    • umimax+nest.js 实现 权限管理系统
    • umimax + Nest.js 实现权限管理系统
  • Vue
    • effectScope 是干啥的
    • Object.assign()
    • 响应式理解
    • @babel/preset-env 问题
    • 自定义指令
    • 问题及解决
    • 🧐权限管理(动态路由)
  • docker
    • Docker 常用命令
    • Docker部署遇到的问题
    • Docker Compose 常用命令
    • docker修改daemon.json
    • jenkins
    • Jenkinsfile 语法进阶
    • nginx配置
    • 问题
    • 玩转Nginx:轻松为Docker部署的服务添加域名的完美指南
    • Docker部署前后端项目:经验分享与问题解决
  • git
    • command
    • problem
    • rebase实践
  • 前端开发面试题集
    • CSS 面试题
    • 前端工程化面试题
    • HTML 面试题
    • JavaScript 面试题
    • NestJS 面试题
    • Node.js 面试题
    • 性能优化面试题
    • React 面试题
    • 安全面试题
    • Vue 面试题
  • interviewer
    • 计算机网络
    • 性能优化
  • leetcode
    • 算法
      • 分治算法
      • 滑动窗口与双指针
        • 🦸定长滑动窗口
        • 🚴不定长滑动窗口
        • 🚴‍♂️单序列双指针
      • 回溯
      • 二分法
  • nestjs
    • mail
    • mini-order
    • nestjs
    • prisma
    • 登录注册
  • nextjs
    • 用 V0 和 Cursor 实现全栈开发:从小白到高手的蜕变
  • tauri
    • 思路
    • 自动通知应用升级
  • vite
    • vite实现原理
  • webpack
    • 资料
  • 工具
    • Eslint
    • jenkins
    • 关于cicd
  • 微信小程序
    • ScoreDeck
    • h5跳转小程序问题
  • 思路
    • carTool
  • 操作系统学习
    • Linux命令
    • 计算机是如何计数的
    • nginx
      • location
      • try_files
  • 浏览器
    • session、location
    • web crypto
    • 性能监控和错误收集与上报
    • 预请求
  • 知识点整理
    • 知识点整理
  • 面试
    • Promise
    • 备战
    • 数码3
    • 腾娱
    • 腾讯云智
    • 重复请求合并
  • 前端工程化
    • 在 pnpm Monorepo 中使用公共方法包
由 GitBook 提供支持
在本页
  • 首先安装docker
  • docker配置
  • 前端Umimax项目配置
  • 后端Nest项目配置
  • docker-compose
  • 遇到的问题
  • 感受

这有帮助吗?

在GitHub上编辑
  1. docker

Docker部署前后端项目:经验分享与问题解决

上一页玩转Nginx:轻松为Docker部署的服务添加域名的完美指南下一页git

最后更新于5个月前

这有帮助吗?

首先安装docker

推荐 阅读,如果电脑是第一次装,应该是没什么问题的我装过两次docker,因为电脑c盘内存不足,我想把docker迁移到d盘,但是遇到了问题,百度上有些解答是把c盘docker的位置镜像到d盘,可能是我方法不对,没有成功,第二次下载docker,一直报错,应该是没有删除干净

正确删除方法:

控制面板应用删除,然后删除C:\Users\Administrator\AppData\Local\Docker这样就好了,再按照上方文档安装docker

docker配置

前端Umimax项目配置

首先,让我们看看如何配置前端项目的 Dockerfile 和 nginx.conf:

我的前端目录结构

image-20240307153313450

Dockerfile:

# 使用 Node.js 官方镜像作为基础
FROM node:latest as builder

# 设置工作目录
WORKDIR /hotel-admin

# 复制 package.json 和 pnpm-lock.yaml 到工作目录
COPY package.json pnpm-lock.yaml ./

# 安装依赖项
RUN npm install -g pnpm
RUN pnpm install

# 复制项目文件到工作目录
COPY . .

# 构建项目
RUN pnpm run build

# 设置 Nginx 镜像
FROM nginx:alpine

RUN mkdir -p /ruanjian/admin_front
# 将构建的项目复制到 Nginx 默认的 HTML 目录
COPY --from=builder /hotel-admin/dist /ruanjian/admin_front

# 复制 Nginx 配置文件
COPY nginx.conf /etc/nginx/conf.d/admin_front.conf

nginx.conf:

#admin
server {
  listen 8000;
  location / {
    root /ruanjian/admin_front;
    index index.html;
    try_files $uri $uri/ /index.html;
  }
  location /api/ {
    rewrite ^/api/(.*)$ /$1 break;
    # 下面的地址为你的后端地址
    proxy_pass http://host.docker.internal:1101;
  }
}

后端Nest项目配置

后端目录结构

Dockerfile:

# 使用 Node.js 官方镜像作为基础
FROM node:latest as builder

# 设置工作目录
WORKDIR /hotel-admin

# 复制 package.json 和 pnpm-lock.yaml 到工作目录
COPY package.json pnpm-lock.yaml ./

# 安装依赖项
RUN npm install -g pnpm
RUN pnpm install

# 复制项目文件到工作目录
COPY . .

# 构建项目
RUN pnpm run build

# 设置 Nginx 镜像
FROM nginx:alpine

RUN mkdir -p /ruanjian/admin_front
# 将构建的项目复制到 Nginx 默认的 HTML 目录
COPY --from=builder /hotel-admin/dist /ruanjian/admin_front

# 复制 Nginx 配置文件
COPY nginx.conf /etc/nginx/conf.d/admin_front.conf

nginx.conf:

#nest
server {
  listen 1101;
  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-Nginx-Proxy true;
    proxy_set_header Connection "";
    proxy_pass http://127.0.0.1:1101;
  }
}

docker-compose

最后,我们使用 Docker Compose 将前后端项目整合起来:

整体目录结构

docker-compose.yml

version: '3.7'
services:
  frontend:
    build: ./hotel-admin
    ports:
      - "8000:8000"
    networks:
      - umiadmin
      
  backend:
    build: ./nest-typeorm
    ports:
      - "1101:1101"
    depends_on:
      - mysql
    networks:
      - umiadmin

  mysql:
    image: mysql
    ports:
      - 3306:3306
    environment:
      - HOST_IP=$(ip route | awk 'NR==1 {print $3}')
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=umiadmin
    volumes:
      - /path/to/mysql/data:/var/lib/mysql
    networks:
      - umiadmin

  redis:
    image: redis
    ports:
      - 6379:6379
    volumes:
      - /path/to/redis/data:/data
    command: redis-server --appendonly yes
    networks:
      - umiadmin
networks:
  umiadmin:

遇到的问题

1.Nest 访问不到 MySQL

在配置mysql时,使用的host为127.0.0.1,无法连接到数据库,后面把host改为本地的ip地址时,是可以访问到的

2.Nginx 跨域问题

在前端的nginx.conf中proxy_pass http://127.0.0.1:1101;,请求接口 502,但是本地127.0.0.1:1101是可以请求的,所以应该是没有跨域成功,配置问题,chatgpt可得:在容器中,127.0.0.1 是指向容器本身的回环地址,而不是宿主机的回环地址。如果您希望容器中的应用程序能够访问宿主机上的服务,可以使用特殊的 DNS 名称 host.docker.internal(仅限于支持的平台)来引用宿主机的 IP 地址。所以我在后面使用了host.docker.internal来代替127.0.0.1,然后跨域成功!

3.文件夹复制时目标文件夹不存在

使用 mkdir -p 先创建目标文件夹,再进行文件复制。

例如:

RUN mkdir -p /ruanjian/admin_front
# 将构建的项目复制到 Nginx 默认的 HTML 目录
COPY --from=builder /hotel-admin/dist /ruanjian/admin_front

4.后端项目无法启动本来后端开始是使用cmd["pnpm","run","start"]

才运行成功,为什么在这里还要拿node镜像

感受

通过这次 Docker Compose 的部署经验,我学到了许多问题的解决方法,也加深了对 Docker 的理解。希望这篇文章对您有所帮助,如果有任何错误或疑问,请指出,我们一起学习进步。

image-20240307153519024
image-20240307153706465

在使用docker-compose时,会出现pnpm not fount问题,不知道为啥?希望有大哥解答下,后面加上了

文档