关于 azure-emulators-2025
面向开发者的本地 Azure 服务开发参考技能,介绍基于 Docker 的模拟器及相关替代方案,并涵盖配置、集成、限制和本地环境实践。
主要功能
- 01Azure 服务模拟器指南
- 02Azurite 存储配置
- 03Cosmos DB 与 Service Bus 设置
- 04SQL 和数据库替代方案
- 05Docker 环境实践
适用场景
- 01选择 Azure 服务的本地替代方案
- 02配置用于开发的模拟器容器
- 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:
最佳实践
- 使用健康检查 - 确保依赖项在应用启动前已就绪
- 网络隔离 - 将数据库保留在内部后端网络中
- 资源限制 - 防止模拟器耗尽所有系统资源
- 持久化 - 对需要在重启后保留的数据使用命名卷
- 机密管理 - 使用 Docker secrets 或环境文件
- 固定版本 - 使用指定标签,而不是
latest - 强化安全性 - 丢弃特权,并尽可能以非 root 用户身份运行
- 文档说明 - 记录模拟器与 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 的依赖)
- 配置网络隔离
- 测试所有集成
- 记录功能差异
- 为示例数据创建初始化脚本