Установка hostname:
эквивалентна команде hostname (8) в обычном Linux: она изменяет то, что контейнер считает своим собственным именем хоста, но не влияет на что-либо вне контейнера, которое может попытатьсядобраться до него. Например, в обычном Linux, работающем с hostname dbr
, внешний DNS-сервер или файлы /etc/hosts
других компьютеров не будут изменены. Установка имени хоста может повлиять на приглашение оболочки, в необычном случае получения интерактивной оболочки внутри контейнера;это не влияет на работу сети.
В пределах одного файла Docker Compose, если у вас нет специальной конфигурации для networks:
, любой контейнер может достичь любого другого контейнера, используя имя своего блока в файле YAML. В вашем файле app
, nginx
, test
, dbc
и agent
являются действительными именами хостов. Если вы вручную укажете container_name:
, я считаю, что это также будет достижимо;псевдонимы сети, предложенные в ответе @ asolanki, дают еще одно имя;и устаревший вариант links:
даст еще один вариант. Все это в дополнение к , которое дает вам стандартное имя Compose.
Сеть в Compose содержит некоторые разумные объяснения всего этого.
В вашем примере dbr
не является допустимым именем хоста. dbc
- это имя службы Compose контейнера, но ничто из предыдущего списка не приводит к существованию имени хоста dbr
. Это имя, которое вы увидите в приглашении, если вы docker-compose exec dlc sh
, но никто больше не думает, что у контейнера есть это имя.
Как конкретное следствие "links:
устарело", формаlinks:
у вас нет абсолютно ничего. links: [dbc]
делает контейнер, который в противном случае был бы виден под именем dbc
, видимым для этого конкретного контейнера с тем же именемВы можете использовать его для присвоения альтернативного имени контейнеру с точки зрения клиента, но я бы не стал.
Ваш файл docker-compose.yml
не имеет блоков networks:
, и поэтомуCompose создаст сеть default
и подключит к ней все контейнеры. Это совершенно нормально, и я бы не рекомендовал менять его. Если вы объявляете несколько сетей, другое требование здесь заключается в том, что клиент и сервер должны находиться в одной сети, чтобы связаться друг с другом. (Контейнеры без блока networks:
неявно имеют networks: [default]
.)