我在 docker swarm 的所有节点上安装了 Azure Arc。我想使用他们的托管标识来访问 Azure 资源。从主机查询访问令牌工作正常,但我很难从容器内部获得相同的访问权限。
我尝试了
extra_host
、端口映射等,但我不断收到连接拒绝/连接失败错误。 host
网络模式选项可能会起作用,但在 docker swarm 中不可用。我也找不到任何有关将 Azure Arc 端点绑定从 127.0.0.1
更改为不同网络接口的文档。
我现在基本上拥有的是:
version: '3'
services:
api:
ports:
- '5127:8080'
- '40342:40342'
environment:
- 'IMDS_ENDPOINT=http://127.0.0.1:40342'
- 'IDENTITY_ENDPOINT=http://127.0.0.1:40342/metadata/identity/oauth2/token'
如何让 docker 容器访问身份端点,以便我的 ASP.NET 服务器可以在 azure 中对自身进行身份验证?
启用 Azure Arc 的服务器在物理服务器的本地主机上公开 IMDS(Azure 实例元数据服务)端点。默认情况下,无法从 Docker 容器内访问该端点,因为容器与主机网络隔离。
由于您无法直接更改 Azure Arc 端点的绑定,因此您可以尝试在将请求转发到 IMDS 端点的主机上运行代理服务器。然后可以将 Docker 容器配置为与此代理通信,而不是直接与 IMDS 端点通信。
server {
listen 80;
location / {
proxy_pass http://127.0.0.1:40342;
proxy_http_version 1.1;
proxy_set_header Host $host;
}
}
然后,您可以在 Docker 外部的主机上运行
nginx
,但监听 Docker 容器可访问的网络接口。
在 Docker Compose 文件中,您需要将环境变量设置为指向主机代理而不是本地主机。
version: '3'
services:
api:
ports:
- '5127:8080'
environment:
- 'IMDS_ENDPOINT=http://host.docker.internal:80'
- 'IDENTITY_ENDPOINT=http://host.docker.internal:80/metadata/identity/oauth2/token'
通过这些更改,Docker 容器中的 ASP.NET 服务器应该能够通过主机代理访问 Azure Arc 身份终结点。