Как общаться между двумя контейнерами с помощью докера - PullRequest
2 голосов
/ 26 апреля 2019

У меня проблема с доступом к одному маршруту контейнера в другом контейнере.Например, у меня есть две микро-службы, которые называются user-service и api-gateway .Я пытаюсь получить доступ к user-service route в api-gateway .

Мой api-шлюз файл может выглядеть примерно так:

  const userServiceProxy = httpProxy(http://localhost:8093);
  this.app.post('/admin/register', async(req, res) => {

      userServiceProxy(req, res);

  });

api-gateway работает на порту 8080

Мой файл user-service может выглядеть примерно так:

 app.post('/admin/register', function (req, res) {
  res.send('POST request')
 })

, когда я получаю доступ к маршруту через api-шлюз с портом 8080, который я не смог вызватьмаршрут, но когда я попытался получить доступ через порт 8093, я смог увидеть результат.

Мой docker-compose файл может быть как показано ниже

 version: '3'
 services:
   api-gateway:
     container_name: api-gateway
     build: './api-gateway'
     ports:
       - "8080:8080"
     links:
       - user-service
   user-service:
     build: ./user-service
     container_name: user-service
     ports:
     - "8093:8093"

ЛюбойПомощь будет принята с благодарностью, Заранее спасибо!

Ответы [ 4 ]

5 голосов
/ 26 апреля 2019

localhost относится к локальному узлу внутри контейнера, а не к хост-системе.

Используйте Docker Networks и замените localhost именем службы, например api-gateway.

Если контейнеры находятся в одной сети, адрес http://api-gateway:8093 должен работать.

Другой способ - запустить Контейнер в сетевом режиме host. Это меньше изоляции, но тогда адрес localhost работает, потому что контейнер теперь работает на интерфейсе докера deamon

1 голос
/ 27 апреля 2019

просто добавьте спецификацию сети в ваш файл docker-compose для использования настраиваемой мостовой сети.

что-то подобное может работать для вас

version: '3'
services:
  api-gateway:
    container_name: api-gateway
    build: './api-gateway'
    ports:
    - "8080:8080"
    networks:
    - mynet
  user-service:
    build: ./user-service
    container_name: user-service
    ports:
    - "8093:8093"
    networks:
    - mynet

networks:
  mynet:
    driver: bridge
    ipam:
      driver: default

в соответствии с указанными вами портами и службамив вашем docker-compose теперь возможны следующие соединения:

  • контейнер api-gateway: user-service:8093
  • контейнер обслуживания пользователя: api-gateway:8080

если я правильно понял, ваш api-шлюз теперь будет:

const userServiceProxy = httpProxy(http://user-service:8093);
  this.app.post('/admin/register', async(req, res) => {
      userServiceProxy(req, res);
  });

внутри докерной сети вы можете получить доступ к портам из других контейнеров напрямую (не нужно указывать сопоставление портов для вашего хоста)).возможно, одно из ваших сопоставлений портов не требуется.если вы обращаетесь к пользовательскому сервису только через api-шлюз, а не напрямую, вы можете удалить спецификацию порта в ваших файлах docker-compose (блок пользовательского сервиса).тогда ваш пользовательский сервис будет доступен только через API-шлюз.что, вероятно, то, что вы хотите.

0 голосов
/ 27 апреля 2019

Самый простой способ - использовать флаг Docker --net=host. Таким образом, ваш Docker-контейнер будет использовать сеть вашего хост-компьютера вместо их собственных сетей с пространством имен. * например 1002 *

docker run -d --network host -p 80:80 nginx

и вы можете проверить на http://localhost страницу приветствия nginx.

0 голосов
/ 26 апреля 2019

Существует также менее известная опция для соединения двух или более контейнеров вместе:

version: '3'

services:
  test1:
    image: alpine
    command: nc -lp 1337
  test2:
    image: alpine
    command: nc -lp 1337
    network_mode: service:test1

Это похоже на внутреннюю сеть стручков Kubernetes - контейнеры, связанные таким образом, используют один и тот же внутренний адрес (опубликованные порты видны на локальном хосте и могут конфликтовать друг с другом). В результате вышеупомянутый конфиг не будет работать, так как возникнет коллизия портов:

➜  docker-pod-test docker-compose up
Creating docker-pod-test_test1_1 ... done
Creating docker-pod-test_test2_1 ... done
Attaching to docker-pod-test_test1_1, docker-pod-test_test2_1
test2_1  | nc: bind: Address in use
docker-pod-test_test2_1 exited with code 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...