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