mcpField
A
azure-emulators-2025

azure-emulators-2025

github.com/josiahsiegel开发59156 次安装19 周前更新
代码仓库

关于 azure-emulators-2025

面向开发者的本地 Azure 服务开发参考技能,介绍基于 Docker 的模拟器及相关替代方案,并涵盖配置、集成、限制和本地环境实践。

主要功能

  1. 01Azure 服务模拟器指南
  2. 02Azurite 存储配置
  3. 03Cosmos DB 与 Service Bus 设置
  4. 04SQL 和数据库替代方案
  5. 05Docker 环境实践

适用场景

  1. 01选择 Azure 服务的本地替代方案
  2. 02配置用于开发的模拟器容器
  3. 03规划从 Azure 迁移到本地模拟器

安装

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

$npx skills add https://github.com/josiahsiegel/claude-plugin-marketplace --skill azure-emulators-2025

安装后在 Claude Code 中输入/azure-emulators-2025确认已加载。

详细介绍

Azure 服务本地开发模拟器(2025)

概述

此技能全面介绍了 2025 年可作为 Docker 容器用于本地开发的 Azure 服务模拟器。

可用的 Azure 模拟器

1. Azurite(Azure Storage 模拟器)

Azure Storage Emulator(已弃用)的官方替代品

镜像: mcr.microsoft.com/azure-storage/azurite:latest

支持的服务:

  • Blob Storage
  • Queue Storage
  • Table Storage

配置:

services:
  azurite:
    image: mcr.microsoft.com/azure-storage/azurite:latest
    container_name: azurite
    command: azurite --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0 --loose
    ports:
      - "10000:10000"  # Blob service
      - "10001:10001"  # Queue service
      - "10002:10002"  # Table service
    volumes:
      - azurite-data:/data
    restart: unless-stopped

标准开发连接字符串:

DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://azurite:10000/devstoreaccount1;QueueEndpoint=http://azurite:10001/devstoreaccount1;TableEndpoint=http://azurite:10002/devstoreaccount1;

功能:

  • 跨平台(Windows、Linux、macOS)
  • 使用 Node.js/JavaScript 编写
  • 支持最新的 Azure Storage API
  • 数据持久化到磁盘
  • 兼容 Azure Storage Explorer
  • --loose 标志可放宽验证(适用于本地开发)

2025 API 版本支持:

  • 最新版本(v3.35.0)面向 2025-11-05 API 版本
  • Blob 服务:2025-11-05
  • Queue 服务:2025-11-05
  • Table 服务:2025-11-05(预览版)
  • 支持 RA-GRS,可用于地理冗余复制测试

CLI 用法:

# Install via npm (alternative to Docker)
npm install -g azurite

# Run with custom location
azurite --location /path/to/data --debug /path/to/debug.log

应用程序集成:

// Node.js with @azure/storage-blob
const { BlobServiceClient } = require('@azure/storage-blob');

const connectionString = process.env.AZURITE_CONNECTION_STRING;
const blobServiceClient = BlobServiceClient.fromConnectionString(connectionString);
// .NET with Azure.Storage.Blobs
using Azure.Storage.Blobs;

var connectionString = Environment.GetEnvironmentVariable("AZURITE_CONNECTION_STRING");
var blobServiceClient = new BlobServiceClient(connectionString);
2. Azure SQL Server 2025

具备 AI 功能的最新 SQL Server

镜像: mcr.microsoft.com/mssql/server:2025-latest

2025 年功能:

  • 内置向量搜索,支持 AI 相似度查询
  • 在传统全文搜索之外支持语义查询
  • 优化锁定(TID 锁定、LAQ)
  • 原生支持 JSON 和 RegEx
  • 集成 Fabric Mirroring
  • 支持 REST API

配置:

