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

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

docker Мир, который мы имеем из того, что я понял:

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

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

Если:

app | Host Port | Container Port | App Port

app1    8300         8200            8200
app2    9300         9200            9200

Если app2 необходимо общаться с app1 прямо через docker-host почему я должен использовать ссылки, так как мне все равно придется каким-то образом жестко кодировать в среде app2 hostname а также port из app1 (контейнерное имя 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:

2 ответа

Решение

Вам не нужно использовать ссылки на современном 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

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

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

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

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

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