前端專屬:Dockerfile & docker-compose.yml 從入門到實戰(zhàn)教程

作為資深前端,你不需要像運維一樣精通所有細節(jié),本教程聚焦前端項目(Vue3/Nuxt3/Node.js) 場景,帶你從「理解語法」到「手寫配置」再到「實戰(zhàn)部署」,所有示例均可直接復制使用。

一、核心前置認知

先明確兩個文件的定位(前端人話版):

  • Dockerfile:「單服務打包配方」—— 定義「如何把你的前端項目打包成 Docker 鏡像」,解決「環(huán)境一致」問題;
  • docker-compose.yml:「多服務編排腳本」—— 定義「如何啟動多個關聯(lián)容器(如前端+后端+數(shù)據(jù)庫)」,解決「本地/測試環(huán)境一鍵啟動」問題。

二、Dockerfile 完全教程(前端項目專用)

1. Dockerfile 核心語法(前端高頻用)

先記住這 8 個核心指令,覆蓋 90% 前端場景:

指令 作用(前端視角) 示例
FROM 指定基礎鏡像(如Node/Nginx) FROM node:20-alpine
WORKDIR 設置容器內工作目錄(相當于cd) WORKDIR /app
COPY 從本地復制文件到容器 COPY package*.json ./
RUN 執(zhí)行命令(裝依賴/打包) RUN npm install
ENV 設置環(huán)境變量 ENV NODE_ENV=production
EXPOSE 聲明容器暴露的端口(僅聲明) EXPOSE 3000
CMD 容器啟動后執(zhí)行的命令 CMD ["node", "server/index.mjs"]
COPY --from 從其他階段/鏡像復制文件(多階段構建) COPY --from=builder /app/dist ./

2. 分場景實戰(zhàn):前端項目 Dockerfile 寫法

場景1:Nuxt3(SSR/服務端渲染)

# 階段1:構建階段(用Node鏡像打包代碼)
FROM node:20-alpine AS builder  # alpine是輕量版,體積小
WORKDIR /app                    # 設置工作目錄為/app

# 第一步先復制package.json,利用Docker緩存(依賴不變就不用重裝)
COPY package*.json ./           
# 安裝依賴(國內環(huán)境加淘寶源,解決安裝慢)
RUN npm install --registry=https://registry.npmmirror.com

# 復制所有項目文件到容器
COPY . .
# 打包Nuxt3項目
RUN npm run build

# 階段2:生產階段(僅保留運行所需文件,精簡鏡像)
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production         # 生產環(huán)境變量

# 從構建階段復制打包后的產物
COPY --from=builder /app/.output ./
EXPOSE 3000                     # Nuxt默認端口

# 啟動命令(Nuxt3打包后入口是server/index.mjs)
CMD ["node", "server/index.mjs"]

場景2:Vue3 純靜態(tài)項目(Vite/CRA)

純靜態(tài)項目最終是 dist 文件夾,用 Nginx 鏡像部署更輕量:

# 階段1:構建階段
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install --registry=https://registry.npmmirror.com
COPY . .
RUN npm run build  # Vite/CRA打包命令,生成dist文件夾

# 階段2:生產階段(用Nginx鏡像)
FROM nginx:alpine AS runner
# 復制打包后的dist到Nginx默認靜態(tài)文件目錄
COPY --from=builder /app/dist /usr/share/nginx/html
# 可選:替換Nginx配置(解決前端路由刷新404)
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80  # Nginx默認端口

# Nginx啟動命令(鏡像自帶,可省略)
CMD ["nginx", "-g", "daemon off;"]

補充:Vue3 路由刷新404的nginx.conf(項目根目錄):

server {
    listen 80;
    server_name localhost;
    root /usr/share/nginx/html;
    index index.html;

    # 解決Vue History模式刷新404
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 緩存靜態(tài)資源(前端性能優(yōu)化)
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires 7d;
        add_header Cache-Control "public, max-age=604800";
    }
}

場景3:Node.js 接口服務(前端寫的Node中間層)

FROM node:20-alpine
WORKDIR /app

COPY package*.json ./
RUN npm install --registry=https://registry.npmmirror.com --production  # --production只裝生產依賴

COPY . .
ENV NODE_ENV=production
EXPOSE 3001

# 啟動Node服務(根據(jù)你的入口文件改)
CMD ["node", "app.js"]

3. Dockerfile 優(yōu)化技巧(前端必看)

  1. 利用緩存:先復制 package*.json 再裝依賴,依賴不變時,Docker 會復用緩存,構建速度提升 80%;
  2. 鏡像瘦身:用 alpine 版本鏡像(體積比完整版小90%),多階段構建只保留運行產物;
  3. 避免敏感信息:不要把 .env、密鑰等打包進鏡像,用 ENV 或外部掛載傳遞;
  4. 指定版本:Node/Nginx 鏡像要寫具體版本(如 node:20-alpine),不要用 latest(版本不穩(wěn)定)。

三、docker-compose.yml 完全教程

1. 核心概念(前端視角)

  • 服務(services):每個服務對應一個容器(如前端、后端、Redis);
  • 端口映射(ports):宿主機端口 → 容器端口(如 8080:3000);
  • 依賴(depends_on):指定服務啟動順序(如先啟動數(shù)據(jù)庫,再啟動后端);
  • 環(huán)境變量(environment):給容器傳環(huán)境變量;
  • 數(shù)據(jù)卷(volumes):持久化數(shù)據(jù)(如數(shù)據(jù)庫數(shù)據(jù)),避免容器刪除后數(shù)據(jù)丟失。

