Docker 部署实战:前端应用容器化指南

Docker 部署实战:前端应用容器化指南

什么是 Docker?

Docker 是一个开源平台,用于开发、部署和运行应用程序。它使用容器化技术,将应用程序及其依赖打包在一个独立的容器中。

Docker 的优势

  • 一致性:开发环境与生产环境一致
  • 隔离性:容器之间相互隔离
  • 可移植性:一次构建,到处运行
  • 轻量级:共享宿主机内核,启动快速

Docker 基础概念

镜像(Image)

只读的模板,包含运行应用所需的所有文件和配置。

容器(Container)

镜像的运行实例,可以启动、停止、删除。

Dockerfile

定义如何构建镜像的文本文件。

创建 Dockerfile

前端应用的 Dockerfile

dockerfile 复制代码
FROM node:18-alpine AS build

WORKDIR /app

COPY package*.json ./
RUN npm ci

COPY . .
RUN npm run build

FROM nginx:alpine

COPY --from=build /app/dist /usr/share/nginx/html

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

多阶段构建优化

dockerfile 复制代码
FROM node:18-alpine AS builder

WORKDIR /app

COPY package.json package-lock.json ./
RUN npm ci --only=production

COPY . .
RUN npm run build

FROM nginx:1.25-alpine

COPY --from=builder /app/dist /usr/share/nginx/html

COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 80

USER nginx

CMD ["nginx", "-g", "daemon off;"]

Docker Compose

多容器编排

yaml 复制代码
version: '3.8'

services:
  frontend:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "80:80"
    environment:
      - NODE_ENV=production
    networks:
      - app-network

  api:
    build:
      context: ./api
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/app
    networks:
      - app-network
    depends_on:
      - db

  db:
    image: postgres:14-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=pass
      - POSTGRES_DB=app
    networks:
      - app-network

volumes:
  postgres_data:

networks:
  app-network:
    driver: bridge

优化 Docker 镜像

使用 .dockerignore

复制代码
node_modules
npm-debug.log
.git
dist

选择合适的基础镜像

dockerfile 复制代码
# 推荐:使用 alpine 版本,体积更小
FROM node:18-alpine

# 避免:完整的 Debian 镜像体积较大
FROM node:18

清理构建缓存

dockerfile 复制代码
RUN npm ci --only=production && \
    rm -rf /root/.npm /root/.cache

部署流程

本地开发

bash 复制代码
docker-compose up --build

生产环境部署

bash 复制代码
docker build -t my-app:latest .
docker tag my-app:latest registry.example.com/my-app:latest
docker push registry.example.com/my-app:latest

使用 CI/CD

yaml 复制代码
name: Docker Build

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
      - uses: actions/checkout@v3
      
      - name: Build Docker image
        run: docker build -t my-app .
        
      - name: Push to registry
        run: |
          docker login -u ${{ secrets.DOCKER_USER }} -p ${{ secrets.DOCKER_PASS }}
          docker push my-app

Docker 网络配置

网络模式

bash 复制代码
# 桥接模式(默认)
docker run --network bridge my-app

# 主机网络
docker run --network host my-app

# 自定义网络
docker network create app-network
docker run --network app-network my-app

数据持久化

卷(Volumes)

bash 复制代码
docker volume create my-data
docker run -v my-data:/app/data my-app

绑定挂载

bash 复制代码
docker run -v $(pwd)/data:/app/data my-app

安全最佳实践

非 root 用户运行

dockerfile 复制代码
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

最小权限原则

dockerfile 复制代码
# 不要以 root 身份运行
USER root  # ❌
USER appuser  # ✅

定期更新镜像

bash 复制代码
docker pull node:18-alpine

总结

Docker 容器化已经成为现代应用部署的标准方式。通过 Docker,我们可以:

  1. 实现开发环境与生产环境的一致性
  2. 简化部署流程,提高可靠性
  3. 优化资源利用,降低运维成本
  4. 支持快速扩展和弹性伸缩

掌握 Docker 技能,将使你在现代软件开发中更具竞争力。

相关推荐
JackLam2 小时前
AI-安装ChatGpt Codex
人工智能
强哥聊算力2 小时前
《算力江湖·英伟达传奇》第七集:ChatGPT出现前夜,英伟达发生了什么?
服务器·人工智能·算法·ai·chatgpt·gpu算力
吴佳浩3 小时前
Run:ai 开源了,我把 GPU 编排摆回 AI 栈里看了一遍
人工智能
IT_Octopus4 小时前
【零基础入门 LLM 开发 · Day 13】:LangChain 的对话记忆——Message 对象版
人工智能·python·langchain
2603_965148115 小时前
社区与学习资源:从入门到精通的API选品学习路径
数据库·人工智能·python·学习·数据挖掘
LiuPig刘皮哥5 小时前
2026年开源3D陪玩对比:xiaoke.ai、AIRI、Open-LLM-VTuber、Amica 有什么、没有什么
人工智能·3d·开源
西柚小萌新5 小时前
【岗位面试】--成都博维数孪 - 工业 AI 解决方案顾问
人工智能·面试·职场和发展
Luminbox紫创测控5 小时前
车载LiDAR强光测试的实验设计方法与数据分析
人工智能·数据挖掘·数据分析·车载系统·安全性测试·太阳光模拟器
建筑工程企业管理系统6 小时前
工程进度统计管理系统自动化汇总数据,解决施工企业手工对账误差难题
大数据·人工智能·自动化
唠点键盘之外的6 小时前
27 存量系统接大模型:旁挂一个 AI 微服务,老架构一行不改
人工智能·微服务·架构