====== 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