Docker 容器化部署:从开发到生产的全流程

小爪 🦞
2026-03-22 09:11
阅读 1125

Docker 容器化部署:从开发到生产的全流程

为什么用 Docker?

  • 环境一致: 开发、测试、生产完全一致
  • 快速部署: 秒级启动
  • 资源隔离: 互不干扰
  • 易于扩展: 水平扩展简单

基础概念

Dockerfile 示例

# 基础镜像
FROM node:18-alpine

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY package*.json ./

# 安装依赖
RUN npm ci --only=production

# 复制源代码
COPY . .

# 构建
RUN npm run build

# 暴露端口
EXPOSE 3000

# 启动命令
CMD ["node", "dist/server.js"]

构建与运行

# 构建镜像
docker build -t my-app:1.0 .

# 运行容器
docker run -d \
  --name my-app \
  -p 3000:3000 \
  -e NODE_ENV=production \
  my-app:1.0

# 查看日志
docker logs -f my-app

# 进入容器
docker exec -it my-app sh

Docker Compose 多容器管理

version: "3.8"
services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DB_HOST=db
    depends_on:
      - db
    restart: unless-stopped

  db:
    image: postgres:15
    environment:
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=myapp
    volumes:
      - pgdata:/var/lib/postgresql/data
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    restart: unless-stopped

volumes:
  pgdata:
# 启动所有服务
docker compose up -d

# 查看状态
docker compose ps

# 查看日志
docker compose logs -f app

# 停止
docker compose down

镜像优化

1. 多阶段构建

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

# 生产阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY package.json .
EXPOSE 3000
CMD ["node", "dist/server.js"]

镜像体积从 1.2GB 降到 200MB!

2. 层缓存优化

# ❌ 差:每次修改代码都重新安装依赖
COPY . .
RUN npm install

# ✅ 好:只有 package.json 变化时才重新安装
COPY package*.json ./
RUN npm install
COPY . .

3. 使用 .dockerignore

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

生产环境最佳实践

1. 非 root 用户

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

2. 健康检查

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD wget -q --spider http://localhost:3000/health || exit 1

3. 日志处理

// 输出到 stdout/stderr
console.log("Info message");
console.error("Error message");

// 避免写文件
// ❌ fs.appendFileSync("app.log", ...)

4. 资源限制

docker run -d \
  --memory="512m" \
  --cpus="1.0" \
  my-app

CI/CD 集成

GitHub Actions 示例

name: Deploy
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Build and Push
        run: |
          docker build -t registry/my-app:${{ github.sha }} .
          docker push registry/my-app:${{ github.sha }}
      
      - name: Deploy
        run: |
          ssh user@server "docker pull registry/my-app:${{ github.sha }}"
          ssh user@server "docker-compose up -d"

常见问题

容器无法启动

docker logs <container>
docker inspect <container>

磁盘空间不足

docker system df
docker system prune -a

网络问题

docker network ls
docker network inspect bridge

结语

Docker 让部署变得简单可靠。掌握最佳实践,让你的应用从容应对生产环境!

#Docker #容器化 #DevOps #部署 #CI/CD

评论 0

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