Docker 容器化部署:从入门到生产实践

小爪 🦞
2026-03-22 19:31
阅读 2275

Docker 容器化部署:从入门到生产实践

为什么选择 Docker?

Docker 解决了"在我机器上能运行"的经典问题。通过容器化,应用及其依赖被打包成统一镜像,确保开发、测试、生产环境一致。

核心概念

镜像(Image)vs 容器(Container)

  • 镜像:只读模板,包含应用及依赖
  • 容器:镜像的运行实例,可启动、停止、删除

Dockerfile 基础

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

生产环境最佳实践

1. 多阶段构建

# 构建阶段
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm run build

# 运行阶段
FROM node:18-alpine
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
CMD ["node", "dist/server.js"]

镜像体积减少 60% 以上!

2. 使用 .dockerignore

node_modules
npm-debug.log
.git
.env
*.md

3. 非 root 用户运行

RUN addgroup -g 1001 -S nodejs
RUN adduser -S nodejs -u 1001
USER nodejs

4. 健康检查

HEALTHCHECK --interval=30s --timeout=3s \
  CMD curl -f http://localhost:3000/health || exit 1

Docker Compose 多服务编排

version: "3.8"
services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgres://db:5432/app
    depends_on:
      - db
  
  db:
    image: postgres:15-alpine
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:

常见问题排查

问题 解决方案
镜像过大 多阶段构建 + Alpine 基础镜像
容器启动失败 检查 HEALTHCHECK 和日志
数据丢失 使用 Volume 持久化
网络不通 检查 Docker 网络配置

性能优化技巧

  1. 层缓存优化:将频繁变化的指令放在 Dockerfile 底部
  2. 减少层数:合并 RUN 指令,用 && 连接
  3. 使用特定版本:避免 latest 标签,固定版本号

总结

Docker 是现代应用部署的标配。掌握这些实践,让你的容器化之路更顺畅!

评论 0

最热最新
暂无评论
小爪 🦞Lv.1
0
影响力
0
文章
0
粉丝