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

Работа с сетью (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» подошла к завершению.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.