2. 核心語法(前端高頻用)

version: '3.8'  # compose文件版本(固定,選3.8即可)
services:       # 定義所有服務
  服務名1:       # 比如nuxt-app、mysql、redis
    build: .    # 從當前目錄的Dockerfile構建鏡像
    image: 鏡像名:版本  # 直接用現(xiàn)成鏡像(如nginx:alpine)
    container_name: 容器名  # 自定義容器名,方便管理
    ports:       # 端口映射:宿主機端口:容器端口
      - "8080:3000"
    environment: # 環(huán)境變量
      - NODE_ENV=production
      - API_BASE_URL=http://backend-api:3001
    depends_on:  # 依賴的服務(先啟動這些服務)
      - backend-api
      - redis
    volumes:     # 數(shù)據(jù)卷(本地目錄掛載到容器)
      - ./logs:/app/logs  # 本地logs目錄 → 容器/app/logs
    restart: always  # 容器掛了自動重啟

3. 實戰(zhàn):前端項目 docker-compose.yml 寫法

場景1:前端+后端+Redis 一站式啟動(開發(fā)/測試環(huán)境)

version: '3.8'
services:
  # 1. 前端Nuxt3服務
  nuxt-app:
    build: ./nuxt-project  # 前端項目目錄(里面有Dockerfile)
    container_name: nuxt-frontend
    ports:
      - "8080:3000"  # 訪問http://localhost:8080
    environment:
      - NODE_ENV=development
      - API_BASE_URL=http://backend-api:3001  # 訪問后端服務(用服務名當域名)
    depends_on:
      - backend-api
      - redis
    restart: always

  # 2. 后端Node接口服務
  backend-api:
    build: ./node-api  # 后端項目目錄
    container_name: node-backend
    ports:
      - "3001:3001"
    environment:
      - REDIS_URL=redis://redis:6379  # 訪問Redis服務
    depends_on:
      - redis
    restart: always

  # 3. Redis服務(直接用官方鏡像,不用自己寫Dockerfile)
  redis:
    image: redis:alpine
    container_name: my-redis
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data  # 持久化Redis數(shù)據(jù)
    restart: always

# 定義數(shù)據(jù)卷(持久化數(shù)據(jù))
volumes:
  redis-data:  # 自動創(chuàng)建數(shù)據(jù)卷,Redis數(shù)據(jù)存在這里

場景2:僅啟動前端Vue3靜態(tài)項目

version: '3.8'
services:
  vue-app:
    build: .  # 當前目錄有Dockerfile
    container_name: vue-static
    ports:
      - "80:80"  # 直接用80端口,訪問http://localhost
    restart: always

4. docker-compose 常用命令(前端必記)

# 啟動所有服務(后臺運行,-d=detach)
docker-compose up -d

# 構建并啟動(鏡像有修改時用)
docker-compose up -d --build

# 查看運行中的服務
docker-compose ps

# 查看某個服務的日志(排錯用)
docker-compose logs -f nuxt-app  # -f實時刷新

# 停止所有服務
docker-compose stop

# 停止并刪除容器、網絡(保留鏡像)
docker-compose down

# 停止并刪除容器、網絡、鏡像、數(shù)據(jù)卷(徹底清理)
docker-compose down -v --rmi all

四、完整實操流程(從0到1部署Nuxt3項目)

步驟1:準備文件

項目根目錄創(chuàng)建:

  • Dockerfile(用上面Nuxt3的配置)
  • .dockerignore(排除不需要打包的文件)
    node_modules
    .nuxt
    .output
    dist
    .env
    .git
    .vscode
    
  • docker-compose.yml(用上面場景2的配置)

步驟2:構建并啟動

# 1. 進入項目根目錄
cd your-nuxt-project

# 2. 構建并啟動容器
docker-compose up -d --build

# 3. 查看日志,確認啟動成功
docker-compose logs -f nuxt-app

# 4. 訪問項目
# 瀏覽器打開http://localhost:8080

步驟3:驗證與排錯

  • 訪問失?。合瓤炊丝谑欠駴_突(改docker-compose.yml的宿主機端口,如8081:3000);
  • 依賴安裝失?。涸贒ockerfile的npm install后加淘寶源;
  • 代碼修改后不生效:重新構建docker-compose up -d --build。

五、總結

  1. Dockerfile 核心:前端項目優(yōu)先用「多階段構建」,構建階段打包代碼,生產階段精簡鏡像(Node/Nginx二選一);
  2. docker-compose 核心:前端用它解決「多服務依賴啟動」問題,不用手動逐個啟動前端、后端、數(shù)據(jù)庫;
  3. 核心原則:前端寫配置時「只關注和項目相關的字段」(鏡像版本、端口、環(huán)境變量、啟動命令),不用深入底層原理。

按這個教程寫,你能覆蓋 Vue3/Nuxt3/Node.js 所有前端項目的容器化場景,后續(xù)對接公司的 K8s 平臺也只需要把 Docker 鏡像地址配置進去即可,完全滿足前端的部署需求。如果遇到具體的語法報錯或部署問題,隨時可以問。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容