在服务器上使用 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.json 和 RUN npm install 提前,利用 Docker 缓存。

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

相关推荐
爱莉希雅&&&13 小时前
GitLab 完整学习笔记
linux·运维·服务器
java_logo13 小时前
Docker 部署 EmulatorJS:轻松搭建浏览器复古游戏平台
游戏·docker·容器·复古游戏·轩辕镜像·emulatorjs·红白机
陈希12315 小时前
Linux 服务器性能排查手册(2026):CPU、内存、磁盘IO、网络四大瓶颈定位
linux·服务器·网络
方便面不加香菜15 小时前
Docker Container --容器及容器的操作案例详解
运维·docker·容器
用户0873086548716 小时前
用 GUI 自动化写了一个群聊 AI:5 个真实事故,和 7 条让 AI 不像机器人的设计
node.js
测试界的小码农18 小时前
【Linux 命令实战(03):文件创建、复制、移动与删除,掌握 touch、mkdir、cp、mv、rm】
linux·服务器·php
|_⊙18 小时前
网络层协议 IP
服务器·网络·tcp/ip
叼烟扛炮19 小时前
Linux 学习笔记(六十):单线程的逆袭——epoll 高并发服务器实战
linux·服务器·网络·笔记·学习·算法
H.莓飛20 小时前
【C++】【STL】vector_OJ题
linux·服务器·开发语言·数据结构·c++·visual studio
Rabitebla20 小时前
【Linux操作系统】进程篇(十一):进程程序替换——从底层原理到 exec 函数族
linux·服务器·c++·笔记·学习·算法