mcpField
D
docker-deployment

docker-deployment

github.com/pluginagentmarketplace云与 DevOps2523 次安装42 周前更新
代码仓库

关于 docker-deployment

docker-deployment 是一项帮助 Node.js 开发者学习使用 Docker 容器化和部署应用的技能。内容从 Dockerfile、镜像和容器入门,延伸至 Compose、生产实践及 CI/CD。

主要功能

  1. 01编写 Node.js 应用的 Dockerfile
  2. 02构建和运行 Docker 镜像与容器
  3. 03使用 Docker Compose 管理服务
  4. 04配置环境变量、卷和健康检查
  5. 05学习镜像优化与生产部署实践

适用场景

  1. 01在开发、预发布和生产环境间保持一致
  2. 02容器化 Node.js 微服务
  3. 03将 Docker 构建接入 CI/CD 流水线

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/pluginagentmarketplace/custom-plugin-nodejs --skill docker-deployment

安装后在 Claude Code 中输入/docker-deployment确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

assets/
config.yaml
references/
GUIDE.md
scripts/
helper.py

详细介绍

Docker 部署技能

掌握使用 Docker 容器化和部署 Node.js 应用,实现一致、可移植的部署。

快速开始

通过 3 个步骤将 Node.js 应用 Docker 化:

  1. 创建 Dockerfile - 定义容器镜像
  2. 构建镜像 - docker build -t myapp .
  3. 运行容器 - docker run -p 3000:3000 myapp

核心概念

基础 Dockerfile
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY . .

EXPOSE 3000

CMD ["node", "src/index.js"]
多阶段构建(优化版)
# Build stage
FROM node:18-alpine AS builder

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY . .

# Production stage
FROM node:18-alpine

WORKDIR /app

# Copy from builder
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app .

# Create non-root user
RUN addgroup -g 1001 -S nodejs && \
    adduser -S nodejs -u 1001

USER nodejs

EXPOSE 3000

HEALTHCHECK --interval=30s --timeout=3s \
  CMD node healthcheck.js || exit 1

CMD ["node", "src/index.js"]

学习路径

初级(1-2 周)
  • ✅ 了解 Docker 基础知识
  • ✅ 创建简单的 Dockerfile
  • ✅ 构建并运行容器
  • ✅ 管理卷和网络
中级(3-4 周)
  • ✅ 多阶段构建
  • ✅ Docker Compose
  • ✅ 环境变量
  • ✅ 健康检查
高级(5-6 周)
  • ✅ 镜像优化
  • ✅ 生产环境最佳实践
  • ✅ 容器编排
  • ✅ CI/CD 集成

Docker Compose

# docker-compose.yml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://db:5432/myapp
      - REDIS_URL=redis://redis:6379
    depends_on:
      - db
      - redis
    restart: unless-stopped

  db:
    image: postgres:15-alpine
    environment:
      - POSTGRES_USER=myapp
      - POSTGRES_PASSWORD=secret
      - POSTGRES_DB=myapp
    volumes:
      - postgres-data:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    volumes:
      - redis-data:/data

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - app

volumes:
  postgres-data:
  redis-data:
Docker Compose 命令
# Start services
docker-compose up -d

# View logs
docker-compose logs -f app

# Stop services
docker-compose down

# Rebuild images
docker-compose up -d --build

# Scale services
docker-compose up -d --scale app=3

.dockerignore

node_modules
npm-debug.log
.git
.gitignore
.env
.env.local
.vscode
*.md
tests
coverage
.github
Dockerfile
docker-compose.yml

Docker 命令

# Build image
docker build -t myapp:latest .

# Run container
docker run -d -p 3000:3000 --name myapp myapp:latest

# View logs
docker logs -f myapp

# Enter container
docker exec -it myapp sh

# Stop container
docker stop myapp

# Remove container
docker rm myapp

# List images
docker images

# Remove image
docker rmi myapp:latest

# Prune unused resources
docker system prune -a

环境变量

# In Dockerfile
ENV NODE_ENV=production
ENV PORT=3000

# Or in docker-compose.yml
environment:
  - NODE_ENV=production
  - PORT=3000

# Or from .env file
env_file:
  - .env.production

持久化卷

services:
  app:
    volumes:
      - ./logs:/app/logs              # Bind mount
      - node_modules:/app/node_modules # Named volume

volumes:
  node_modules:

健康检查

# In Dockerfile
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s \
  CMD node healthcheck.js || exit 1
// healthcheck.js
const http = require('http');

const options = {
  host: 'localhost',
  port: 3000,
  path: '/health',
  timeout: 2000
};

const request = http.request(options, (res) => {
  console.log(`STATUS: ${res.statusCode}`);
  process.exit(res.statusCode === 200 ? 0 : 1);
});

request.on('error', (err) => {
  console.log('ERROR:', err);
  process.exit(1);
});

request.end();

镜像优化

# Use Alpine (smaller base image)
FROM node:18-alpine  # 180MB vs node:18 (1GB)

# Multi-stage build (remove build dependencies)
# Use .dockerignore (exclude unnecessary files)
# npm ci instead of npm install (faster, deterministic)
# Only production dependencies
RUN npm ci --only=production

# Combine RUN commands (fewer layers)
RUN apk add --no-cache git && \
    npm ci && \
    apk del git

生产环境最佳实践

FROM node:18-alpine

# Don't run as root
RUN addgroup -g 1001 -S nodejs && \
    adduser -S nodejs -u 1001

WORKDIR /app

COPY --chown=nodejs:nodejs package*.json ./
RUN npm ci --only=production

COPY --chown=nodejs:nodejs . .

USER nodejs

# Health check
HEALTHCHECK CMD node healthcheck.js || exit 1

# Use node instead of npm start (better signal handling)
CMD ["node", "src/index.js"]

部署到 Docker Hub

# Login
docker login

# Tag image
docker tag myapp:latest username/myapp:1.0.0
docker tag myapp:latest username/myapp:latest

# Push to Docker Hub
docker push username/myapp:1.0.0
docker push username/myapp:latest

# Pull from Docker Hub
docker pull username/myapp:latest

使用 GitHub Actions 实现 CI/CD

name: Docker Build & Deploy

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - uses: docker/setup-buildx-action@v2

      - uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      - uses: docker/build-push-action@v4
        with:
          push: true
          tags: username/myapp:latest
          cache-from: type=gha
          cache-to: type=gha,mode=max

常见问题与解决方案

Node 模块缓存
# Cache node_modules layer
COPY package*.json ./
RUN npm ci
COPY . .  # This doesn't rebuild node_modules
信号处理
# Use node directly (not npm)
CMD ["node", "src/index.js"]

# In app: Handle SIGTERM
process.on('SIGTERM', () => {
  server.close(() => process.exit(0));
});

适用场景

在以下情况下使用 Docker 部署:

  • 需要保持环境一致(开发、预发布、生产)
  • 部署微服务
  • 希望轻松扩展和编排
  • 使用云平台(AWS、GCP、Azure)
  • 实施 CI/CD 流水线

相关技能

  • Express REST API(容器化 API)
  • 数据库集成(多容器配置)
  • 测试与调试(在容器中测试)
  • 性能优化(优化镜像)

资源

评论

支持 Markdown