Belov Solutions

Соединение между контейнерами в Docker

Введение

Эта статья объясняет, как установить соединение между контейнерами в Docker с помощью аргумента --link. Вы узнаете, как работает внутренняя сеть Docker, как настраиваются переменные среды и файл /etc/hosts для обмена данными, а также какие ограничения имеет текущая реализация. Примеры основаны на контейнере redis.

Соединение между контейнерами с помощью --link

Соединения (links) в Docker — это простой способ организации обмена данными между контейнерами на одном хосте. При использовании принятой по умолчанию сетевой модели Docker коммуникация происходит во внутренней сети, оставаясь невидимой для сети хоста. Соединение устанавливается с помощью аргумента --link CONTAINER:ALIAS в команде docker run, где CONTAINER — имя контейнера-адресата, а ALIAS — локальное имя для обращения к нему из управляющего контейнера.

Пример с контейнером redis:

$ docker run -d --name myredis redis
c9148dee046a6fefac48806cd8ec0ce85492b71f25e97aae9a1a75027b1c8423
$ docker run --link myredis:redis debian env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=f015d58d53b5
REDIS_PORT=tcp://172.17.0.22:6379
REDIS_PORT_6379_TCP=tcp://172.17.0.22:6379
REDIS_PORT_6379_TCP_ADDR=172.17.0.22
REDIS_PORT_6379_TCP_PORT=6379
REDIS_PORT_6379_TCP_PROTO=tcp
REDIS_NAME=/distracted_rosalind/redis
REDIS_ENV_REDIS_VERSION=3.0.3
REDIS_ENV_REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.0.3.tar.gz
REDIS_ENV_REDIS_DOWNLOAD_SHA1=0e2d7707327986ae652df717059354b358b83358
HOME=/root

Анализ: Команда docker run --link myredis:redis debian env создаёт управляющий контейнер, который ссылается на контейнер myredis под псевдонимом redis. Docker добавляет имя и IP-адрес контейнера-адресата в файл /etc/hosts управляющего контейнера и создаёт переменные среды с префиксами REDIS_PORT и REDIS_ENV для упрощения взаимодействия.

Переменные среды и файл /etc/hosts

При установлении соединения Docker автоматически добавляет в управляющий контейнер:

  • Запись в /etc/hosts с именем и IP-адресом контейнера-адресата, что позволяет обращаться к нему по псевдониму (например, redis).
  • Переменные среды с информацией о портах (например, REDIS_PORT_6379_TCP=tcp://172.17.0.22:6379) и параметрах контейнера-адресата (например, REDIS_ENV_REDIS_VERSION=3.0.3).

Примечание: Переменные с префиксом REDIS_ENV импортируются из контейнера-адресата. Будьте осторожны при хранении в них секретных данных, таких как пароли или токены API.

Ограничение обмена данными

По умолчанию контейнеры могут обмениваться данными через внутреннюю сеть Docker без явного соединения. Чтобы запретить это, запустите демон Docker с аргументами --icc=false и --iptables. В этом случае Docker использует правила Iptables, чтобы разрешить обмен только между связанными контейнерами через объявленные порты.

Недостатки соединений

Текущая реализация соединений с помощью --link имеет ограничения:

  • Статичность: Соединения не обновляются автоматически при замене контейнера-адресата.
  • Односторонность: Контейнер-адресат должен быть запущен до управляющего контейнера, что исключает двунаправленные соединения.

Примечание: В будущих версиях Docker (начиная с 1.9) предпочтение отдаётся модели «публикации сервисов».

Заключение

Соединения между контейнерами в Docker с помощью --link предоставляют простой способ организации обмена данными во внутренней сети. Переменные среды и файл /etc/hosts упрощают взаимодействие, но важно учитывать ограничения, такие как статичность и односторонность. Для более сложных сценариев рекомендуется изучить новые сетевые возможности Docker.

Отзывы

Оставить отзыв

Ваша эл. почта не будет опубликована