在没有Docker Desktop的情况下,使用Docker + WSL启动Azure Event Hubs本地模拟器时遇到的问题

后端开发 2026-07-11

尝试按照 文档 的指引,利用docker compose,在Windows 11上的WSL 2 Ubuntu-24.04发行版中搭建本地Azure Event Hub仿真器。

docker compose文件看起来是这样的:

name: microsoft-azure-eventhubs
services:
  emulator:
    container_name: "eventhubs-emulator"
    image: "mcr.microsoft.com/azure-messaging/eventhubs-emulator:latest"
    volumes:
      - "/home/user/Config.json:/Eventhubs_Emulator/ConfigFiles/Config.json"
    ports:
      - "5672:5672"
      - "9092:9092"
      - "5300:5300"
    environment:
      BLOB_SERVER: azurite
      METADATA_SERVER: azurite
      ACCEPT_EULA: Y
    depends_on:
      - azurite
    networks:
      eh-emulator:
        aliases:
          - "eventhubs-emulator"
  azurite:
    container_name: "azurite"
    image: "mcr.microsoft.com/azure-storage/azurite:latest"
    ports:
      - "10000:10000"
      - "10001:10001"
      - "10002:10002"
    networks:
      eh-emulator:
        aliases:
          - "azurite"
networks:
  eh-emulator:

供参考,我们按文档规定使用 Config.json

{
    "UserConfig": {
        "NamespaceConfig": [
        {
            "Type": "EventHub",
            "Name": "emulatorNs1",
            "Entities": [
            {
                "Name": "eh1",
                "PartitionCount": "2",
                "ConsumerGroups": [
                {
                    "Name": "cg1"
                }
                ]
            }
            ]
        }
        ], 
        "LoggingConfig": {
            "Type": "File"
        }
    }
}

通过 docker compose up -d 启动时,Event Hub容器在几秒后崩溃,日志中输出如下:

eventhubs-emulator  | fail: a.E.aEb[0]
eventhubs-emulator  |       Emulator Start up probe Unsuccessful. MetadataStore Health status: Unhealthy BlobStore Health status: Unhealthy
eventhubs-emulator  | fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
eventhubs-emulator  |       Health check Emulator Health Check with status Unhealthy completed after 20081.4284ms with message 'Emulator Start up probe Unsuccessful. MetadataStore Health status: Unhealthy BlobStore Health status: Unhealthy'
eventhubs-emulator  | Retry 1 encountered an exception: Emulator Health Check failed.. Waiting 00:00:00 before next retry.
eventhubs-emulator  | fail: a.E.aEb[0]
eventhubs-emulator  |       Emulator Start up probe Unsuccessful. MetadataStore Health status: Unhealthy BlobStore Health status: Unhealthy
eventhubs-emulator  | fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
eventhubs-emulator  |       Health check Emulator Health Check with status Unhealthy completed after 20004.7113ms with message 'Emulator Start up probe Unsuccessful. MetadataStore Health status: Unhealthy BlobStore Health status: Unhealthy'
eventhubs-emulator  | Retry 2 encountered an exception: Emulator Health Check failed.. Waiting 00:00:00 before next retry.
eventhubs-emulator  | fail: a.E.aEb[0]
eventhubs-emulator  |       Emulator Start up probe Unsuccessful. MetadataStore Health status: Unhealthy BlobStore Health status: Unhealthy
eventhubs-emulator  | fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
eventhubs-emulator  |       Health check Emulator Health Check with status Unhealthy completed after 20002.2971ms with message 'Emulator Start up probe Unsuccessful. MetadataStore Health status: Unhealthy BlobStore Health status: Unhealthy'
eventhubs-emulator  | An error occurred: Emulator Health Check failed.

看来eventhub容器无法通过 eh-emulator 网络访问azurite(Blob存储仿真器)。

我们尝试了以下操作,但均未成功:

  • BLOB_SERVERMETADATA_SERVER 中设置azurite容器的IP地址
  • BLOB_SERVERMETADATA_SERVER 中设置宿主容器的IP地址

可能的原因是什么?

解决方案

在对busybox容器的连通性问题进行排查后:

  1. 可能成功完成 ping azurite
  2. nc -zv azurite 10000 成功
  3. ⚠️ wget "http://azurite:10000/" 挂起,出现以下消息:Connecting to 172.17.0.1:3128 (172.17.0.1:3128)

原来,代理配置是从主机注入到容器中的, 由于对azurite的连接通过http进行,代理无法将请求从 emulator 容器正确转发到 azurite 容器。

我们通过将http代理的通用环境变量设为空来强制禁用 emulator 内的代理使用:

services:
  emulator:
    container_name: "eventhubs-emulator"
    image: "mcr.microsoft.com/azure-messaging/eventhubs-emulator:latest"
    ...
    environment:
      BLOB_SERVER: azurite
      METADATA_SERVER: azurite
      ACCEPT_EULA: Y
      HTTP_PROXY: ''
      HTTPS_PROXY: ''
      http_proxy: ''
      https_proxy: ''
      NO_PROXY: ''
      no_proxy: ''
    ...

启动成功产生了以下日志:

eventhubs-emulator  | info: a.d.adt[0]
eventhubs-emulator  |       Emulator Service is Launching On Platform:CBL-Mariner/Linux,X64
eventhubs-emulator  | info: a.d.adt[0]
eventhubs-emulator  |       Instantiating service components
eventhubs-emulator  | info: a.d.adt[0]
eventhubs-emulator  |       Creating namespace, entities and consumer groups
eventhubs-emulator  | info: a.E.aEC[0]
eventhubs-emulator  |       Emulator is launching with config : {"LoggingConfig":{"Type":"File"},"NamespaceConfig":[{"Type":"EventHub","Name":"emulatorns1","Entities":[{"Name":"eh1","PartitionCount":2,"ConsumerGroups":[{"Name":"cg1"},{"Name":"$default"}]}]}]}
eventhubs-emulator  | info: a.d.adt[0]
eventhubs-emulator  |       Emulator Service is Successfully Up! ; Use connection string: "Endpoint=sb://localhost;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;". For more networking-options refer: "https://github.com/Azure/azure-event-hubs-emulator-installer?tab=readme-ov-file#networking-options"

以下是busy box命令,供参考:

docker run -it --rm --network microsoft-azure-eventhubs_eh-emulator busybox sh

请注意,也可能存在其他解决代理配置问题的方式, 例如:

  • $NO_PROXY 调整为对容器域名加入排除
  • 调整代理配置以实现正确的流量转发
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章