====== Docker: Networking - работа с сетью ====== [[https://linux-notes.org/rabota-s-setju-networking-v-docker/]] ===== Общие сведения ===== Сетевая Docker подсистема подключается, используя драйверы. По умолчанию существует несколько драйверов которые обеспечивают основные сетевые функции: * **bridge:** Мост, — это сетевой драйвер по умолчанию. Бридж сеть используется, когда ваши приложения запускаются в автономных контейнерах, которые должны взаимодействовать между собой (Наглядный пример Nginx + MySQL). * **host:** Хост, — это сетевой драйвер для автономных контейнеров (удаленная сетевая изоляция между контейнером и Docker хостом). Данный драйвер доступен только для docker-swarm с поддержкой Docker 17.06 и выше. * **overlay/overlay2:** Оверлей (Наложенная сеть), — это сетевой драйвер для соединения несколько демонов Docker между собой и которые позволяют docker-swarm службам взаимодействовать друг с другом. Вы также можете использовать оверлейные сети для облегчения связи между docker-swarm и автономным контейнером или между двумя отдельными контейнерами на разных Docker демонах. Эта стратегия устраняет необходимость выполнения маршрутизации на уровне ОС между этими контейнерами. * **macvlan:** Маквлан,- это сетевой драйвер, который позволяют назначать MAC-адрес контейнеру, делая его отображаемым как физическое устройство в вашей сети. Docker демон направляет трафик на контейнеры по их MAC-адресам. Использование macvlan драйвера иногда является лучшим выбором при работе с устаревшими приложениями, которые ожидают, что они будут напрямую подключены к физической сети. * **none:** Нон,- это сетевой драйвер, который умеет отключать всю сеть для контейнеров. Обычно используется в сочетании с пользовательским сетевым драйвером. * **Network plugins:** Вы можете установить и использовать сторонние сетевые плагины с Docker контейнерами. Эти плагины доступны в Docker Store или у сторонних поставщиков услуг. ===== Где и что лучше использовать? ===== * Мост (**bridge**) лучше всего использовать для связи нескольких контейнеров на одном и том же Docker хосте. Можно юзать docker-compose и выбирать данную сеть для такой связки. * Хост (**host**) сети лучше всего юзать, когда сетевой стек не должен быть изолирован от хоста Docker, но вы хотите, чтобы другие аспекты контейнера были изолированы. * Овердейная сеть (**overlay/overlay2**) или наложение сетей лучше всего заюзать, когда вам нужны контейнеры, работающие на разных Docker хостах для связи, или, когда несколько приложений работают вместе, используя docker-swarm. * Маквлан (**macvlan**) сети лучше всего использовать, когда вы переходите с VM/дедикейта на контейнеры или хотите, чтобы ваши контейнеры выглядели как физические хосты в вашей сети, каждый с уникальным MAC-адресом. * Сторонние сетевые плагины позволяют интегрировать Docker со специализированными сетевыми стеками. ===== Команды для работы с сетью ===== Чтобы проверить какие сети имеются, выполните следующую команду: $ docker network ls Где: * **//NETWORK ID//** — при создании сети, ей присваивается ID. Так это, собственно, идентификатор сети. * **//NAME//** — имя сети. Можно задать произвольное имя. * **//DRIVER//** — используемый драйвер для созданной сети. * **//SCOPE//** — где используется. Давайте создания сети выполните следующую команду: $ docker network create --driver=bridge NAME_NETWORK Где: * **//NAME_NETWORK//** — имя сети. Можно создавать **//bridge//**, **//overlay//**, **//host//**, **//none//** или **//кастомный network-инг//**. По дефолту, — создается **//мост//**. При создании сети можно задавать дополнительные параметры, с ними можно ознакомиться: $ docker network create --help Чтобы законектить контейнер к сети, нужно выполнить следующую команду: $ docker network connect YOUR_NETWORK YOUR_CONTAINER Где: * **//YOUR_NETWORK//** — сеть. * **//YOUR_CONTAINER//** — контейнер. Для отключения служит обратная команда: $ docker network disconnect YOUR_NETWORK YOUR_CONTAINER Можно получить подробную информацию о той или иной сети, например: $ docker network inspect NAME_NETWORK Где: * **//NAME_NETWORK//** — имя сети. Так же, можно получить инфу со следующей команды: $ docker info Для удаления сети служит следующая команда: $ docker network rm YOUR_NETWORK Или если нужно удалить все созданные сети, которые не используются: $ docker network prune