Как работает настройка docker `net = host` и как я могу сделать что-то подобное, например. VirtualBox?

У Docker есть опция запуска net=host описанная здесь, которая позволяет запускать виртуальную машину, которая разделяет сетевой стек с хостом - например, процессы внутри контейнера докера могут подключаться к главной машине через localhost и наоборот.

Я хочу настроить виртуальную машину Linux на Mac OS X, которая делает то же самое; Я пробовал использовать Vagrant и его различные сетевые настройки без большой удачи.

Поддерживает ли Docker VM хост и гостевые ОС как Linux, или есть какой-то способ выполнить этот OSX- > Linux, который мне не хватает?

Ответы

Ответ 1

Благодаря некоторой помощи моих коллег я нашел решение этой проблемы. Это решение работает с boot2docker/VirtualBox. Я только что создал свою докерную виртуальную машину с помощью boot2docker init, я не вносил никаких конкретных изменений в конфигурацию виртуальной машины.

Сначала вы запускаете изображение докеров с помощью --net=host, чтобы он делился сетью с виртуальной машиной хоста, например.

docker run -it --net=host ubuntu bash

Затем вам нужно найти IP-адрес из виртуальной машины, используемой для контейнеров докеров, вы можете сделать это, запустив boot2docker ssh хост OSX. Затем вы можете найти IP-адрес виртуальной машины, найдя ее шлюз:

$ netstat -rn | grep UG | awk '{print $2}'
10.0.2.2

Итак, в моем случае это 10.0.2.2. Теперь вы можете получить доступ к портам, открытым на хосте, то есть в программе, запущенной на OSX, из вашего контейнера докеров, используя этот IP-адрес.

Для автоматизации вы можете сначала найти IP-адрес, а затем передать его в команду docker как переменную среды...

Ответ 2

Я нашел другой ответ, который работает, я поделюсь этим, чтобы люди могли выбирать:)

Сначала вам нужно выяснить, какой IP-адрес предпочтительного сетевого интерфейса находится на вашем хосте OSX. Следующая команда оболочки сделала это для меня:

echo "show State:/Network/Global/IPv4" | scutil | grep PrimaryInterface | awk '{print $3}' | xargs ifconfig | grep inet | grep -v inet6 | awk '{print $2}'

В моем случае это печатает: 10.226.98.247

Затем вы можете просто использовать этот адрес внутри докера или даже лучше указать этому адресу имя хоста для внутренней докеры:

docker run -it --add-host dockerhost:10.226.98.247 ubuntu bash

Затем вы можете использовать то же самое имя dockerhost в контейнере докера, независимо от того, в какой среде вы запускаете свой контейнер в...