脚本网 > 服务器 > docker构建并启动前端完整流程

docker构建并启动前端完整流程

admin 服务器

docker文件示例代码:

# Use a minimal image for development
FROM node:18-alpine

# Set working directory inside the container
WORKDIR /app

# Copy package.json and package-lock.json (or yarn.lock) into the container
COPY package.json package-lock.json* ./

# Install the app dependencies with --legacy-peer-deps to bypass the peer dependency conflict
RUN npm install --legacy-peer-deps

# Copy the rest of the application files into the container
COPY . .

# Expose the port the app will run on
EXPOSE 3000

# Start the Next.js app in development mode
CMD ["npm", "run", "dev"]

这段 Dockerfile 用于构建一个基于 Node.js 18 Alpine 版本的容器,并运行一个 Next.js 应用。

逐行解析

1. 选择基础镜像

FROM node:18-alpine
  • 使用 node:18-alpine 作为基础镜像,alpine轻量级 Linux 版本,比 node:18 体积更小,减少 Docker 镜像的大小。

2. 设置工作目录

WORKDIR /app
  • 容器内 创建 /app 目录,并把它作为 当前工作目录
  • 之后的所有操作都会在 /app 目录下执行。

3. 复制package.json和package-lock.json

COPY package.json package-lock.json* ./
  • 只复制 package.jsonpackage-lock.json,避免不必要的文件影响 npm install 缓存。
  • package-lock.json* 这样写是为了:
    • 兼容 package-lock.jsonpackage-lock.json.gz(如果存在)。

4. 安装依赖

RUN npm install --legacy-peer-deps
  • npm install 安装 Node.js 依赖
  • --legacy-peer-deps 选项用于:
    • 跳过 peerDependencies(依赖版本冲突时不报错)
    • 适用于 旧项目或有冲突的依赖

5. 复制项目代码

COPY . .
  • 复制 本地所有文件 到 容器的 /app/ 目录。
  • 这里 不会重复安装依赖,因为 npm install 早就运行过了。

6. 开放端口

EXPOSE 3000
  • 这个 只是声明 容器会使用 3000 端口,但默认不会让外部访问。
  • 真正让外部访问时,需要 -p 参数:
    docker run -p 3000:3000 my-next-app
    
    这样才能 映射端口,让浏览器访问 http://localhost:3000

7. 运行 Next.js 应用

CMD ["npm", "run", "dev"]
  • 容器启动时执行 npm run dev,即 开发模式运行 Next.js
  • 这个命令等价于:
    npm run dev
    
    • dev 脚本通常在 package.json 里:
      "scripts": {
        "dev": "next dev"
      }
      
    • Next.js 开发服务器会在 localhost:3000 运行

完整流程

  1. 基于 node:18-alpine 创建一个容器
  2. 在 /app 目录下工作
  3. 复制 package.json 并安装依赖
  4. 复制整个项目代码
  5. 暴露 3000 端口
  6. 运行 npm run dev 启动 Next.js 服务器

如何使用

1. 构建镜像

docker build -t my-next-app .

2. 运行容器

docker run -p 3000:3000 my-next-app

然后在浏览器访问:

http://localhost:3000

如果一切正常,你会看到 Next.js 应用的页面!