在服务器上使用 Docker 部署 Node.js 后端服务和前端项目

一、准备工作

  1. 服务器环境

    • 安装 Docker 和 Docker Compose:

      bash 复制代码
      # 安装 Docker
      curl -fsSL https://get.docker.com | sh
      systemctl start docker
      systemctl enable docker
      
      # 安装 Docker Compose
      sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
      sudo chmod +x /usr/local/bin/docker-compose
  2. 项目结构

    复制代码
    /project
    ├── backend/            # Node.js 后端
    │   ├── Dockerfile
    │   ├── package.json
    │   └── src/
    ├── frontend/           # 前端项目
    │   ├── Dockerfile
    │   ├── package.json
    │   └── public/
    └── docker-compose.yml   # 编排文件

二、部署 Node.js 后端服务

1. 编写 Dockerfile
dockerfile 复制代码
# backend/Dockerfile
FROM node:18-alpine

WORKDIR /app
COPY package*.json ./
RUN npm install

COPY . .
EXPOSE 3000  # 根据实际端口修改

CMD ["npm", "start"]  # 或 "node server.js"
2. 构建镜像
bash 复制代码
cd backend
docker build -t node-backend .
3. 验证运行
bash 复制代码
docker run -d -p 3000:3000 --name my-node-app node-backend

三、部署前端项目(以 React 为例)

1. 编写 Dockerfile
dockerfile 复制代码
# frontend/Dockerfile
FROM node:18-alpine as builder

WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build  # 生成静态文件到 /app/dist

# 使用 Nginx 托管
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
2. 构建镜像
bash 复制代码
cd frontend
docker build -t react-frontend .
3. 验证运行
bash 复制代码
docker run -d -p 80:80 --name my-react-app react-frontend

四、使用 Docker Compose 编排

1. 编写 docker-compose.yml
yaml 复制代码
version: '3.8'
services:
  backend:
    build: ./backend
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
    restart: unless-stopped

  frontend:
    build: ./frontend
    ports:
      - "80:80"
    depends_on:
      - backend
    restart: unless-stopped
2. 启动所有服务
bash 复制代码
docker-compose up -d  # 后台运行
3. 常用命令
bash 复制代码
docker-compose logs      # 查看日志
docker-compose down      # 停止服务
docker-compose restart   # 重启服务

五、进阶配置

1. 使用 .env 管理环境变量
  • docker-compose.yml 中引用:

    yaml 复制代码
    environment:
      - DB_HOST=${DB_HOST}
  • 创建 .env 文件:

    复制代码
    DB_HOST=mysql
2. 数据库服务(如 MySQL)
yaml 复制代码
services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
    volumes:
      - mysql_data:/var/lib/mysql
volumes:
  mysql_data:
3. Nginx 反向代理(可选)
nginx 复制代码
server {
  listen 80;
  server_name your-domain.com;

  location /api {
    proxy_pass http://backend:3000;
  }

  location / {
    proxy_pass http://frontend;
  }
}

六、访问服务

  • 前端:http://服务器IP
  • 后端 API:http://服务器IP:3000/api

常见问题

  1. 端口冲突

    • 确保服务器防火墙开放端口(如 80、3000)。
  2. 文件权限问题

    • 在 Dockerfile 中添加用户权限管理:

      dockerfile 复制代码
      RUN chown -R node:node /app
      USER node
  3. 构建缓存优化

    • COPY package.jsonRUN npm install 提前,利用 Docker 缓存。

通过以上步骤,你可以快速在服务器上部署全栈项目。实际应用中,可根据需求扩展数据库、负载均衡等配置。

相关推荐
互联网老欣2 分钟前
2025年保姆级教程:阿里云服务器部署Dify+Ollama,打造专属AI应用平台
服务器·阿里云·ai·云计算·dify·ollama·deepseek
羑悻的小杀马特31 分钟前
轻量跨云·掌控无界:Portainer CE + cpolar 让远程容器运维像点外卖一样简单——免复杂配置,安全直达对应集群
运维·网络·安全·docker·cpolar
悦悦欧呐呐呐呐1 小时前
数据库事务是什么,怎么用的
服务器·数据库·oracle
一直在学习的小白~2 小时前
npm发布脚手架流程
前端·npm·node.js
想唱rap3 小时前
C++ map和set
linux·运维·服务器·开发语言·c++·算法
CodeByV3 小时前
【Linux】Ext 系列文件系统深度解析:从磁盘到软硬链接
linux·服务器
梦在深巷、4 小时前
linux系统防火墙之iptables
linux·运维·服务器
u***j3244 小时前
JavaScript在Node.js中的进程管理
开发语言·javascript·node.js
Lay_鑫辰5 小时前
西门子诊断-状态和错误位(“轴”工艺对象 V1...3)
服务器·网络·单片机·嵌入式硬件·自动化
做人不要太理性5 小时前
【Linux系统】线程的同步与互斥:核心原理、锁机制与实战代码
linux·服务器·算法