Сети
Сеть для контейнеров
Контейнеры Linux в основном состоят из процессов, выполняемых прямо в хост-системе, но на сетевом уровне они ведут себя совсем не так, как другие процессы.
Изначально Docker поддерживал только одну сетевую модель, а сейчас доступны различные конфигурации, которые подойдут для большинства приложений. Обычно контейнеры запускаются в конфигурации по умолчанию - в режиме моста.
Как это работает
Представим, что каждый контейнер Linux ведет себя как хост в частной сети. Сервер Docker в этом случае выступает как виртуальный мост, в контейнеры - клиенты, которые находятся за ним. Мост - это просто сетевое устройство, передающее трафик с одной стороны на другую.
Фактически у каждого контейнера есть виртуальный интерфейс Ethernet, подключенный к мосту Docker, и IP-адрес, назначенный виртуальному интерфейсу (см схему ниже)
Docker позволяет привязывать отдельные порты и группы портов на хосте к контейнерам, чтобы можно было обращаться к ним извне.
Docker выделяет частные подсети из неиспользуемого блока частных подсетей (RFC 1918).
Он определяет, какие блоки не используются на хосте, и назначает один из них виртуалной сети. Она соединяется мостом с локальной сетью хоста через интерфейс на сервере, который называется docker0. Это означает, что по умолчанию все контейнеры находятся в сети и могут взаимодействовать друг с другом напрямую, но для обращения к хосту или внешнему миру им требуется интерфейс виртуального моста docker0.
Существует множество способов настроить сетевой уровень Docker: от назначения своих сетевых блоков до настройки пользовательского интерфейса моста.
Примечание
Можно настроить сеть отдельно для каждого контейнера или полностью отключить виртуальную сеть для контейнера, указав параметр --net=host для команды docker container run.
В этом режиме контейнеры используют сетевые устройства и адрес хоста, обходясь без виртуальных интерфейсов или мостов.
Warning
При работе с сетью в Docker необходимо помнить о безопасности.