services:
  sqlserver:
    image: mcr.microsoft.com/mssql/server:2025-latest
    container_name: sqlserver
    environment:
      - ACCEPT_EULA=Y
      - MSSQL_PID=Developer
      - MSSQL_SA_PASSWORD_FILE=/run/secrets/sa_password
    secrets:
      - sa_password
    ports:
      - "1433:1433"
    volumes:
      - sqlserver-data:/var/opt/mssql
      - ./init:/docker-entrypoint-initdb.d
    healthcheck:
      test: ["CMD-SHELL", "/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P $$MSSQL_SA_PASSWORD -Q 'SELECT 1' -C || exit 1"]
      interval: 10s
      timeout: 3s
      retries: 3
      start_period: 10s
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 4G
        reservations:
          cpus: '1'
          memory: 2G
    networks:
      - backend
    security_opt:
      - no-new-privileges:true
    restart: unless-stopped

secrets:
  sa_password:
    file: ./secrets/sa_password.txt

volumes:
  sqlserver-data:
    driver: local

连接字符串:

Server=sqlserver;Database=MyApp;User Id=sa;Password=YourStrong!Passw0rd;TrustServerCertificate=True;

重要说明:

  • Azure SQL Edge 于 2025 年 9 月 30 日停用——请改用 SQL Server 2025
  • 使用 mssql-tools18 支持 TLS 1.3(-C 标志会信任证书)
  • Developer 版可免费用于非生产环境
  • 在 macOS 上通过 Rosetta 2 支持 arm64

向量搜索示例(2025 年功能):

-- Create vector index for AI similarity search
CREATE TABLE Documents (
    Id INT PRIMARY KEY,
    Content NVARCHAR(MAX),
    ContentVector VECTOR(1536)
);

-- Perform similarity search
SELECT TOP 10 Id, Content
FROM Documents
ORDER BY VECTOR_DISTANCE(ContentVector, @queryVector);

2025 vnext-preview 功能:

  • 完全基于 Linux 的模拟器(跨平台:x64、ARM64、Apple Silicon)
  • 在 Apple Silicon 或 Microsoft ARM 上无需虚拟机
  • 支持变更源(2025 年 4 月起)
  • 支持文档 TTL(生存时间)
  • 支持 OpenTelemetry V2
  • 在网关模式下提供 NoSQL API
  • 目前处于预览阶段(仍在积极开发)

镜像: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview

3. Cosmos DB 模拟器

NoSQL 数据库模拟器

镜像: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview

配置:

services:
  cosmosdb:
    image: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
    container_name: cosmosdb
    environment:
      - AZURE_COSMOS_EMULATOR_PARTITION_COUNT=10
      - AZURE_COSMOS_EMULATOR_ENABLE_DATA_PERSISTENCE=true
      - AZURE_COSMOS_EMULATOR_IP_ADDRESS_OVERRIDE=127.0.0.1
    ports:
      - "8081:8081"       # Data Explorer
      - "10251:10251"
      - "10252:10252"
      - "10253:10253"
      - "10254:10254"
    volumes:
      - cosmos-data:/data/db
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 4G
    networks:
      - backend
    restart: unless-stopped

模拟器终结点:

https://localhost:8081

模拟器密钥(标准):

C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==

数据资源管理器: 访问 https://localhost:8081/_explorer/index.html

应用程序集成:

// Node.js with @azure/cosmos
const { CosmosClient } = require('@azure/cosmos');

const endpoint = 'https://localhost:8081';
const key = process.env.COSMOS_EMULATOR_KEY;
const client = new CosmosClient({ endpoint, key });
// .NET with Microsoft.Azure.Cosmos
using Microsoft.Azure.Cosmos;

var endpoint = "https://localhost:8081";
var key = Environment.GetEnvironmentVariable("COSMOS_EMULATOR_KEY");
var client = new CosmosClient(endpoint, key);

限制:

  • 性能无法代表生产环境
  • 本地开发仅限单个分区
  • 需要信任证书(自签名)

2025 年 Azure Service Bus 官方模拟器:

  • 作为官方 Docker 容器发布
  • 基于 Linux 的模拟器,支持跨平台
  • 依赖 SQL Server Linux
  • 支持 AMQP 协议(端口 5672)
  • 连接字符串格式中包含 UseDevelopmentEmulator=true
  • 当前限制:不支持 JMS 协议、分区实体或 AMQP Web Sockets

