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 技能,将使你在现代软件开发中更具竞争力。

相关推荐
刘海东刘海东2 分钟前
我的新论文的构思
人工智能
天佑木枫2 分钟前
AI:AI 开车撞了人,谁赔钱?——自动驾驶的法律黑洞
人工智能·机器学习·自动驾驶
云飞云共享云桌面10 分钟前
智能装备制造数字化实测:10人SolidWorks云桌面部署,云飞云方案替代传统单机工作站
运维·服务器·网络·人工智能·制造
江华森11 分钟前
人工智能 AI 大语言模型 多模态 — 从 API 调用到 Agent 实战
人工智能·语言模型·自然语言处理
2603_9552797011 分钟前
城市裂缝中的无声对话
人工智能
ifenxi爱分析13 分钟前
爱分析:中国企业智能体市场规模分析,数字劳动力交易是时代拐点
人工智能·大模型·agent·智能体
bloxed14 分钟前
大模型应用-筑基期【10:命令行对话脚本开发】
人工智能·大模型应用
武子康21 分钟前
调查研究-212 智谱 ZCode Harness for GLM-5.2:国产 Coding Agent 从“模型能力“走向“工程执行环境“
大数据·人工智能·深度学习·llm·claude·glm·智谱
枫叶林FYL21 分钟前
【强化学习】 12 EMO-R3:反思式强化学习——多模态大模型的情感推理框架
人工智能·数据挖掘
CTA量化套保22 分钟前
最新AI量化效率提升,用示例拆解练习压实路径
人工智能·python