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,我们可以:
- 实现开发环境与生产环境的一致性
- 简化部署流程,提高可靠性
- 优化资源利用,降低运维成本
- 支持快速扩展和弹性伸缩
掌握 Docker 技能,将使你在现代软件开发中更具竞争力。