You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从本地访问host.docker.internal?Docker下Azurite连接问题

Docker Compose下Azurite SAS URI无法被本地前端解析的解决方案

服务概况

我在编写服务的Docker Compose时遇到问题,该服务端到端运行需4个组件:Angular前端、C# .NET 6后端、Azure Function(与当前问题无关)及Azurite。前端获取后端生成的嵌入SAS令牌的URI后上传文件至Azure存储,此功能正常。

问题描述

容器化后端生成的SAS URI为:http://host.docker.internal:10000/devstoreaccount1/user-uploads/3415dfde-636c-4f4e-b7ef-bfeb456466f3.zip.zip?{SAS_TOKEN_PART},但本地前端无法发起请求,DNS无法解析该名称。我希望从Docker外部连接Azurite,且不想在后端通过条件编译替换字符串,寻求合适解决方案。

Docker Compose配置

docker-compose.yml部分内容已脱敏,相关上下文不受影响:

version: '3'
services:
  api:
    build:
      context: CENSORED
      dockerfile: Dockerfile
    depends_on:
      - azurite
    environment:
      - DOCKER_URL=DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://host.docker.internal:10000/devstoreaccount1;
    volumes:
      - "${HOME}/.azure:/root/.azure"
    ports:
      - 443:443
      - 80:80
  azurite:
    image: mcr.microsoft.com/azure-storage/azurite
    ports:
      - 10000:10000
    volumes:
      - ./data:/data
    command: azurite --loose --blobHost 0.0.0.0 --blobPort 10000
  functions:
    build:
      context: CENSORED
      dockerfile: Dockerfile
    ports:
      - 7071:7071
    depends_on:
      - azurite
  frontend:
    build:
      context: CENSORED
      dockerfile: Dockerfile
    ports:
      - 4200:4200

已尝试的操作

  • 使用Macbook Pro M2 Pro,需支持Windows系统
  • 尝试过创建统一网络并加入所有组件
  • 尝试添加配置:
    extra_hosts:
        - "host.docker.internal:host-gateway"
    
    但URI无变化,连接仍失败。

可行解决方案

方案1:通过环境变量传递跨平台宿主机可达地址

核心思路是让后端生成的SAS URI使用宿主机可被外部解析的地址,通过环境变量动态注入,无需修改后端代码:

  1. 修改docker-compose.yml中api服务的环境变量,将BlobEndpoint的主机部分改为可配置的环境变量:
    environment:
      - DOCKER_URL=DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://${HOST_ADDRESS:-localhost}:10000/devstoreaccount1;
    
  2. 启动容器时,根据系统传递对应地址:
    • Mac/Linux终端:HOST_ADDRESS=localhost docker-compose up
    • Windows命令提示符:set HOST_ADDRESS=localhost && docker-compose up
      这样后端生成的SAS URI会是http://localhost:10000/...,前端可直接解析访问。

方案2:宿主机Hosts映射+Docker内部主机名

通过给Azurite设置固定容器名,并在宿主机映射该名称到本地回环地址,实现前后端统一解析:

  1. 修改docker-compose.yml中azurite服务,添加固定容器名:
    azurite:
      image: mcr.microsoft.com/azure-storage/azurite
      container_name: azurite
      ports:
        - 10000:10000
      volumes:
        - ./data:/data
      command: azurite --loose --blobHost 0.0.0.0 --blobPort 10000
    
  2. 修改api服务的DOCKER_URL环境变量,将BlobEndpoint改为http://azurite:10000/devstoreaccount1
  3. 在宿主机的Hosts文件中添加映射:
    • Mac/Linux:编辑/etc/hosts,添加127.0.0.1 azurite
    • Windows:编辑C:\Windows\System32\drivers\etc\hosts,添加127.0.0.1 azurite
      此时容器内部可通过Docker网络解析azurite,宿主机通过Hosts映射解析到本地,前端能正常访问生成的SAS URI。

方案3:后端转发文件上传请求

让前端将文件上传到后端API,由后端负责转发至Azurite,避免前端直接访问Azurite:

  1. 在.NET后端新增文件上传接口,接收前端文件后,使用Azure Storage SDK将文件上传至Azurite
  2. 前端直接调用后端上传接口,无需处理SAS URI
    此方案无需修改SAS URI生成逻辑,也不存在DNS解析问题,但需要额外编写后端转发逻辑。

内容的提问来源于stack exchange,提问作者Smibios

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 18:21:15