- Networking using a macvlan network
- Prerequisites
- Bridge example
- 802.1q trunked bridge example
- Other networking tutorials
- Сеть Docker Macvlan, не может получить доступ к Интернету
- 1 ответ
- Маршрутизация подсети к мостовой сети.
- docker swarm проблемы с сетью macvlan
- Что работает — локальный macvlan
- Что не работает — swarm macvlan
- Файлы, использованные в примере
- Можно ли запустить один контейнер со статическим IP-адресом macvlan в режиме роя?
- 1 ответ
- Метод
- Полученные результаты
- Предостережение (ошибка Swarm macvlan?)
- Вывод
- Docker Macvlan network inside container is not reaching to its own host
- Host Setup: HOST_1 ens192: 172.18.0.21
- Host Setup: HOST_2 ens192: 172.18.0.23
- Container Setup
- Scenario
- Question
- 3 Answers 3
- Сеть Docker macvlan, не удается получить доступ к интернету
- 1 ответов
- маршрутизация подсети к мосту сеть.
Networking using a macvlan network
Estimated reading time: 5 minutes
This series of tutorials deals with networking standalone containers which connect to macvlan networks. In this type of network, the Docker host accepts requests for multiple MAC addresses at its IP address, and routes those requests to the appropriate container. For other networking topics, see the overview.
The goal of these tutorials is to set up a bridged macvlan network and attach a container to it, then set up an 802.1q trunked macvlan network and attach a container to it.
Prerequisites
Most cloud providers block macvlan networking. You may need physical access to your networking equipment.
The macvlan networking driver only works on Linux hosts, and is not supported on Docker Desktop for Mac, Docker Desktop for Windows, or Docker EE for Windows Server.
You need at least version 3.9 of the Linux kernel, and version 4.0 or higher is recommended.
The examples assume your ethernet interface is eth0 . If your device has a different name, use that instead.
Bridge example
In the simple bridge example, your traffic flows through eth0 and Docker routes traffic to your container using its MAC address. To network devices on your network, your container appears to be physically attached to the network.
Create a macvlan network called my-macvlan-net . Modify the subnet , gateway , and parent values to values that make sense in your environment.
You can use docker network ls and docker network inspect my-macvlan-net commands to verify that the network exists and is a macvlan network.
Start an alpine container and attach it to the my-macvlan-net network. The -dit flags start the container in the background but allow you to attach to it. The —rm flag means the container is removed when it is stopped.
Inspect the my-macvlan-alpine container and notice the MacAddress key within the Networks key:
Check out how the container sees its own network interfaces by running a couple of docker exec commands.
Stop the container (Docker removes it because of the —rm flag), and remove the network.
802.1q trunked bridge example
In the 802.1q trunked bridge example, your traffic flows through a sub-interface of eth0 (called eth0.10 ) and Docker routes traffic to your container using its MAC address. To network devices on your network, your container appears to be physically attached to the network.
Create a macvlan network called my-8021q-macvlan-net . Modify the subnet , gateway , and parent values to values that make sense in your environment.
You can use docker network ls and docker network inspect my-8021q-macvlan-net commands to verify that the network exists, is a macvlan network, and has parent eth0.10 . You can use ip addr show on the Docker host to verify that the interface eth0.10 exists and has a separate IP address
Start an alpine container and attach it to the my-8021q-macvlan-net network. The -dit flags start the container in the background but allow you to attach to it. The —rm flag means the container is removed when it is stopped.
Inspect the my-second-macvlan-alpine container and notice the MacAddress key within the Networks key:
Check out how the container sees its own network interfaces by running a couple of docker exec commands.
Stop the container (Docker removes it because of the —rm flag), and remove the network.
Other networking tutorials
Now that you have completed the networking tutorial for macvlan networks, you might want to run through these other networking tutorials:
Источник
Сеть Docker Macvlan, не может получить доступ к Интернету
У меня есть выделенный сервер с несколькими IP-адресами, у некоторых IP-адресов есть связанный MAC-адрес, а у других (в подсети) нет MAC-адресов. Я создал Docker Macvlan Network с помощью:
У меня есть ip: 88.99.102.115 с Mac: 00:50:56:00:60:42. Создал контейнер используя:
Это работает, я могу получить доступ к nginx, размещенному по этому IP-адресу извне.
Случай с IP, у которого нет mac-адреса, а шлюз находится вне подсети.
подсеть: 88.99.114.16/28, шлюз: 88.99.102.103
Невозможно создать сеть, используя:
Попытка увеличения области подсети для включения шлюза:
Сеть создана, затем запущен контейнер nginx с использованием mynetwork, и у меня нет mac-адреса для 88.99.114.18, поэтому я использовал какой-то случайный mac-адрес 40:1c:0f:bd:a1:d2.
Не удается связаться с nginx(88.99.102.115).
- Как создать докерскую сеть macvlan, если мой шлюз находится вне моей подсети?
- Как запустить контейнер с использованием сети Macvlan, если у меня есть только IP-адрес, но нет MAC-адреса?
Я не очень разбираюсь в сетях, это будет очень полезно, если вы объясните подробно.
Мой файл /etc/network/interfaces:
1 ответ
Как создать докерскую сеть macvlan, если мой шлюз находится вне моей подсети?
Адрес шлюза должен находиться в той же подсети, что и интерфейс. Для использования этой новой подсети вам потребуется использовать один из IP-адресов и назначить его где-нибудь на хосте в качестве шлюза.
Маршрутизация подсети к мостовой сети.
На снимке экрана хостинга подсеть 88.99.114.16/28 настроена для маршрутизации через ваш хост 88.99.102.103. Вам нужно создать интерфейс где-нибудь на вашем хосте для использования в качестве шлюза, если вы хотите, чтобы Docker использовал остальные IP-адреса в подсети.
Создайте мостовую сеть для использования Docker, мосту будет назначен адрес шлюза 88.99.114.17
Вам также может понадобиться включить переадресацию IP для работы маршрутизации. Настройте пересылку IP в /etc/sysctl.conf :
и применить новые настройки
Затем запустите контейнер на новом мосту, и ваша маршрутизируемая сеть должна иметь доступ к шлюзу и Интернету.
Вам может потребоваться разрешить доступ к подсети в iptables, в зависимости от настроек по умолчанию FORWARD политика
Услуги в подсети будут доступны из внешнего мира
Нет необходимости в отображении интерфейса macvlan.
Как запустить контейнер с использованием сети Macvlan, если у меня есть только IP-адрес, но нет MAC-адреса?
macvlan используется для отображения физического / хост-интерфейса в контейнер. Поскольку у вас нет физического интерфейса для этих адресов, будет сложно отобразить его в контейнер.
Источник
docker swarm проблемы с сетью macvlan
Запустите один контейнер haproxy в рое со статическим IP-адресом в моей локальной сети, который будет воссоздан, если узел выйдет из строя. По сути, это было бы похоже на VIP, указывающий на haproxy, но без необходимости внешнего балансировщика нагрузки вне роя.
Что работает — локальный macvlan
Пример: создание сетей macvlan на двух узлах, запуск контейнера на узле node1, остановка контейнера, затем запуск контейнера на узле node2. Контейнер haproxy создается с тем же статическим IP-адресом и доступен в локальной сети.
Что не работает — swarm macvlan
Пример: настройка области сети macvlan на рой, а затем развертывание стека. Контейнер не виден в сети.
Файлы, использованные в примере
Localnet.sh (скрипт для остановки стека / удаления сети / воссоздания сети как локальной / запуска локального контейнера):
Swarmnet.sh (скрипт для удаления контейнера и сети / создания сети как роя / запуска как стека роя):
Можно ли запустить один контейнер со статическим IP-адресом macvlan в режиме роя?
Любая помощь приветствуется.
Изменить: мне удалось заставить работать адреса macvlan, но docker swarm не подчиняется полю ipv4_address для статического состояния контейнера. Я понимаю причину этого (реплики и т. Д. Не находятся на одном IP-адресе), но в этом сценарии этого не произойдет из-за того, что это один контейнер. Я обнаружил, что эта проблема обсуждается здесь: https://forums.docker.com/t/docker-swarm-1-13-static-ips-for-containers/28060/
1 ответ
Я понял, как привязать один статический IP-адрес (с серьезной оговоркой ниже).
Метод
Для этого создайте сеть только для конфигурации на каждом хосте с одним диапазоном IP-адресов (32-битная маска). Я создал здесь сценарий для автоматического создания команд.
Итак, на каждом узле я строю конфигурацию сети
docker network create —config-only —subnet 192.168.0.0/24 —gateway 192.168.0.1 —ip-range 192.168.0.201/32 -o parent = eth0 vip-201
Затем я создаю интерфейс роя
сеть докеров создать -d macvlan —scope swarm —config-from vip-201 swarm-vip-201
И в соответствующем файле docker-compose.yaml добавьте соответствующие строки:
Полученные результаты
Мой контейнер теперь всегда будет доступен по этому единственному статическому IP-адресу. Если узел выходит из строя, он перезапускается на другом узле с тем же IP, по сути создавая высокодоступный VIP для роя.
Предостережение (ошибка Swarm macvlan?)
Docker swarm будет выдавать ошибки при попытке привязать несколько macvlans к одному и тому же родительскому интерфейсу, как показано ниже:
Вывод
Обнадеживает то, что на самом деле можно создать статический IP-адрес macvlan в рое, но до тех пор, пока ошибка не будет исправлена с привязкой нескольких сетей к единственному родительскому интерфейсу, это очень ограничено.
Если кто-нибудь знает, как надежно решить проблему, указанную выше, или у него есть лучший метод, напишите, пожалуйста.
Источник
Docker Macvlan network inside container is not reaching to its own host
I have setup Macvlan network between 2 docker host as follows:
Host Setup: HOST_1 ens192: 172.18.0.21
Create macvlan bridge interface
Create macvlan interface HOST_1
Host Setup: HOST_2 ens192: 172.18.0.23
Create macvlan bridge interface
Create macvlan interface in HOST_2
Container Setup
Create containers in both host
CONTAINER_1 in HOST_1
CONTAINER_2 in HOST_2
Route table in CONTAINER_1 and CONTAINER_2
Scenario
HOST_1 (172.18.0.21) HOST_2 (172.18.0.23) = OK (Vice-versa)
HOST_1 (172.18.0.21) -> CONTAINER_1 (172.18.1.0) and CONTAINER_2 (172.18.1.16) = OK
HOST_2 (172.18.0.23) -> CONTAINER_1 (172.18.1.0) and CONTAINER_2 (172.18.1.16) = OK
CONTAINER_1 (172.18.1.0) -> HOST_2 (172.18.0.23) = OK
CONTAINER_2 (172.18.1.16) -> HOST_1 (172.18.0.21) = OK
CONTAINER_1 (172.18.1.0) CONTAINER_2 (172.18.1.16) = OK (Vice-versa)
CONTAINER_1 (172.18.1.0) -> HOST_1 (172.18.0.21) = FAIL
CONTAINER_2 (172.18.1.16) -> HOST_2 (172.18.0.23) = FAIL
Question
I am very close to my solution I wanted to achieve except this 1 single problem. How can I make this work for container to connect to its own host. If there is solution to this, I would like to know how to configure in ESXi virtualization perspective and also bare-metal if there is any difference
3 Answers 3
This is defined behavior for macvlan and is by design. See Docker Macvlan Documentation
When using macvlan, you cannot ping or communicate with the default namespace IP address. For example, if you create a container and try to ping the Docker host’s eth0, it will not work. That traffic is explicitly filtered by the kernel modules themselves to offer additional provider isolation and security.
A macvlan subinterface can be added to the Docker host, to allow traffic between the Docker host and containers. The IP address needs to be set on this subinterface and removed from the parent address.
The question is «a bit old», however others might find it useful. There is a workaround described in Host access section of USING DOCKER MACVLAN NETWORKS BY LARS KELLOGG-STEDMAN. I can confirm — it’s working.
Host access With a container attached to a macvlan network, you will find that while it can contact other systems on your local network without a problem, the container will not be able to connect to your host (and your host will not be able to connect to your container). This is a limitation of macvlan interfaces: without special support from a network switch, your host is unable to send packets to its own macvlan interfaces.
Fortunately, there is a workaround for this problem: you can create another macvlan interface on your host, and use that to communicate with containers on the macvlan network.
First, I’m going to reserve an address from our network range for use by the host interface by using the —aux-address option to docker network create. That makes our final command line look like:
This will prevent Docker from assigning that address to a container.
Next, we create a new macvlan interface on the host. You can call it whatever you want, but I’m calling this one mynet-shim:
Now we need to configure the interface with the address we reserved and bring it up:
The last thing we need to do is to tell our host to use that interface when communicating with the containers. This is relatively easy because we have restricted our containers to a particular CIDR subset of the local network; we just add a route to that range like this:
With that route in place, your host will automatically use ths mynet-shim interface when communicating with containers on the mynet network.
Note that the interface and routing configuration presented here is not persistent – you will lose if if you were to reboot your host. How to make it persistent is distribution dependent.
Источник
Сеть Docker macvlan, не удается получить доступ к интернету
у меня есть выделенный сервер с несколькими IP-адресами, некоторые IP имеют MAC-адрес, связанный, в то время как другие(в подсети) не имеют mac-адресов. Я создал сеть docker macvlan, используя:
у меня есть ip: 88.99.102.115 с mac: 00:50:56:00:60:42. Создал контейнер с помощью:
это работает, я могу получить доступ к nginx, размещенному на этом ip-адресе извне.
случай с IP, который не имеет mac-адреса и шлюза вне подсети.
подсеть: 88.99.114.16 / 28, шлюз: 88.99.102.103
не удалось создать сеть с помощью:
пытался с увеличением области подсети включить шлюз:
сеть создана, затем запущен контейнер nginx с помощью «mynetwork», и хорошо, что у меня нет mac-адреса для 88.99.114.18, поэтому я использовал случайный mac-адрес 40:1c:0f:bd:a1:d2.
Не могу достичь с nginx(88.99.102.115).
- как создать сеть докеров macvlan, если мой шлюз находится вне моей подсети?
- как запустить контейнер с помощью сети macvlan, когда у меня есть только IP-адрес, но нет mac-адреса?
у меня нет много знаний в области сетей, это будет очень полезно, если вы объясните подробно.
мой файл/etc / network / interfaces:
1 ответов
как создать сеть докеров macvlan, если мой шлюз находится вне моей подсети?
адрес шлюза должен быть в той же подсети, что и интерфейс. Чтобы использовать эту новую подсеть, вам нужно будет использовать один из IP-адресов и назначить его где-то на хосте в качестве шлюза.
маршрутизация подсети к мосту сеть.
на снимке экрана хостинга подсеть 88.99.114.16/28 была настроена на маршрутизацию через ваш хост 88.99.102.103. Вам нужно создать интерфейс где-то на вашем хосте, чтобы использовать его в качестве шлюза, если вы хотите, чтобы Docker использовал остальные IP-адреса в подсети.
создайте мостовую сеть для использования Docker, мосту будет назначен адрес шлюза 88.99.114.17
вам также может потребоваться включить переадресацию IP для маршрутизации. Настройте переадресацию ip в /etc/sysctl.conf :
и применить новую настройку
затем запустите контейнер на Новом мосту с маршрутизируемой сетью, чтобы иметь доступ к шлюзу и интернету
вам может потребоваться разрешить доступ в подсеть в iptables, в зависимости от вашего значения по умолчанию FORWARD политика
услуги в подсети будут доступны из внешнего мира
затем за пределами
нет необходимости в сопоставлении интерфейса macvlan.
как запустить контейнер с помощью сети macvlan, когда у меня есть только IP адрес, но без mac-адреса?
macvlan используется для отображения физического / хост-интерфейса в контейнер. Поскольку у вас нет физического интерфейса для этих адресов, будет трудно отобразить его в контейнер.
Источник