Как работает настройка 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
в контейнере докера, независимо от того, в какой среде вы запускаете свой контейнер в...