docker-compose macvlan не может получить доступ к Интернету

Я запускаю рабочий стол ubuntu в виртуальном ящике (мой хост - mac), и внутри этой виртуальной машины я экспериментирую с macvlan сетевым драйвером docker с docker-compose.

Вот мой docker-compose.yml файл:

version: '3.7'
services:
  trader:
    build: ./
    image: giuliotrader
    container_name: giuliotrader
    networks: 
      trading:
        ipv4_address: 172.16.86.33
    depends_on: 
      - tws  

  tws:
    build: ./ib-docker
    image: ibconnect
    container_name: ibconnect
    ports:
      - "4001:4001"
      - "4003:4003"
      - "5901:5901"
    volumes:
      - ./ib-docker/config.ini:/root/ibc/config.ini
      - ./ib-docker/gatewaystart.sh:/opt/ibc/gatewaystart.sh
    networks: 
      trading:
        ipv4_address: 172.16.86.22

networks: 
  trading: 
    driver: macvlan
    driver_opts:
      parent: enp0s3.10
    ipam:
      config:
        - subnet: 172.16.86.0/24
          #gateway: 172.16.86.1

У меня проблемы с этими двумя контейнерами для доступа в Интернет.

Я могу получить доступ к машинам через docker exec -it ibconnect /bin/bash, но они не могут получить доступ к сети, если я apt-get install iputils-ping получу:

   Temporary failure resolving 'archive.ubuntu.com'

и если я nc -l 5047 на одном контейнере и nc 172.16.86.22 5047 на другом, я получаю Connection refused.

Если я раскомментирую последнюю строку (gateway), docker-compose сообщает об ошибке:

ERROR: The Compose file './docker-compose.yml' is invalid because:
networks.trading.ipam.config value Additional properties are not allowed ('gateway' was unexpected), 

Я не уверен, что мне не хватает в конфигурации для настройки шлюза. Как я могу правильно настроить сеть в этой настройке? Я не нашел достойной документации.

Спасибо,


person Don Giulio    schedule 02.04.2019    source источник
comment
Есть ли веская причина для такой настройки сети? обычно контейнеры работают в сети докеров, и на этом уровне нет необходимости вмешиваться в это.   -  person Mihai    schedule 02.04.2019
comment
У меня странное поведение на сервере IBGateway, который работает в контейнере ibconnect, которого у меня нет, когда он работает в обычном контейнере, а клиент прямо на хосте, поэтому я предполагаю, что проблема может зависеть от докера bridge и я пытаюсь получить для двух контейнеров MAC-адрес и правильное использование интерфейсов eth   -  person Don Giulio    schedule 02.04.2019
comment
github.com/blampe/IbPy/issues/57 Я кратко изложил проблему здесь, но это репо кажется необслуживаемым   -  person Don Giulio    schedule 02.04.2019
comment
Правильный вопрос, применимый ко всем macvlan через кейсы docker-compose. Нет ответов =) Я выложу здесь, когда найду решение.   -  person Maxim V. Pavlov    schedule 01.10.2019


Ответы (2)


Я столкнулся с той же проблемой с MacBook Pro. Причина, вероятно, в том, что macvlan подчиненные интерфейсы были заблокированы беспроводным интерфейсом. Когда я подключаю кабель LAN к компьютеру и меняю сетевой адаптер виртуальной машины с en0: WiFi на enX: USB 10/100/1000 LAN, все начинает работать должным образом.

Другое решение - использовать ipvlan вместо macvlan.

Моя настройка:

  • G: 172.16.1.1/16 - Шлюз (физический)
  • M: 172.16.1.20/16 - Macbook Pro, [en0: Wi-Fi (физический), en7: LAN (физический)]
  • V: 172.16.1.180/16 - Virtualbox + Ubuntu Server 20.04 [enp0s3 (Виртуальный)]
  • C1: 172.16.180.53/16 - Контейнер Docker в home_macvlan
  • C2: 172.16.180.80/16 - Контейнер Docker в home_macvlan

Что НЕ работает

1- Установите сетевой адаптер виртуальной машины en0:WiFi как Bridged Adapter, создайте macvlan с помощью докера в V

Статус:
M ‹-› V [OK]
C1 ‹-› C2 [OK]
V ‹-› C1 [NOK] (как и ожидалось)
M ‹-› C1 [NOK] (проблема)
C1 ‹-› G [NOK] (проблема)

Что работает

1- Использование ipvlan вместо macvlan

  • Установите сетевой адаптер виртуальной машины en0:WiFi как Bridged Adapter
  • создать ipvlan с помощью докера в V

Команда, которую я запускаю для создания ipvlan:

docker network create -d ipvlan \
  --subnet 172.16.0.0/16 \
  -o ipvlan_mode=l2 -o parent=enp0s3 home_ipvlan

А затем запустите контейнер Docker:

docker run \
  --net=home_ipvlan \
  --ip=172.16.180.53 \
  --name=C1
  <image name>

2- Использование macvlan на интерфейсе не 802.11

  • Установите для сетевого адаптера виртуальной машины enX: USB 10/100/1000 LAN (или другого интерфейса, отличного от 802.11) значение Bridged Adapter
  • В расширенном разделе выберите PCnet-Fast III (Am79C973) в качестве типа адаптера.
  • В расширенном разделе установите для режима подсказки значение Разрешить все.

Команда для создания macvlan

docker network create -d macvlan \
  --subnet 172.16.0.0/16 \
  --ip-range 172.16.180.0/24 \
  --gateway 172.16.1.1 \
  -o parent=enp0s3 home_macvlan

Команда для запуска контейнера:

docker run \
  --net=home_macvlan \
  --ip=172.16.180.53 \
  --name=C1
  <image name>

Связанный ответ: https://stackoverflow.com/a/56918457/860189
Дополнительная информация: https://hicu.be/macvlan-vs-ipvlan

person Tolga Okur    schedule 07.04.2021

networks:
bridge:
     driver: macvlan
     driver_opts:
         com.docker.network.enable_ipv4: "true"
         parent: mac0
     ipam:
         config:
             - subnet: xxx.xxx.xxx.xxx/xx
               ip-range: xxx.xxx.xxx.xxx/xx
               gateway: xxx.xxx.xxx.xxx

В доке-хосте

ip link add mac0 link vmbr0 type macvlan mode bridge
person user3081809    schedule 05.10.2019