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

相关推荐
山西茄子11 小时前
DeepStream9.0 inference_builder
人工智能·deepstream
鲸采云SRM采购管理系统11 小时前
供应链高效管控:依托鲸采云 SRM AI+飞书 精准筛选优质供应商
人工智能·飞书
@蔓蔓喜欢你11 小时前
前端架构演进:从单体到微前端
人工智能·ai
weixin_4261507011 小时前
AI辅助Oracle容量规划:告别拍脑袋扩容
运维·数据库·人工智能·oracle
团象科技11 小时前
当跨境业务负载陡增,谷歌云AI算力在多市场布局里扮演什么角色
人工智能
malog_11 小时前
PyTorch图像数据加载实战指南
图像处理·人工智能·pytorch·python
程序猿编码11 小时前
大模型的“文字障眼法“:FlipAttack 文本反转越狱技术全解析
linux·python·ai·大模型
想ai抽11 小时前
hermes-kanban-安装与操作手册
ai·agent·hermes
Yunzenn11 小时前
深度分析字节最新研究cola-DLM第 01 章:语言生成的三次范式之争 —— 从 RNN 到 AR 到扩散
linux·人工智能·rnn·深度学习·机器学习·架构·transformer