Докер на CentOS с мостом в сеть LAN

У меня есть VLAN сервера 10.101.10.0/24, а мой хост Docker - 10.101.10.31. Как настроить сеть моста на моем хосте Docker (VM), чтобы все контейнеры могли напрямую подключаться к локальной сети LAN, не перенаправляя порты по умолчанию по умолчанию 172.17.0.0/16? Я попытался выполнить поиск, но все howtos, которые я нашел до сих пор, привели к потере сеанса SSH, который мне пришлось переходить в виртуальную машину с консоли, чтобы вернуть те шаги, которые я сделал.

Ответ 1

Существует несколько способов сделать это. Два из них, с которыми я столкнулся, - это маршрутизация подсети на мост докеров и использование настраиваемого моста в локальной сети хоста.

Мост докеров, маршрутизируемая сеть

Это полезно только для использования встроенных инструментов докеров для настройки докеров. У него есть сторона, нуждающаяся в том, чтобы добавить маршрут к вашей сети, который находится за пределами докеров, и обычно является ручным (или полагается на "сетевого парня" ).

Маршрутизируемая сеть

  • Включить переадресацию IP-адресов

    /etc/sysctl.conf: net.ipv4.ip_forward = 1
    sysctl -p /etc/sysctl.conf
    

    Создайте мост-докер с новой подсетью в вашей сети VM, скажем 10.101.11.0/24

    docker network create routed0 --subnet 10.101.11.0/24
    
  • Расскажите остальной сети, что 10.101.11.0/24 должен быть перенаправлен через 10.101.10.X, где X - IP вашего хост-докера. Это конфигурация внешнего маршрутизатора/шлюза/ "сетевого парня". На шлюзе linux вы можете добавить маршрут с помощью:

    ip route add 10.101.11.0/24 via 10.101.10.31
    
  • Создайте контейнеры на мосту с адресами 10.101.11.0/24.

    docker run --net routed0 busybox ping 10.101.10.31
    docker run --net routed0 busybox ping 8.8.8.8
    

Тогда сделай. Контейнеры имеют маршрутизируемые IP-адреса. Если вы согласны с сетевой стороной или запускаете что-то вроде RIP/OSPF, который заботится о маршрутизации, то это самое чистое решение.

Пользовательский мост, существующая сеть (и интерфейс)

Это может не потребовать установки внешней сети. Недостатком является то, что настройка на хосте docker сложнее. Основной интерфейс требует этого моста во время загрузки, поэтому он не является нативной установкой docker network. Pipework или требуется ручная настройка контейнера.

Общий мост

Использование виртуальной машины может сделать это немного сложнее, поскольку вы используете дополнительные интерфейсы с дополнительными MAC-адресами по основному интерфейсу VM, который нуждается в дополнительном "Promiscuous" сначала настройте конфигурацию, чтобы это могло работать.

Постоянная сетевая конфигурация для мостовых интерфейсов зависит от дистрибутива. Следующие команды описывают, как настроить интерфейс и исчезнуть после перезагрузки. Вам понадобится консольный доступ или отдельный маршрут в вашу виртуальную машину при изменении конфигурации основного сетевого интерфейса.

  • Создайте мост на хосте.

    ip link add name shared0 type bridge
    ip link set shared0 up
    

    В /etc/sysconfig/network-scripts/ifcfg-br0

    DEVICE=shared0
    TYPE=Bridge
    BOOTPROTO=static
    DNS1=8.8.8.8
    GATEWAY=10.101.10.1
    IPADDR=10.101.10.31
    NETMASK=255.255.255.0
    ONBOOT=yes
    
  • Прикрепите основной интерфейс к мосту, обычно eth0

    ip link set eth0 up
    ip link set eth0 master shared0
    

    В /etc/sysconfig/network-scripts/ifcfg-eth0

    DEVICE=eth0
    ONBOOT=yes
    TYPE=Ethernet
    IPV6INIT=no
    USERCTL=no
    BRIDGE=shared0
    
  • Переконфигурируйте свой мост, чтобы иметь eth0 ip config.

    ip addr add dev shared0 10.101.10.31/24
    ip route add default via 10.101.10.1
    
  • Прикрепите контейнеры к мосту с адресами 10.101.10.0/24.

    CONTAINERID=$(docker run -d --net=none busybox sleep 600)
    pipework shared1 $CONTAINERID 10.101.10.43/[email protected]
    

    Или используйте клиент DHCP внутри контейнера

    pipework shared1 $CONTAINERID dhclient