# Сеть (networking)

Docker поставляется со следующими сетевыми драйверами в рамках библиотеки libnetwork:

- single-host bridge networks (bridge)
- multi-host overlays (overlay)
- options for plugging into existing VLANs (macvlan)

Для тестов нужно установить

```
apt-get install bridge-utils
```

Docker регистрирует DNS сервис в пределах бриджа. Но в сети по умолчанию (docker0) DNS сервиса нет.

<table border="1" id="bkmrk-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0-%D0%9F%D0%B0%D1%80" style="border-collapse: collapse; width: 100%; height: 353.953px;"><colgroup><col style="width: 26.4601%;"></col><col style="width: 73.5399%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="align-center" style="height: 29.7969px;">Команда</td><td class="align-center" style="height: 29.7969px;">Описание</td></tr></thead><tbody><tr style="height: 31.625px;"><td style="height: 31.625px;">brctl show</td><td style="height: 31.625px;">Список бриджей.

```
sudo brctl show
bridge name     bridge id               STP enabled     interfaces
br-62694f46296d         8000.7ee73b5c2894       no
br-8af5ede4ffdc         8000.aee56ab6b984       no
br-96dd8dcd216d         8000.5a64a8825202       no
docker0         8000.f220300c62b1       no
```

</td></tr></tbody></table>

Также есть опция поиска сервисов и балансировка входной нагрузки.

<table border="1" id="bkmrk-%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B0%D1%8F-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0-%D0%9F%D0%B0%D1%80-1" style="border-collapse: collapse; width: 100%; height: 298.391px;"><colgroup><col style="width: 22.0479%;"></col><col style="width: 16.8078%;"></col><col style="width: 61.1442%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="align-center" style="height: 29.7969px;">Основная команда</td><td class="align-center" style="height: 29.7969px;">Параметр</td><td class="align-center" style="height: 29.7969px;">Описание</td></tr></thead><tbody><tr style="height: 31.625px;"><td style="height: 31.625px;">docker network </td><td style="height: 31.625px;">ls</td><td style="height: 31.625px;">Список сетей</td></tr><tr style="height: 34.7969px;"><td style="height: 34.7969px;">docker inspect ИмяСети</td><td style="height: 34.7969px;"> </td><td style="height: 34.7969px;">Выводит информацию по указанной сети. bridge - сеть по умолчанию.</td></tr><tr style="height: 82.9844px;"><td style="height: 82.9844px;">docker network create </td><td style="height: 82.9844px;">-d драйвер </td><td style="height: 82.9844px;"> Создает сеть

```
docker network create -d bridge localnet
```

</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;"> </td><td style="height: 29.7969px;"> название сети</td><td style="height: 29.7969px;"> </td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;"> docker port ContName</td><td style="height: 29.7969px;"> </td><td style="height: 29.7969px;">Выводит map портов внутрь контейнера </td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">docker network prune</td><td style="height: 29.7969px;"> </td><td style="height: 29.7969px;">Удаляет неиспользуемые сети</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">docker network rm</td><td style="height: 29.7969px;">Название сети</td><td style="height: 29.7969px;">Удаляет конкретную сеть</td></tr></tbody></table>

**Single-host bridge networks**

Создается интерфейс на хосте docker.

[![docker_networks_0.JPG](http://bobrobotirk.ru/uploads/images/gallery/2025-03/scaled-1680-/docker-networks-0.JPG)](http://bobrobotirk.ru/uploads/images/gallery/2025-03/docker-networks-0.JPG)

Один порт может занимать только один контейнер. Взаимодействие контейнеров внутри хоста.

**Multi-host overlay networks**

Для взаимодействия контейнеров внутри виртуальной сети нескольких хостов. Могут быть расположены на разных нодах swarm. Сеть второго уровня, распределяющаяся по нужным нодам с dns сервисом и распределением нагрузки.

**Plugging into existing VLANs**

Для прямого подключения к сетевому интерфейсу соответственно с независимым адресом. Необходим promiscuous mode на интерфейсе хоста (неразборчивый режим).

ipvlan с возможностью независимого адреса в пределах диапазона сетевой карты хоста заработал

```
services:
  condb:
    image: nginx
    networks:
      my_ipvlan:
        ipv4_address: 192.168.1.40

networks:
  my_ipvlan:
    driver: ipvlan
    driver_opts:
      parent: enp0s3
      ipvlan_mode: l2
    ipam:
      config:
        - subnet: 192.168.1.0/24
          gateway: 192.168.1.1

```

macvlan напрямую не заработал. Из интернетов:

```
sudo ip link add mymacvlan link enp0s3 type macvlan mode bridge
sudo ip addr add 192.168.1.99/24 dev mymacvlan
sudo ip link set mymacvlan up
```

**Docker и firewall**

Тут у меня началась веселуха. Первая проблема в том, что в литературе по докеру сетевая подсистема описана слабо, и не говорится самого главного: один хрен ip/nf tables (для определенности далее будем использовать iptables, помня обо всех нюансах). Docker самостоятельно управляет записями в iptables, за счет них организуется сетевая подсистема. Поэтому

1. Все службы вне докера управляются цепочкой INPUT
2. Службы докера, транслируемые наружу (ports в compose файле) по умолчанию попадают в цепочку FORWARD, которая сначала отдает пакеты в цепочку DOCKER-USER, затем в DOCKER-FORWARD и далее блокируется

Цепочка DOCKER-USER служит для пользовательского управления пакетами. Автоматически самим Docker не изменяется. Поэтому в ней можно блокировать например внешние запросы к внутренним сервисам, оставляя доступ для определенных адресов.