官方模拟器镜像: mcr.microsoft.com/azure-messaging/servicebus-emulator:latest

连接字符串:

Endpoint=sb://host.docker.internal;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;
4. Azure Service Bus 模拟器

消息队列模拟器

**注意:**官方模拟器对 Docker 的支持有限。可使用 RabbitMQ 作为替代方案。

官方模拟器(预览版):

services:
  servicebus-sql:
    image: mcr.microsoft.com/mssql/server:2025-latest
    environment:
      - ACCEPT_EULA=Y
      - MSSQL_SA_PASSWORD=ServiceBus123!
    volumes:
      - servicebus-sql-data:/var/opt/mssql

  servicebus:
    image: mcr.microsoft.com/azure-messaging/servicebus-emulator:latest
    depends_on:
      - servicebus-sql
    environment:
      - ACCEPT_EULA=Y
      - SQL_SERVER=servicebus-sql
      - SQL_SA_PASSWORD=ServiceBus123!
    ports:
      - "5672:5672"  # AMQP
    networks:
      - backend

RabbitMQ 替代方案(推荐):

services:
  rabbitmq:
    image: rabbitmq:3.14-alpine
    container_name: rabbitmq
    ports:
      - "5672:5672"   # AMQP
      - "15672:15672" # Management UI
    environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=admin123
    volumes:
      - rabbitmq-data:/var/lib/rabbitmq
    healthcheck:
      test: ["CMD", "rabbitmq-diagnostics", "ping"]
      interval: 30s
      timeout: 10s
      retries: 3
    networks:
      - backend
    restart: unless-stopped
5. PostgreSQL(Azure Database for PostgreSQL)

镜像: postgres:16.6-alpine

配置:

services:
  postgres:
    image: postgres:16.6-alpine
    container_name: postgres
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD_FILE=/run/secrets/postgres_password
      - POSTGRES_DB=myapp
    secrets:
      - postgres_password
    ports:
      - "5432:5432"
    volumes:
      - postgres-data:/var/lib/postgresql/data
      - ./init:/docker-entrypoint-initdb.d
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 3s
      retries: 3
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 2G
    networks:
      - backend
    security_opt:
      - no-new-privileges:true
    restart: unless-stopped

扩展: 匹配 Azure PostgreSQL Flexible Server 扩展:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pg_trgm";
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
6. MySQL(Azure Database for MySQL)

镜像: mysql:9.2

配置:

services:
  mysql:
    image: mysql:9.2
    container_name: mysql
    environment:
      - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql_root_password
      - MYSQL_DATABASE=myapp
      - MYSQL_USER=appuser
      - MYSQL_PASSWORD_FILE=/run/secrets/mysql_password
    secrets:
      - mysql_root_password
      - mysql_password
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
      - ./init:/docker-entrypoint-initdb.d
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"]
      interval: 10s
      timeout: 3s
      retries: 3
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 2G
    networks:
      - backend
    security_opt:
      - no-new-privileges:true
    restart: unless-stopped
7. Redis(Azure Cache for Redis)

镜像: redis:7.4-alpine

配置:

services:
  redis:
    image: redis:7.4-alpine
    container_name: redis
    command: >
      redis-server
      --appendonly yes
      --requirepass ${REDIS_PASSWORD}
      --maxmemory 512mb
      --maxmemory-policy allkeys-lru
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
      interval: 10s
      timeout: 3s
      retries: 3
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
    networks:
      - backend
    security_opt:
      - no-new-privileges:true
    restart: unless-stopped
8. Application Insights 替代方案(Jaeger + Grafana)

兼容 OpenTelemetry 的可观测性技术栈

services:
  jaeger:
    image: jaegertracing/all-in-one:latest
    container_name: jaeger
    ports:
      - "16686:16686"  # UI
      - "14268:14268"  # HTTP collector
      - "4317:4317"    # OTLP gRPC
      - "4318:4318"    # OTLP HTTP
    environment:
      - COLLECTOR_OTLP_ENABLED=true
    networks:
      - monitoring
    restart: unless-stopped

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3001:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
    volumes:
      - grafana-data:/var/lib/grafana
    networks:
      - monitoring
    restart: unless-stopped

