Зачем мне использовать ссылки 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
,