Докер на CentOS с мостом к локальной сети
У меня есть VLAN сервера 10.101.10.0/24, а мой хост Docker - 10.101.10.31. Как настроить мостовую сеть на моем узле Docker (ВМ), чтобы все контейнеры могли подключаться напрямую к сети LAN без необходимости перенаправлять порты по умолчанию 172.17.0.0/16? Я попытался выполнить поиск, но все инструкции, которые я нашел до сих пор, привели к потере сеанса SSH, который мне пришлось перенести в виртуальную машину с консоли, чтобы отменить шаги, которые я делал.
1 ответ
Есть несколько способов сделать это. Два из них, с которыми я добился наибольшего успеха, это маршрутизация подсети на док-мост и использование собственного моста в локальной сети хоста.
Docker Bridge, маршрутизируемая сеть
Преимущество этого состоит в том, что для настройки докера нужны только собственные инструменты докера. Недостатком является необходимость добавления маршрута к вашей сети, который находится вне пределов ответственности докеров и обычно является ручным (или полагается на "сетевого парня").
Включить переадресацию IP
/etc/sysctl.conf: net.ipv4.ip_forward = 1 sysctl -p /etc/sysctl.conf
Создайте док-мост с новой подсетью в вашей сети виртуальных машин, скажем,
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 в сети или Calico, который заботится о маршрутизации, то это самое чистое решение.
Пользовательский мост, существующая сеть (и интерфейс)
Преимущество этого заключается в том, что не требуется никакой настройки внешней сети. Недостатком является более сложная настройка на хосте докера. Основной интерфейс требует этот мост во время загрузки, поэтому он не является родным docker network
настроить. Трубопровод или ручная настройка контейнера не требуется.
Использование виртуальной машины может сделать это немного сложнее, так как вы запускаете дополнительные интерфейсы с дополнительными MAC-адресами через интерфейс основной виртуальной машины, которым сначала потребуется дополнительная конфигурация "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
конфиг ipip 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/24@10.101.10.Y
Или используйте DHCP-клиента внутри контейнера
pipework shared1 $CONTAINERID dhclient
Docker Macvlan Network
С тех пор Docker добавил сетевой драйвер macvlan
это может привести к тому, что контейнер будет напрямую подключен к физической сети, в которой находится хост. Контейнер прикреплен к parent
интерфейс на хосте.
docker network create -d macvlan \
--subnet=10.101.10.0/24 \
--gateway=10.101.10.1 \
-o parent=eth0 pub_net
Это будет страдать от тех же проблем с виртуальным / программным переключателем, когда сеть и интерфейс должны быть разрозненными в отношении mac-адресов.