首页 > 解决方案 > 2个容器之间的API通信

问题描述

我在 .NET Core 3.1 的两个单独的 API 项目中使用 docker-compose

ContainerAuth有一个我需要从ContainerAppApi访问的端点

ContainerAuth上的端点

POSThttp://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.net-coredocker-composedocker-networkingdocker-network

解决方案


如果两个 docker-compose 项目使用相同的网络,那么您可以通过服务名称而不是localhost 来调用ContainerAuth 的localhost服务,localhost 表示此容器表示ContainerAppApi容器。

您将需要进行少量更改以使其正常工作,替换服务名称并使用内部PORT80and 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

这个电话似乎有效。


推荐阅读