Связь API между 2 контейнерами - PullRequest
0 голосов
/ 14 июля 2020

Я использую docker -compose в двух отдельных проектах API в. NET Core 3.1

  • ContainerAuth (контейнер, в котором выполняется Auth API)
  • ContainerAppApi (API для отдельное приложение)

ContainerAuth имеет конечную точку, из которой мне нужно попасть ContainerAppApi

Конечная точка на ContainerAuth

POST: http://locahost:5000/auth/validate

У меня ContainerAppApi работает в отдельном docker контейнере (совершенно другое репо / проект / et c .. ). Это работает на http://localhost:5100

Проблема При выполнении запроса от ContainerAppApi -> ContainerAuth Я получаю следующее исключение:

Невозможно назначить запрошенный адрес Невозможно назначить запрошенный адрес

Из того, что я читал, проблема в том, что ContainerAppApi не знает о ContainerAuth Api работает на http://localhost:5000

Я думал, что могу установить sh мостовую сеть, но все равно получаю ту же ошибку. Я подтвердил, что оба контейнера подключены к моей сети моста, поэтому мне не хватает какой-то привязки к порту? Или есть какой-то дополнительный шаг в сетевом процессе, который мне не хватает?

docker -compose for 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

docker -compose for ContainerAppApi

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

docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
23179718cd0a        bridge              bridge              local
431eba987024        host                host                local
733c83d6dee2        my-network          bridge              local
2bf6118b71a4        none                null                local

docker сеть проверить мою-сеть

[
    {
        "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? Оба работают, и я могу использовать каждый api с помощью Postman.

1 Ответ

0 голосов
/ 14 июля 2020

Если оба проекта docker -compose используют одну и ту же сеть, вы можете вызвать службу ContainerAuth по имени службы вместо localhost, localhost означает этот контейнер означает ContainerAppApi контейнер .

Вам потребуются небольшие изменения, чтобы заставить его работать, замените имя службы и используйте внутренние PORT, то есть 80 и 443. publi sh порт предназначен для связи с внешним миром.

API

version: '3.4'
services:
  api:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
    build:
      context: ..
      dockerfile: Dockerfile

Auth

version: '3.4'
services:
  auth:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
    build:
      context: ..
      dockerfile: Dockerfile

Сейчас вы можете получить доступ к auth из API контейнера, используя его имя службы

curl api

Вот простой пример для вашего понимания

nging service

version: '3.4'
services:
  nginx:
    image: nginx:alpine
    networks:
      - my-network
networks:
  my-network:
    driver: bridge
    external: true

Alpine service

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

Кажется, этот вызов работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...