完整的 Azure 技术栈示例

services:
  # Application Services
  frontend:
    build: ./frontend
    ports: ["3000:3000"]
    networks: [frontend]
    depends_on:
      backend:
        condition: service_healthy

  backend:
    build: ./backend
    ports: ["8080:8080"]
    networks: [frontend, backend]
    depends_on:
      sqlserver:
        condition: service_healthy
      redis:
        condition: service_started
      azurite:
        condition: service_started

  # Databases
  sqlserver:
    image: mcr.microsoft.com/mssql/server:2025-latest
    environment:
      - ACCEPT_EULA=Y
      - MSSQL_PID=Developer
      - MSSQL_SA_PASSWORD=${MSSQL_SA_PASSWORD}
    ports: ["1433:1433"]
    volumes: [sqlserver-data:/var/opt/mssql]
    networks: [backend]
    healthcheck:
      test: ["CMD-SHELL", "/opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P $$MSSQL_SA_PASSWORD -Q 'SELECT 1' -C"]
      interval: 10s

  postgres:
    image: postgres:16.6-alpine
    environment:
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    ports: ["5432:5432"]
    volumes: [postgres-data:/var/lib/postgresql/data]
    networks: [backend]
    healthcheck:
      test: ["CMD-SHELL", "pg_isready"]
      interval: 10s

  # Cache
  redis:
    image: redis:7.4-alpine
    command: redis-server --requirepass ${REDIS_PASSWORD}
    ports: ["6379:6379"]
    volumes: [redis-data:/data]
    networks: [backend]

  # Storage
  azurite:
    image: mcr.microsoft.com/azure-storage/azurite:latest
    command: azurite --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0 --loose
    ports: ["10000:10000", "10001:10001", "10002:10002"]
    volumes: [azurite-data:/data]
    networks: [backend]

  # NoSQL
  cosmosdb:
    image: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
    ports: ["8081:8081"]
    volumes: [cosmos-data:/data/db]
    networks: [backend]

  # Monitoring
  jaeger:
    image: jaegertracing/all-in-one:latest
    ports: ["16686:16686", "4317:4317"]
    networks: [monitoring]

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true
  monitoring:
    driver: bridge

volumes:
  sqlserver-data:
  postgres-data:
  redis-data:
  azurite-data:
  cosmos-data:

最佳实践

  1. 使用健康检查 - 确保依赖项在应用启动前已就绪
  2. 网络隔离 - 将数据库保留在内部后端网络中
  3. 资源限制 - 防止模拟器耗尽所有系统资源
  4. 持久化 - 对需要在重启后保留的数据使用命名卷
  5. 机密管理 - 使用 Docker secrets 或环境文件
  6. 固定版本 - 使用指定标签,而不是 latest
  7. 强化安全性 - 丢弃特权,并尽可能以非 root 用户身份运行
  8. 文档说明 - 记录模拟器与 Azure 服务之间的差异

已知限制

  • 性能:模拟器的速度低于 Azure 服务
  • 扩展能力:仅支持单实例,不支持集群
  • 功能:某些 Azure 专属功能无法在本地使用
  • SSL/TLS:自签名证书需要配置信任
  • Azure AD:本地不会复现身份验证
  • 网络:无法使用 VNet 和 Private Endpoints

迁移清单

从 Azure 迁移到 Docker 模拟器时:

  • 将 Azure Storage 连接字符串替换为 Azurite
  • 更新 SQL Server 连接字符串(移除 Azure 专属选项)
  • 使用模拟器终结点和密钥配置 Cosmos DB
  • 将 Service Bus 替换为 RabbitMQ 或模拟器
  • 为 Application Insights 配置替代方案
  • 更新身份验证(移除对 Azure AD 的依赖)
  • 配置网络隔离
  • 测试所有集成
  • 记录功能差异
  • 为示例数据创建初始化脚本

参考资料

评论

支持 Markdown