Docker link при создании контейнера нужен для того, чтобы связать два контейнера за счет передачи определенной переменной.
Docker link с примером
Рассмотрим пример приложения, запускаемого в одном контейнере и работающего с базой данных в другом.
В качестве базы — MongoDB (ссылка на dockerhub).
docker run --name py-app -p 8000:8000 -d -e MONGO_HOST=appdb --link appdb dockerhub/py-app
Приложение запустится по порту 8000 в хост системе, в контейнере приложение также займет порт 8000.
За счет параметра link при запуске станет возможно использование имени контейнера с базой данных как хоста внутри контейнера с приложением. Это имя можно указывать в конфигурационном файле приложения, в котором задаётся подключение к базе данных. В данном случае — к базе данных MongoDB.
Предполагается, что контейнер с MongoDB уже запущен ранее.
Пример подключения к базе в другом контейнере на скриншоте:
Выделено имя appdb, оно и является хостом для подключения. Фактически запросы за счёт docker link направляются другому контейнеру, который определен по имени.
В случае если бза размещается локально на сервере без Docker — вместо имени был бы, как правило, ip адрес сервера с MongoDB и порт для подключения.
Docker использует свою схему сети, по адресу и порту подключаться не всегда возможно, использование же имени контейнера очень удобно.
Один контейнер таким образом ссылается на другой с может использовать для обращения выбранное имя.
Имена образов Docker при сборке
В примере условное приложение py-app. Если приложение размещается локально dockerhub/py-app указывать не нужно и достаточно имени (образ должен быть в выводе docker images на хосте).
Здесь видно, что образ уже скачался и доступен локально. В таком случае достаточно указания имени образа.
Если образ — на dockerhub, то требуется подставить полный путь к нему.
MONGO_HOST в команде, которой мы запустили контейнер — переменная окружения. Ей задается имя контейнера с базой, которое используется приложением для обращения к Mongo.
Через link очень удобно связывать контейнеры когда запускаются большие приложения и контейнеров требуется несколько.
Читайте про Docker compose. Он позволяет одной командой запускать стек из множества контейнеров.