docker - 2个容器之间的API通信
问题描述
我在 .NET Core 3.1 的两个单独的 API 项目中使用 docker-compose
- ContainerAuth(容器运行 Auth API)
- ContainerAppApi(用于单独应用的 API)
ContainerAuth有一个我需要从ContainerAppApi访问的端点
ContainerAuth上的端点
POST
:http://locahost:5000/auth/validate
我让ContainerAppApi在一个单独的 docker 容器中运行(完全不同的 repo/project/etc..)。那正在运行http://localhost:5100
问题 从ContainerAppApi -> ContainerAuth发出请求时,我收到以下异常:
无法分配请求的地址 无法分配请求的地址
根据我的阅读,问题是ContainerAppApi不知道ContainerAuth的 Api 在http://localhost:5000
我以为我可以建立一个桥接网络,但我仍然得到同样的错误。我已经验证了两个容器都连接到我的桥接网络,那么,我是否缺少某种端口绑定?或者在我缺少的网络过程中是否有一些额外的步骤?
docker-compose用于ContainerAuth
version: '3.4'
services:
web:
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=https://+:443;http://+:80
build:
context: ..
dockerfile: Dockerfile
ports:
- 5000:80
- 5001:443
networks:
- my-network
networks:
my-network:
driver: bridge
external: true
用于ContainerAppApi的 docker-compose
version: '3.4'
services:
web:
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=https://+:443;http://+:80
build:
context: ..
dockerfile: Dockerfile
ports:
- 5100:80
- 5101:443
networks:
- my-network
networks:
my-network:
driver: bridge
external: true
码头工人网络 ls
NETWORK ID NAME DRIVER SCOPE
23179718cd0a bridge bridge local
431eba987024 host host local
733c83d6dee2 my-network bridge local
2bf6118b71a4 none null local
码头工人网络检查我的网络
[
{
"Name": "my-network",
"Id": "733c83d6dee2d8ffb007bdb99324e9312a07d5735d329059a2083a11c1582642",
"Created": "2020-07-11T02:28:09.2078715Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.21.0.0/16",
"Gateway": "172.21.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"741624d9304add4d39bc0dc30b04af2fc26a36e87565d87ac5eca44b2a2e361e": {
"Name": "ContainerAppApi_web_1",
"EndpointID": "623a99e45344ef52c8352fa1a35a6f02c8417107d85bccae6a06289c73b0d4c5",
"MacAddress": "02:42:ac:15:00:03",
"IPv4Address": "172.21.0.3/16",
"IPv6Address": ""
},
"74c08686a62f6028a74796c41f4b2fcfe9e6818588783c3ab0e76665acd032d7": {
"Name": "ContainerAuth_web_1",
"EndpointID": "6bb7a30f2d231514a3569481de166d46c30c78b70b725e5ee595d027dab1639f",
"MacAddress": "02:42:ac:15:00:02",
"IPv4Address": "172.21.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
看起来一切都已连接,但是ContainerAppApi不能调用ContainerAuth的 API 吗?两者都已启动并正在运行,我可以使用 Postman 访问每个 api。
解决方案
如果两个 docker-compose 项目使用相同的网络,那么您可以通过服务名称而不是localhost 来调用ContainerAuth 的localhost
服务,localhost 表示此容器表示ContainerAppApi
容器。
您将需要进行少量更改以使其正常工作,替换服务名称并使用内部PORT
即80
and 443
。发布端口用于外部世界通信。
API
version: '3.4'
services:
api:
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=https://+:443;http://+:80
build:
context: ..
dockerfile: Dockerfile
认证
version: '3.4'
services:
auth:
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=https://+:443;http://+:80
build:
context: ..
dockerfile: Dockerfile
现在您可以使用API容器的服务名称访问身份验证
curl api
这是您理解的简单示例
服务
version: '3.4'
services:
nginx:
image: nginx:alpine
networks:
- my-network
networks:
my-network:
driver: bridge
external: true
高山服务
version: '3.4'
services:
web:
image: node:alpine
command: sh -c "apk add --no-cache curl && curl nginx"
networks:
- my-network
networks:
my-network:
driver: bridge
external: true
一旦你启动 Nginx,然后启动 Alpine,你将能够看到
curl nginx
这个电话似乎有效。
推荐阅读
- python - Pyrebase 未在 python 3.7.1 中成功安装
- bitcoin - 为什么coinbase的交易中有3个输出?
- racket - 在参数列表上调用“和”
- flutter - 如何在颤动中显示带有时区的日期和时间
- php - 如何在 VS Code 中为 Phalcon 启用 InteliSense?
- javascript - 你如何在 Discord.js 上批量创建频道
- python - 从“str”类继承
- azure - 自定义 .NET 活动:请求被中止:无法创建 SSL/TLS 安全通道
- pip - 如何在虚拟环境中的 Windows 上使用 pip 和 python 3.8.3 安装 torch 和 torchvision?
- sql - 在查询中获取以下记录