Работа с сетью (Networking) в Docker
Я довольно давно работаю с docker, не все время, а переодически, но тем-не-менее я проникся докер технологией. Порой не было времени освоить\ познать глубины докера и написать статью для заметок. Сейчас много чего изменилось, у меня появилось желание и время, по этому — я могу рассказать о «Работа с сетью (Networking) в Docker».
Надеюсь что у вас уже имеется докер на хостевой машине, если нет, вот полезные статьи:
Установка Docker на Debian/Ubuntu
Установка Docker на CentOS/RedHat/Fedora
Установка docker-compose в Unix/Linux
Запуск docker контейнеров в Unix/Linux
Установка docker machine в Unix/Linux
Настройка docker swarm кластера в Unix/Linux
Запуск GUI-приложения в Docker
Запустить bash/SSH в контейнере с Docker
Создание base image для docker в Unix/Linux
Создание docker контейнера в Unix/Linux
Остановить/Удалить все Docker контейнеры/images
И так, приступим.
Работа с сетью (Networking) в 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 со специализированными сетевыми стеками.
Просмотреть Network в Docker
Чтобы проверить какие сети имеются, выполните следующую команду:
$ docker network ls NETWORK ID NAME DRIVER SCOPE 6df045e07b11 bridge bridge local 9d45c14e604a host host local b285e48f2c94 none null local
Где:
- NETWORK ID — При создании сети, ей присваивается ID. Так это собственно индификатор сети.
- NAME — Имя сети. Можно задать произвольное имя.
- DRIVER — Используемый драйвер для созданной сети.
- SCOPE — Где используется.
Если посмотреть на поле «DRIVER», то можно понять что я использую стандартную сеть, которую предоставляет сам докер.
Создать Network в Docker
Давайте создадим сеть, самый простой способ это:
$ docker network create bridge-network c8668b3fc7f6ac9d8694a34d225327f9abb1d195c9757966919ed4adf9b35cea
Или:
$ docker network create --driver=bridge bridge-network
Вы можете создавать bridge, overlay, host, none или кастомный network-инг. По дефолту, — создается мост. Проверяем что вышло:
$ docker network ls NETWORK ID NAME DRIVER SCOPE 6df045e07b11 bridge bridge local 9d45c14e604a host host local c8668b3fc7f6 bridge-network bridge local b285e48f2c94 none null local
Как я и говорил, создался бридж с указанным названием сети. Давайте рассмотрим пример создания оверлей-сети:
$ docker network create -d overlay my-multihost-network
Или:
$ docker network create --driver overlay overlay_network
Можно создать macvlan сеть, например:
$ docker network create -d macvlan \ > --subnet=172.16.86.0/24 \ > --gateway=172.16.86.1 \ > -o parent=eth0 \ > my-macvlan-net 7ca5727963f953b669da216ddaf42143df54efb31464fa8b46eda9edefa45000
Еще один пример создания сети:
$ docker network create --subnet 10.1.0.0/16 --gateway=10.1.0.1 --ip-range 10.1.4.0/24 --driver=bridge --label=host4networks brifge04 233fa875d361ac26951c0e62d4c406b36e90835eea3a2fba4186df987b3037c9
Проверим созданную сеть на примере, какого-то контейнера:
$ docker run -it --name=test_brifge04 --net brifge04 centos:centos7 /bin/bash
PS: Если нужно, то контейнеру можно выделить статик ИП:
$ docker run -it --name=test_brifge04_2 --net brifge04 --ip=10.1.4.100 centos:centos7 /bin/bash
При создании сети, можно задавать дополнительные параметры, с ними можно ознакомится:
$ docker network create --help Usage: docker network create [OPTIONS] NETWORK Create a network Options: --attachable Enable manual container attachment --aux-address map Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[]) --config-from string The network from which copying the configuration --config-only Create a configuration only network -d, --driver string Driver to manage the Network (default "bridge") --gateway strings IPv4 or IPv6 Gateway for the master subnet --ingress Create swarm routing-mesh network --internal Restrict external access to the network --ip-range strings Allocate container ip from a sub-range --ipam-driver string IP Address Management Driver (default "default") --ipam-opt map Set IPAM driver specific options (default map[]) --ipv6 Enable IPv6 networking --label list Set metadata on a network -o, --opt map Set driver specific options (default map[]) --scope string Control the network's scope --subnet strings Subnet in CIDR format that represents a network segment
Идем дальше.
Подключить/Отключить контейнер(ы) к/от сети в Docker
Чтобы законектить контейнер к сети, нужно выполнить следующую команду:
$ docker network connect YOUR_NETWORK YOUR_CONTAINER
Где:
- YOUR_NETWORK — Сеть.
- YOUR_CONTAINER — Контейнер.
Для отключения служит обратная команда:
$ docker network disconnect YOUR_NETWORK YOUR_CONTAINER
Где:
- YOUR_NETWORK — Сеть.
- YOUR_CONTAINER — Контейнер.
Идем далее.
Инспектор Network в Docker
Можно получить подробную информацию о той или иной сети, например:
$ docker network inspect bridge-network [ { "Name": "bridge-network", "Id": "c8668b3fc7f6ac9d8694a34d225327f9abb1d195c9757966919ed4adf9b35cea", "Created": "2018-10-19T08:24:28.511405837Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": {}, "Labels": {} } ]
Довольно много полезной информации можно получить из данной команды.
Так же, можно получить инфу со следующей команды:
$ docker info
Или если есть необходимость в форматировании и выводе нужных полей, то можно заюзать следующий формат:
$ docker info --format 'table {{.Plugins.Volume}} {{.Plugins.Network}}' table [local] [bridge host ipvlan macvlan null overlay]
Удаление Network в Docker
Для удаления сети, используйте:
$ docker network rm YOUR_NETWORK
Или если нужно удалить все созданные сети которые не используются вами:
$ yes|docker network prune
Если появится хороший материал, обязательно добавлю в данную статью. Вот и все, тема «Работа с сетью (Networking) в Docker» подошла к завершению.