Перейти к содержимому

Container Links

Связь контейнеров (Container Link) даёт одной рабочей нагрузке, потребителю, приватный доступ к одному TCP-порту другой рабочей нагрузки — цели. Потребитель обращается к цели как alias:port; цели не нужен опубликованный порт, и больше ничего не открывается. Потребителем и целью может быть Container, Deployment или служба Compose — на одной ноде Docker или на разных.

Используйте связь контейнеров, когда приложению нужно обращаться к внутренней службе другой рабочей нагрузки — API, очереди или кэшу — без публикации этой службы на хосте и без общей сети Docker. Для управляемых баз данных и управляемого объектного хранилища используйте привязки баз данных и привязки хранилища: они ещё и передают учётные данные.

  • Тариф: Personal и выше. Существующие связи продолжают работать после смены лицензии; для создания связи нужен действующий тариф. См. Тарифы и возможности.
  • Docker-демон: на обеих нодах — потребителя и цели — нужен Docker-демон версии 2.11.1 или новее. Связь, нода которой работает со старым демоном, показывает update required, пока демон не обновлён.
  • Права: для потребителя — docker:containers:edit (docker:compose:manage для службы Compose), а если связь задаёт переменные, ещё и docker:containers:environment; для цели — docker:containers:link (docker:compose:manage для службы Compose). Владелец цели выдаёт docker:containers:link, чтобы другие рабочие нагрузки могли к ней обращаться, не получая никакого другого доступа. См. Справочник прав.
  1. Откройте потребителя: вкладку Environment у Container или Deployment либо вкладку Variables у Compose Project.
  2. В блоке Container Links нажмите Add. Для Compose Project выберите службу-потребителя в поле Service.
  3. Выберите Target type и рабочую нагрузку-цель на любой ноде Docker, а также TCP-порт цели в поле Port.
  4. Проверьте Alias. По умолчанию это имя цели; под этим именем потребитель подключается к ней. Допустимы строчные латинские буквы, цифры и дефисы; имя должно быть уникальным среди связей потребителя.
  5. При необходимости заполните Environment variables для хоста, порта или URL (http://alias:port), например API_HOST, API_PORT или API_URL. Если переменные заданы, потребитель один раз пересоздаётся, чтобы запуститься с ними; связь без переменных потребителя не перезапускает.
  6. Сохраните и дождитесь статуса ready, затем выполните реальный запрос от потребителя к alias:port.

Блок Incoming Links у цели показывает рабочие нагрузки, которые к ней обращаются. Связь удаляется в блоке Container Links потребителя; удаление убирает псевдоним, а если связь задавала переменные — удаляет и их ещё одним пересозданием.

Действие REST MCP и ассистент
Список связей рабочей нагрузки GET /api/docker/container-links?nodeId=&type=&resourceId=&direction=outgoing|incoming manage_container_link list
Создание связи POST /api/docker/container-links manage_container_link create
Чтение связи и её состояния GET /api/docker/container-links/{id} и /{id}/runtime manage_container_link get_runtime
Удаление связи DELETE /api/docker/container-links/{id} manage_container_link delete

Рабочая нагрузка задаётся нодой, типом (container, deployment или compose_service) и ресурсом: именем контейнера, идентификатором Deployment или <compose-project-id>:<service-name>. Состояние связи показывает открытые соединения, сеансы, пропускную способность и отклонённые соединения — так же, как у привязок баз данных и хранилища.

Статус Значение Что делать
ready Потребитель обращается к цели. Ничего.
pending Связь сохранена; потребитель получит её при следующем запуске или выкатке. Запустите потребителя или завершите его выкатку.
waiting Цель не запущена, или ни одна её копия не обслуживает запросы. Запустите цель; связь заработает сама.
update required Нода потребителя или цели работает с Docker-демоном старше 2.11.1. Обновите Docker-демон на этой ноде.
error Связь не удалось настроить; сообщение объясняет причину. Устраните причину; Opfield повторит настройку сам.

На каждой ноде Docker работает один общий коннектор защищённых связей для всех её связей. Для каждой связи потребитель подключается к собственной небольшой приватной сети, и в ней на псевдоним отвечает коннектор. Сети связей получают адреса из отдельного диапазона; см. Общий коннектор и сети связей.

  • Одна нода: коннектор передаёт каждое соединение напрямую цели.
  • Разные ноды: соединение идёт через Relay к ноде цели с проверкой подлинности на обоих концах, как у любой другой Secure Link.

Связь открывает ровно один порт цели и в одном направлении: потребитель может обращаться к этому порту и ни к чему больше у цели. Цель не может обращаться к потребителю через связь, и другие рабочие нагрузки не могут ею пользоваться. Сеть связи принадлежит только этой связи.

Если цель работает под Workload Availability, связь следует за исправными копиями:

  • каждая нода потребителя предпочитает копию на своей ноде, а иначе использует другую исправную копию;
  • когда Availability признаёт копию неисправной, связь сразу переводит соединения на исправную копию;
  • восстановившаяся копия снова получает трафик связи только после того, как Availability сообщит, что она проходит проверки состояния; перезапущенная копия с ещё неизвестным состоянием не считается исправной;
  • если исправных копий нет, связь остаётся на копиях, которые ещё обслуживают запросы, как и маршруты Availability.

К Deployment под Availability обращаются через его маршрутизатор, который пересылает только собственные порты Deployment. Поэтому порт связи должен быть одним из портов Deployment; иначе связь отклоняется при создании или переходит в error с причиной, когда порты Deployment меняются.

  • Потребитель не находит псевдоним: проверьте, что связь в статусе ready и приложение использует псевдоним, а не имя контейнера цели.
  • Соединения отклоняются: проверьте, что цель принимает соединения на порту связи внутри своего контейнера и что порт связи — это порт контейнера, а не порт хоста.
  • update required: обновите Docker-демон на ноде, указанной в сообщении; больше ничего менять не нужно.
  • waiting: цель остановлена или ни одна копия Availability не обслуживает запросы; запустите или восстановите цель.