Работа с сетью (Networking) в Docker

Thank you for reading this post, don't forget to subscribe!

Сете­вая 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

[codesyntax lang="php" blockstate="collapsed"]

[/codesyntax]

Доволь­но мно­го полез­ной инфор­ма­ции мож­но полу­чить из дан­ной команды.

Так же, мож­но полу­чить инфу со сле­ду­ю­щей команды:

$·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