如何从本地访问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系统
- 尝试过创建统一网络并加入所有组件
- 尝试添加配置:
但URI无变化,连接仍失败。extra_hosts: - "host.docker.internal:host-gateway"
可行解决方案
方案1:通过环境变量传递跨平台宿主机可达地址
核心思路是让后端生成的SAS URI使用宿主机可被外部解析的地址,通过环境变量动态注入,无需修改后端代码:
- 修改
docker-compose.yml中api服务的环境变量,将BlobEndpoint的主机部分改为可配置的环境变量:environment: - DOCKER_URL=DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://${HOST_ADDRESS:-localhost}:10000/devstoreaccount1; - 启动容器时,根据系统传递对应地址:
- Mac/Linux终端:
HOST_ADDRESS=localhost docker-compose up - Windows命令提示符:
set HOST_ADDRESS=localhost && docker-compose up
这样后端生成的SAS URI会是http://localhost:10000/...,前端可直接解析访问。
- Mac/Linux终端:
方案2:宿主机Hosts映射+Docker内部主机名
通过给Azurite设置固定容器名,并在宿主机映射该名称到本地回环地址,实现前后端统一解析:
- 修改
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 - 修改
api服务的DOCKER_URL环境变量,将BlobEndpoint改为http://azurite:10000/devstoreaccount1 - 在宿主机的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。
- Mac/Linux:编辑
方案3:后端转发文件上传请求
让前端将文件上传到后端API,由后端负责转发至Azurite,避免前端直接访问Azurite:
- 在.NET后端新增文件上传接口,接收前端文件后,使用Azure Storage SDK将文件上传至Azurite
- 前端直接调用后端上传接口,无需处理SAS URI
此方案无需修改SAS URI生成逻辑,也不存在DNS解析问题,但需要额外编写后端转发逻辑。
内容的提问来源于stack exchange,提问作者Smibios
相关产品推荐
相关产品推荐

