Docker, лекция 9. Создание сетей между контейнерами с использованием NETWORK

Docker, лекция 9. Создание сетей между контейнерами с использованием NETWORK

В этой лекции будет описано как создать сеть docker, которая позволяет контейнерам взаимодействовать по сети. Так же будет рассмотрен встроенный dns сервер, добавленный в docker 1.10.

У Docker есть два подхода к работе в сети. Первый — это рассмотренный в прошлой лекции link, который обновляет /etc/hosts и переменные среды, чтобы позволить контейнерам подключаться.

Альтернативный подход заключается в создании Docker-сети, к которой подключены контейнеры. Сеть имеет атрибуты, аналогичные физической сети.

Создание сети

Первым шагом будет создание сети с использованием CLI. Эта сеть позволит нам прикрепить несколько контейнеров, которые смогут подключаться друг к другу.

Создадим сеть с желаемым именем:

docker network create backend-network

Теперь при запуске контейнера можно использовать ключ —net, чтобы определить подключение к сети. Например:

docker run -d --name=redis --net=backend-network redis

Сетевое взаимодействие

В отличие от использования link, docker-сеть ведет себя как традиционные сети, где узлы могут быть подключены / отключены.

Первое отличие, это то, что Docker больше не назначает переменные среды и не обновляет файл hosts для контейнеров. Можно вывести две команды ниже и увидеть, что упоминаний других контейнеров нет.

docker run --net=backend-network alpine env
docker run --net=backend-network alpine cat /etc/hosts

Вместо этого контейнеры могут связываться через встроенный DNS-сервер. Этот DNS-сервер назначается всем контейнерам как IP 127.0.0.11 и устанавливается в файле resolv.conf. Проверим это командой:

docker run --net=backend-network alpine cat /etc/resolv.conf

Когда контейнеры пытаются получить доступ к другим контейнерам через имя, такое как Redis, DNS-сервер возвращает IP-адрес контейнера. В этом случае полное имя Redis будет redis.backend-network.

docker run --net=backend-network alpine ping -c1 redis

Подключение двух контейнеров

Docker поддерживает одновременное подключение сетей и контейнеров к нескольким сетям.

Например, давайте создадим отдельную сеть с приложением Node.js, которое связывается с существующим экземпляром Redis. Создадим сеть:

docker network create frontend-network

Используем команду подключения существующего контейнера к сети:

docker network connect frontend-network redis

Если запустить тестовое приложение, то оно сможет обмениваться данными с контейнером reddis.

docker run -d -p 3000:3000 --net=frontend-network katacoda/redis-node-docker-example

curl docker:3000

Aliases при использовании сети

Link по-прежнему поддерживаются при использовании Docker Network и предоставляют способ определения псевдонима для имени контейнера. Это даст контейнеру дополнительное имя DNS-записи и способ обнаружения. При использовании —link встроенный DNS гарантирует, что результат поиска будет только в том контейнере, где используется —link.

Другой подход заключается в предоставлении псевдонима при подключении контейнера к сети.

Следующая команда подключит экземпляр Redis к внешней сети с псевдонимом db:

docker network create frontend-network2
docker network connect --alias db frontend-network2 redis

Когда контейнеры пытаются получить доступ к сервису через имя db, ими будет получен IP-адрес контейнера Redis.

Отключение от сети

Создав сети, можно использовать CLI для изучения деталей. Выведем список сетей.

docker network ls

Так же можно посмотреть какие контейнеры подключены и их IP.

docker network inspect frontend-network

А теперь отключим контейнер redis от сети frontend-network:

docker network disconnect frontend-network redis

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *