Зачем мне использовать ссылки докеров, если мне все еще нужно жестко закодировать адрес?

Здравствуйте, я не понял следующего:

-В мире docker мы имеем, насколько я понял:

  • Порт, который предоставляет application
  • Порт, который контейнер предоставляет приложению.
  • Порт, который хост отображает порт контейнера

Итак, учитывая эти факты в конфигурации из 2 контейнеров в docker-expose

Если:

app | Host Port | Container Port | App Port

app1    8300         8200            8200
app2    9300         9200            9200

Если app2 необходимо связываться с app1 напрямую через docker-host, зачем мне использовать ссылки, если мне все еще нужно каким-то образом жестко закодировать в среде app2hostname и portapp1 (имя_контейнера app1 и port контейнера app1)? (В нашем например: port=8200 и host=app1Inst)

 app1:
    image: app1img
    container_name: app1Inst
    ports:
      - 8300:8200    //application code exposes port 8200 - e.g sends to socket on 8200
    networks:
      - ret-net


 app2:
    image: app2img
    container_name: app2Inst
    ports:
      - 9300:9200  
    depends_on:
      - app1
    networks:
      - ret-net
    links:
      - app1

    ///i still need to say here 
    /   environment : -
    /     - host=app1Inst 
   /      - port=8200  --what do i gain using links?

 networks:
ret-net:
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
0
0
36
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Короткий ответ, нет, вам не нужны ссылки, также он теперь устарел в докере и не рекомендуется. https://docs.docker.com/network/links/

При этом, поскольку оба ваших контейнера находятся в одной сети ret-net, они смогут свободно обнаруживать и связываться друг с другом на всех портах, даже без настройки ports.

Параметр ports используется для внешнего доступа к контейнеру, например с главной машины.

Параметр environment просто устанавливает переменные среды в контейнере, поэтому приложение знает, как найти app1Inst и правильный порт 8200.

Но если я не выставлю container_port для моего application и скажу где-нибудь в моем коде, я начну слушать socket через порт 8500. Вы говорите мне, что docker автоматически создаст container_port_mapping для моего in-code port, чтобы другие контейнеры могли взаимодействовать с Это?

Bercovici Adrian 13.12.2018 22:21

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

hellosri 14.12.2018 18:56
Ответ принят как подходящий

Вам не нужно использовать ссылки в современном Docker. Но вам определенно не следует нигде жестко кодировать имена хостов или порты. (См., Например, каждый вопрос SO, в котором отмечается, что вы можете взаимодействовать со службами как localhost при работе непосредственно в системе разработчика, но при работе в Docker требуется другое имя хоста.). Файл docker-compose.yml представляет собой конфигурацию времени развертывания, и это хорошее место для установки переменных среды, которые указывают от одной службы к другой.

Как вы отметили в предложенном вами файле docker-compose.yml, сети Docker и связанная с ними служба DNS в основном полностью заменяют ссылки. Сначала были ссылки, но они уже не так полезны.

Также обратите внимание, что Docker Compose создаст для вас сеть по умолчанию и что имена служебных блоков в файле docker-compose.yml действительны как имена хостов. Вы можете уменьшить этот файл до:

version: '3'
services:
  app1:
    image: app1img
    ports:
      - '8300:8200'
  app2:
    image: app2img
    ports:
      - '9300:9200'
    env:
      APP1_URL: 'http://app1:8200'
    depends_on:
      - app1

Другие вопросы по теме