настройка сети docker bridge

Я хочу, чтобы мой docker0 и все контейнеры имели один и тот же адрес шлюза или находились в том же диапазоне IP-адресов, что и моя локальная машина. Я начал с определения фиксированного cidr в файле daemon.json /etc/docker/daemon.json

{
  "bip": "10.80.44.248/24",
  "fixed-cidr": "10.80.44.250/25",
  "mtu": 1500,
  "default-gateway": "10.80.44.254",
  "dns": ["10.80.41.14"]
}

Кажется, он работает, глядя на вывод ip -a. Похоже, что с тех пор docker0 никогда не получал никаких данных.

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet *10.80.44.248*  netmask 255.255.255.0  broadcast *10.80.44.255*
        ether 02:42:9c:b9:e1:63  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet *10.80.44.39*  netmask 255.255.255.0  broadcast *10.80.44.255*
        inet6 fe80::250:56ff:feb1:79e4  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:b1:79:e4  txqueuelen 1000  (Ethernet)
        RX packets 211061  bytes 30426474 (29.0 MiB)
        RX errors 0  dropped 33861  overruns 0  frame 0
        TX packets 3032  bytes 260143 (254.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Локальный компьютер и docker0 находятся в одном диапазоне IP-адресов с одним и тем же шлюзом. Хорошо. Но когда я запускал контейнеры докеров и проверял настройки моста, все было по-другому. Это результат

docker network inspect bridge


[
    {
        "Name": "bridge",
        "Id": "b326a37a589245449e1268bbb9ee65262eb7986574c0e972c56d350aa82d7238",
        "Created": "2018-04-04T03:25:52.00544539+02:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.80.44.248/24",
                    "IPRange": "10.80.44.128/25",
                    "Gateway": "10.80.44.248",
                    "AuxiliaryAddresses": {
                        "DefaultGatewayIPv4": "10.80.44.254"
                    }
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

Я не понимаю, почему теперь в конфигурации IPAM есть вспомогательный IPv4

"AuxiliaryAddresses": { "DefaultGatewayIPv4": "10.80.44.254" }

Я понял, что теперь мост создается не из той же подсети, как это было настроено daemon. Я создал 2 разных моста с разными диапазонами IP. Это по-прежнему значение по умолчанию для докера.

докер сеть ls

NETWORK ID          NAME                   DRIVER              SCOPE
b326a37a5892        bridge                 bridge              local
6ce11066cdea        dockergitlab_default   bridge              local
d5a36c04b809        host                   host                local
15f66b88ee67        none                   null                local

проверка сети докеров dockergitlab_default

[
    {
        "Name": "dockergitlab_default",
        "Id": "6ce11066cdeabf3cfe65b2dff22046bd1e9c18d2588f47b9cd3c52ea24f7a636",
        "Created": "2018-03-14T08:56:23.351051727+01:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "60f769c91cff1de47794a7c8b587b778488883da094ae32cfde5196ee0f528f1": {
                "Name": "gitlab-runner",
                "EndpointID": "5122fe862537fb8434a484b4797153274b945e20bc3c7223efc6fd0bd55eae14",
                "MacAddress": "02:42:ac:11:00:04",
                "IPv4Address": "172.17.0.4/16",
                "IPv6Address": ""
            },
            "9c46e1fde6390142bddf67270cfeda7b3e68b1a6e68cabc334046db687240a8d": {
                "Name": "dockergitlab_postgresql_1",
                "EndpointID": "8488b32cc34a2c92308528de74b5eddcecac12a402ee6e67c1ef0f2750b72721",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "eaf29f5f405cbf9bdd918efad26ceae1a8c3f58f4bef0aa8fd86b4631bcfdf43": {
                "Name": "dockergitlab_gitlab_1",
                "EndpointID": "d7f78ee9bd51dd13826d7834470d03a9084fc7ab8c6567c0181acecc221628c6",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "f460687ec00eff214fa08adfe9a0af5b85c392ceb470c4ed630ef7ecb0bfcba1": {
                "Name": "dockergitlab_redis_1",
                "EndpointID": "8b18906f1c79a5faaadd32afdef20473f9b635e9a1cd2c7108dd98df48eaed86",
                "MacAddress": "02:42:ac:11:00:05",
                "IPv4Address": "172.17.0.5/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "default",
            "com.docker.compose.project": "dockergitlab"
        }
    }
]

Я понятия не имею, почему мост докеров теперь создается со старым IP-адресом по умолчанию.

ЛОКАЛЬНАЯ СИСТЕМА Детали

Я могу сделать apt update на локальной машине, но когда я вошел в gitlab-runner, я не могу сделать apt update

Linux  4.9.0-6-amd64 #1 SMP Debian 4.9.82-1+deb9u3 (2018-03-02) x86_64

Docker version 17.12.0-ce, build c97c6d6

docker-compose version 1.18.0, build 8dd22a9

Есть ли способ изменить настройки моста. Из того, что я прочитал, когда я определяю/настраиваю cdir и шлюз в файле daemon.json, все будет взято оттуда для создания мостовой сети и всех других контейнеров.

Заранее спасибо за вашу помощь.


person Seek Addo    schedule 04.04.2018    source источник


Ответы (1)


Прежде всего, вы правильно настроили мост docker0, и запуск контейнеров с помощью простой команды docker run должен подключить их к мосту и дать им IP-адреса в 10.80.44.250/25.

Из того, что вы вставили, я предполагаю, что вы используете docker-compose для запуска своих контейнеров.

docker-compose создаст сеть myproject_default для каждого docker-compose.yml, если вы ничего не укажете.

Сегодня вы не можете выбрать, в каком пуле будут выбраны диапазоны IP, по умолчанию это 172.[17-31].0.0/16. В настоящее время существует активный запрос на вытягивание, позволяющий переопределить это поведение: https://github.com/moby/moby/pull/36396.

Если вы хотите вручную указать диапазон IP-адресов в своем docker-compose.yml, вы можете написать это:

networks:
  default:
    ipam:
      config:
        - subnet: 10.80.44.250/25

Изменить: это совместимо только с синтаксисом docker-compose>=3.0.

person hugoShaka    schedule 04.04.2018
comment
аааа спасибо. Ты прав. вот почему вещи не работают. Я попытаюсь сделать это вручную в моих файлах конфигурации компоновки. Должен ли я по-прежнему сохранять конфигурацию docker0? - person Seek Addo; 04.04.2018
comment
Я получаю неподдерживаемые параметры конфигурации, когда добавляю эти сетевые параметры в свой файл docker-compose.yml. какие-нибудь советы. Я использую формат файла «2.2» для создания докеров. Спасибо - person Seek Addo; 04.04.2018
comment
Я исправил это сейчас. Я все еще получаю перекрывающийся IPv4-адрес с docker0. Любые идеи? - person Seek Addo; 04.04.2018
comment
Да, подсети не должны перекрываться, поэтому вам придется выбрать два разных диапазона для docker0 и вашей сети для создания докеров. Так что здесь вы можете использовать два последовательных /26 вместо вашего /25: один для docker0 и один для dockergitlab_default. - person hugoShaka; 04.04.2018
comment
Спасибо чувак. Я попробую. Проблема в том, что контейнер докеров должен иметь один и тот же шлюз по умолчанию, шлюз по умолчанию: 10.80.44.254, и если разные подсети для каждого, я не думаю, что это будет возможно. - person Seek Addo; 04.04.2018
comment
Если вы хотите, чтобы контейнеры, которые вы запускаете вручную, запускались в той же сети, что и в вашем docker-compose, вы можете указать сеть с помощью --net dockergitlab_default. - person hugoShaka; 04.04.2018
comment
Я не понимаю, что вы имеете в виду. Да, мне нравится, когда контейнеры находятся в той же подсети, что и docker0, и имеют один и тот же шлюз по умолчанию: 10.80.44.254. Должен ли я указать эту опцию на docker-compose up -d - person Seek Addo; 04.04.2018
comment
Я предлагал запустить контейнеры в сети docker-compose и подключить к этой сети простые docker run контейнеры. Если вы запускаете контейнеры docker-compose в мосте по умолчанию (docker0), вы потеряете автоматическое разрешение DNS между контейнерами (то, что вы получили, когда использовали links в docker-compose.yml). Вы можете проверить документы здесь: docs.docker.com/network/bridge - person hugoShaka; 04.04.2018
comment
Да, контейнеры, подключенные к мосту по умолчанию, взаимодействуют с использованием IP-адреса, верно? Я просто хочу убедиться, что шлюз 10.80.44.254, чтобы мой gitlab-runner мог выполнять sudo apt update. Я еще не до конца понимаю ваше решение. Что вы имеете в виду, планируя докер-контейнеры? У меня есть четыре контейнера в compose.yml. Должен ли я запустить их в мосте по умолчанию, а затем подключить их к Docker0? Есть ли способ, чтобы docker0 и по умолчанию имели один и тот же адрес шлюза? Спасибо. Я попытался сделать это вручную, но получил конфликты. - person Seek Addo; 04.04.2018
comment
Я имел в виду, хотите ли вы запускать контейнеры вне docker-compose.yml. Если вы хотите использовать только docker-compose, просто разделите свой пул на два (docker0 и dockercompose_default) и не обращайте внимания на то, что я сказал ранее: он просто будет работать, и вам не нужно ничего делать с интерфейсом docker0. - person hugoShaka; 04.04.2018
comment
Давайте продолжим обсуждение в чате. - person hugoShaka; 04.04.2018