具有docker compose的容器具有不同的行为,具体取决于执行它们的机器

具有docker compose的容器具有不同的行为,具体取决于执行它们的机器,docker,asp.net-core,docker-compose,traefik,Docker,Asp.net Core,Docker Compose,Traefik,你好 我正试图让下面的docker compose在我的机器上工作,但当我试图从容器B访问容器A的url时,出现了一些404错误 先验地,唯一不在源代码管理中的是对主机文件的修改,我必须在其中添加以下行 127.0.0.1 idsrv4admin.traefik.me 127.0.0.1 idsrv4adminApi.traefik.me 127.0.0.1 login.traefik.me 我从源代码管理获得了所有资源,在我朋友的机器上运行良好。 也许我的机器上有不同的配置,但我无法找到它是

你好

我正试图让下面的docker compose在我的机器上工作,但当我试图从容器B访问容器A的url时,出现了一些404错误

先验地,唯一不在源代码管理中的是对主机文件的修改,我必须在其中添加以下行

127.0.0.1 idsrv4admin.traefik.me
127.0.0.1 idsrv4adminApi.traefik.me
127.0.0.1 login.traefik.me
我从源代码管理获得了所有资源,在我朋友的机器上运行良好。 也许我的机器上有不同的配置,但我无法找到它是什么

如果我尝试访问“http://login.traefik.me/.well-known/openid-configuration“我可以直接从浏览器访问它:

{"issuer":"http://login.traefik.me","authorization_endpoint":"http://login.traefik.me/connect/authorize","token_endpoint":"http://login.traefik.me/connect/token","userinfo_endpoint":"http://login.traefik.me/connect/userinfo","end_session_endpoint":"http://login.traefik.me/connect/endsession","check_session_iframe":"http://login.traefik.me/connect/checksession","revocation_endpoint":"http://login.traefik.me/connect/revocation","introspection_endpoint":"http://login.traefik.me/connect/introspect","device_authorization_endpoint":"http://login.traefik.me/connect/deviceauthorization","frontchannel_logout_supported":true,"frontchannel_logout_session_supported":true,"backchannel_logout_supported":true,"backchannel_logout_session_supported":true,"scopes_supported":["roles","openid","profile","email","address","identity_admin_api","offline_access"],"claims_supported":["role","sub","updated_at","locale","zoneinfo","birthdate","gender","website","picture","preferred_username","nickname","middle_name","given_name","family_name","name","profile","email","email_verified","address"],"grant_types_supported":["authorization_code","client_credentials","refresh_token","implicit","password","urn:ietf:params:oauth:grant-type:device_code"],"response_types_supported":["code","token","id_token","id_token token","code id_token","code token","code id_token token"],"response_modes_supported":["form_post","query","fragment"],"token_endpoint_auth_methods_supported":["client_secret_basic","client_secret_post"],"subject_types_supported":["public"],"code_challenge_methods_supported":["plain","S256"],"request_parameter_supported":true}
如果我从容器管理员连接,并在同一url上尝试卷曲,则会出现404,并显示以下错误消息:

* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x560c38473f50)
* Connected to login.traefik.me (127.0.0.1) port 80 (#0)
> GET /.well-known/openid-configuration HTTP/1.1
> Host: login.traefik.me
> User-Agent: curl/7.64.0
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Date: Mon, 23 Nov 2020 08:34:58 GMT
< Content-Length: 0
< X-XSS-Protection: 1; mode=block
< X-Content-Type-Options: nosniff
< X-Frame-Options: SameOrigin
< Referrer-Policy: no-referrer
< Content-Security-Policy: script-src 'self' 'unsafe-inline' 'unsafe-eval';style-src 'self' 'unsafe-inline' https://fonts.googleapis.com/ https://fonts.gstatic.com/;font-src 'self' https://fonts.googleapis.com/ https://fonts.gstatic.com/
<
* Connection #0 to host login.traefik.me left intact
有人有主意吗


提前感谢

您正在尝试连接到127.0.0.1
连接到login.traefik.me(127.0.0.1)端口80(#0)
,该端口会将您发送到管理容器内的127.0.0.1,而不是您的计算机上

要使其正常工作,您需要将login.traefik.me映射到您的本地地址(192.168.x.x)

另外,如果您使用服务名称调用该端点会更好,因为所有容器都位于同一网络中,您可以替换此环境变量

- "AdminApiConfiguration__IdentityServerBaseUrl=http://login.traefik.me"


您正在尝试连接到127.0.0.1
连接到login.traefik.me(127.0.0.1)端口80(#0)
,该端口将在您的管理容器内而不是在您的计算机上将您发送到127.0.0.1

要使其正常工作,您需要将login.traefik.me映射到您的本地地址(192.168.x.x)

另外,如果您使用服务名称调用该端点会更好,因为所有容器都位于同一网络中,您可以替换此环境变量

- "AdminApiConfiguration__IdentityServerBaseUrl=http://login.traefik.me"


您正在使用traefik.me服务提供的主机名,该服务(类似于xip.io)通过根据子域模式将域解析为IP来提供通配符DNS服务

例如,对myapp.1.2.3.4.traefik.me的dns查询将解析为子域
1.2.3.4
中编码的IP地址。如果不在子域中指定IP地址(也不使用十六进制表示法),此服务将自动解析为
127.0.0.1
,这在大多数情况下适用于主机到容器的设置

在主机上运行时,使用此IP地址(本地主机)指向主机。由于您使用docker compose公开了traefik,因此当从本地计算机到本地计算机的请求映射到容器时(由于您为traefik定义了
端口
映射)

在容器内部运行时,情况并非如此。请参阅curl命令的日志输出:

*已连接到login.traefik.me(127.0.0.1)端口80(#0)

从其中一个容器内运行完全相同的请求也将解析为127.0.0.1 IP,但在容器内,此IP地址不再是主机地址,而是容器网络接口的环回适配器。因此,在使用容器时,您基本上遇到了一个关于
127.0.0.1
含义的非常常见的问题,这里已经回答了多次:

因此,如果您需要从主机和容器获得一个单独的dns名称,则需要切换到类似于
login.192.168.1.123.traefik.me
的内容,假设
192.168.1.123
是您的主机IP地址。但正如您所注意到的,这需要针对每个开发人员进行调整,即使您更改了所连接的网络/wifi

因此,我想如果您想使用完全相同的域名进行公共访问和容器间调用,那么使用这种通配符dns服务是没有解决方案的。在生产场景中,主机名将解析为全局有效的公共IP地址,当从容器内部访问时,该地址也可以工作,因为它将通过traefik进行完整的往返,但对于这种开发设置来说,这并不是一个好的选择


在这种情况下,您确实需要指定不同的域,这取决于您是发出重定向(使用全局有效域)还是使用从一个容器到另一个容器的直接调用。可以使用docker compose内部服务名称访问这些名称,例如
http://sts.identity
或-不太首选-容器名称(
http://is4-sts-identity
)。通过相应地配置环境变量
AdminAPConfiguration\uu IdentityServerBaseUrl
,可以指定使用这些URL而不是公共URL吗?

您使用的是traefik.me服务提供的主机名,该服务(类似于xip.io)通过根据子域模式将域解析为IP,提供通配符DNS服务

例如,对myapp.1.2.3.4.traefik.me的dns查询将解析为子域
1.2.3.4
中编码的IP地址。如果不在子域中指定IP地址(也不使用十六进制表示法),此服务将自动解析为
127.0.0.1
,这在大多数情况下适用于主机到容器的设置

在主机上运行时,使用此IP地址(本地主机)指向主机。由于您使用docker compose公开了traefik,因此当从本地计算机到本地计算机的请求映射到容器时(由于您为traefik定义了
端口
映射)

在容器内部运行时,情况并非如此。请参阅curl命令的日志输出:

*已连接到login.traefik.me(127.0.0.1)端口80(#0)

从其中一个容器中运行完全相同的请求也将解析为127.0.0.1IP,但在一个容器中使用此IP地址
- "AdminApiConfiguration__IdentityServerBaseUrl=http://sts.identity:80"