跳到主要内容

Docker容器化

容器是现代部署的基础。前端工程师为什么必须懂 Docker:

  • 本地开发起多服务一键 up(Node + MySQL + Redis + Nginx)
  • 部署到任何机器都是同一行为,告别"在我机器上是好的"
  • K8s 的最小调度单位是 Pod,Pod 里跑的是容器
  • CI 流水线里几乎一切都跑在容器里

这一章覆盖什么

  • namespace / cgroup / unionfs 怎么造出容器
  • Dockerfile 写法,多阶段构建把 1GB 镜像砍到 50MB
  • docker-compose 编排本地开发环境
  • 网络模式、跨容器通信、端口映射
  • 数据卷与持久化策略
  • 镜像仓库与 CI 集成
  • 生产安全:非 root、镜像扫描、资源限制

文档清单

文档解决的问题
容器核心原理namespace/cgroup/UnionFS、容器和虚拟机的区别
Dockerfile 最佳实践与多阶段构建指令顺序、缓存、多阶段、安全基线
镜像分层与体积优化分层原理、Alpine vs Debian、distroless
docker-compose 编排实战service、network、volume、depends_on、profile
网络模式与跨容器通信bridge/host/none/overlay、DNS、端口映射
数据卷与持久化volume、bind mount、tmpfs、备份策略
镜像仓库与 CI 集成Docker Hub、Harbor、ACR、buildx、多架构
生产安全与资源限制非 root、capabilities、seccomp、CPU/内存限制

速查表

# 前端 SPA 最小 Dockerfile
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
# docker-compose.yml 本地开发
services:
web:
build: .
ports: ["3000:3000"]
volumes: ["./:/app", "/app/node_modules"]
environment:
DATABASE_URL: postgres://app:app@db:5432/app
depends_on: [db]
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: app
volumes: ["pgdata:/var/lib/postgresql/data"]
volumes:
pgdata: